CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2025-8880
8.80.10%

Stream of Chaos: Bypassing the V8 Sandbox with CVE-2025-8880

Amit Schendel
Amit Schendel
Senior Security Researcher

Feb 15, 2026·6 min read·6 visits

Weaponized

Executive Summary (TL;DR)

Critical Race Condition in Chrome's V8 engine involving `ReadableStream` and `SharedArrayBuffer`. Allows remote attackers to bypass the V8 Sandbox and achieve RCE via a crafted HTML page. Patched in Chrome 139.0.7258.127.

A high-severity race condition in Google Chrome's V8 JavaScript engine allows attackers to bypass the V8 Sandbox and execute arbitrary code. By exploiting the interaction between `ReadableStream` consumers and `SharedArrayBuffer`, attackers can corrupt heap memory via a data race, effectively turning a browser tab into a foothold for system compromise. This vulnerability was successfully demonstrated in v8CTF by researcher Seunghyun Lee.

The Hook: When Sharing Is Not Caring

JavaScript is famously single-threaded. It’s the one thing that keeps browser exploit development somewhat sane—you generally know the state of the world when your code executes. But then came SharedArrayBuffer (SAB). SABs are the chaotic evil of the JavaScript world because they allow true concurrency. They let the main thread and a Web Worker shout at the same chunk of memory simultaneously.

Now, enter ReadableStream. Streams are designed to pipe data efficiently, often optimized in C++ within the V8 engine. V8 developers assume that when they are reading a buffer, the floor won't drop out from under them. They assume stability.

CVE-2025-8880 is what happens when that assumption meets reality. It’s a race condition where the engine tries to consume a stream backed by shared memory, but a concurrent thread modifies that memory state mid-consumption. This isn't just a crash; it's a high-precision tool to break the V8 Sandbox, the security boundary Google built specifically to stop us from doing exactly this.

The Flaw: A Classic TOCTOU

The vulnerability (CWE-362) lies in the synchronization—or lack thereof—between the ReadableStream implementation and the underlying buffer storage when that storage is a SharedArrayBuffer.

In a typical Time-of-Check to Time-of-Use (TOCTOU) scenario, the engine checks the length of the data to ensure it's safe to read. It says, "Okay, this buffer is 1024 bytes. I will read 1024 bytes." It then proceeds to the read operation.

However, because the backing store is shared, a malicious Web Worker running in the background can modify the buffer or detach it in the nanoseconds between the check and the use. If the worker shrinks the buffer or creates an inconsistent state exactly when the stream consumer (the C++ side) is processing it, V8 ends up reading or writing to memory that no longer belongs to that buffer. This results in memory corruption on the V8 heap.

The Code: Breaking the logic

To understand the fix, we have to look at what was missing. The patch series (CL 6787532, 6811146) introduces memory barriers and explicit locking mechanisms during stream consumption.

The vulnerable logic looked something like this (pseudocode representation of V8 internal logic):

// VULNERABLE LOGIC
void ReadableStream::PullFromSource() {
    // 1. Get pointer to buffer
    void* data = buffer->data();
    // 2. Get length
    size_t len = buffer->byte_length();
    
    // ... minimal context switch ...
    
    // 3. Read data assuming 'len' is valid for 'data'
    memcpy(destination, data, len);
}

If a Web Worker thread resizes or detaches the buffer between step 2 and step 3, len is now stale, and memcpy goes out of bounds. The fix involves ensuring that the buffer cannot be modified while the stream is locking it for a read operation, effectively serializing the access.

> [!NOTE] > The patch introduces v8::internal::SharedMutex usage in streams.cc to ensure that ReadableStream operations hold a read lock on the backing store, preventing the SAB from mutating under its feet.

The Exploit: Bypassing the Sandbox

This is where Seunghyun Lee (@0x10n) earned his paycheck. Exploiting a race condition in a browser is technically demanding because you have to win the race consistently. The exploit strategy likely involves the following chain:

  1. Setup: Create a SharedArrayBuffer and wrap it in a ReadableStream.
  2. The Trigger: Create a specialized consumer (like a Response object or a TextDecoder) that will read from the stream.
  3. The Race: Spawn a Web Worker that sits in a tight loop, attempting to detach or resize the SAB.
  4. The Corruption: Trigger the stream read. If the race is won, the V8 engine writes data past the end of the buffer into adjacent heap objects.

By carefully arranging the heap (Heap Feng Shui), the attacker places a victim object (like an Array or an Object) immediately after the SAB. The out-of-bounds write overwrites the map or elements pointer of the victim object.

Once you have corrupted an object's pointer, you can create a "fake object" primitive. In modern V8, this allows you to read/write anywhere inside the V8 Sandbox. However, because this specific bug corrupts the underlying backing store management, it provides a bridge to write outside the sandbox, leading to full RCE.

The Impact: From Tab to Terminal

Why is this critical? Modern browsers use a technique called the "V8 Sandbox" to contain exploits. Even if you get code execution in JavaScript, you are supposed to be trapped in a 4GB virtual address space, unable to touch the rest of the renderer process.

CVE-2025-8880 is a Sandbox Escape. It breaks the containment vessel. An attacker who exploits this can:

  1. Escape V8: Gain full read/write access to the Renderer process memory.
  2. Escape the Renderer: Chain this with an OS-kernel vulnerability (or a logic bug in the browser broker) to break out of the Chrome sandbox entirely.
  3. Execute Code: Install malware, steal cookies, or exfiltrate saved passwords.

The fact that this was demonstrated in v8CTF proves it is weaponizable. It's not theoretical.

The Fix: Remediation

Google patched this in Chrome version 139.0.7258.127. If you are running anything older, your browser is a ticking time bomb waiting for a malicious ad or a compromised website.

Remediation Steps:

  1. Update Immediately: Go to chrome://settings/help and ensure you are on the latest stable channel.
  2. Enterprise Policy: If you cannot update immediately, you can block SharedArrayBuffer usage via the SharedArrayBufferEnabled enterprise policy, though this will break sites like Google Earth, Figma, and heavy web games.

For Developers: This is a stark reminder that SharedArrayBuffer introduces hard concurrency problems into a language that wasn't originally designed for them. If you are writing native modules or working on JS engines, never trust the length of a shared buffer to stay constant across a function call.

Official Patches

GoogleChrome Stable Channel Update

Fix Analysis (2)

Technical Appendix

CVSS Score
8.8/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
EPSS Probability
0.10%

Affected Systems

Google Chrome (Windows, Mac, Linux)Microsoft Edge (Chromium-based)Brave BrowserOperaChromium V8 Engine

Affected Versions Detail

Product
Affected Versions
Fixed Version
Google Chrome
Google
< 139.0.7258.127139.0.7258.127
AttributeDetail
CWE IDCWE-362 (Race Condition)
CVSS v3.18.8 (High)
Attack VectorNetwork (Web)
Privileges RequiredNone
User InteractionRequired (Visit Page)
ImpactRemote Code Execution / Sandbox Escape

MITRE ATT&CK Mapping

T1203Exploitation for Client Execution
Execution
T1068Exploitation for Privilege Escalation
Privilege Escalation
T1548Abuse Elevation Control Mechanism
Defense Evasion
CWE-362
Race Condition

Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition')

Known Exploits & Detection

v8CTFExploited by Seunghyun Lee (@0x10n) in v8CTF to bypass V8 Sandbox

Vulnerability Timeline

Vulnerability reported by Seunghyun Lee
2025-07-23
Patch released in Chrome 139.0.7258.127
2025-08-12
CVE-2025-8880 Published
2025-08-13

References & Sources

  • [1]Chromium Bug Tracker: Issue 433533359

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.