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

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

Amit Schendel
Amit Schendel
Senior Security Researcher

Feb 15, 2026·6 min read·116 visits

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.

More Reports

•2 days ago•CVE-2026-115895
8.8

CVE-2026-115895: Code Injection via Unsanitized Import Alias in Happy DOM ECMAScript Module Compiler

CVE-2026-115895 is a high-severity code injection vulnerability (CWE-94) in the happy-dom npm package prior to version 21.0.4. The vulnerability exists within the ECMAScriptModuleCompiler component, which transforms ECMAScript module syntax into executable Node.js functions when JavaScript evaluation is enabled. Due to an incomplete fix for CVE-2026-33943, the compiler failed to validate local named import aliases against legal JavaScript identifier rules. Attackers supplying crafted module imports—specifically utilizing destructuring default initializers alongside JSON module attributes—can inject arbitrary JavaScript expressions directly into the host Node.js runtime context.

Amit Schendel
Amit Schendel
8 views•10 min read
•2 days ago•CVE-2026-115883
6.0

CVE-2026-115883: Cross-Namespace Access via Dot-Delimited Labels in LangGraph Postgres and SQLite Stores

An improper input validation and authorization bypass vulnerability exists in the LangGraph storage layer affecting langgraph, langgraph-checkpoint-postgres, and langgraph-checkpoint-sqlite. Because relational store implementations serialize namespace tuples into dot-delimited strings without validating labels on read, search, delete, and batch operations, an attacker who controls a namespace label can inject periods (.) to traverse namespace boundaries and access, modify, or delete data belonging to other namespaces.

Amit Schendel
Amit Schendel
8 views•9 min read
•2 days ago•CVE-2026-115886
6.5

CVE-2026-115886: Unauthenticated Server-Side Request Forgery and Unsafe Reflection in MLflow Scorer Evaluation Endpoints

CVE-2026-115886 (GHSA-2wqp-q3c6-ccj5) is a Server-Side Request Forgery (SSRF) and Unsafe Reflection vulnerability in MLflow versions 3.12.0rc0 prior to 3.17.0. Unauthenticated REST API endpoints accept serialized third-party scorer JSON payloads that are dynamically deserialized and reflectively instantiated without sanitizing constructor keyword arguments. When optional dependencies such as trulens and trulens-providers-litellm are installed, attackers can inject egress-steering arguments into the scorer payload, forcing the MLflow server to dispatch outbound HTTP requests to arbitrary internal destinations or cloud metadata services.

Alon Barad
Alon Barad
12 views•10 min read
•2 days ago•CVE-2026-113872
7.5

CVE-2026-113872: Unauthenticated Process Crash in Express Multer via Late Busboy Stream Resumption

CVE-2026-113872 (GHSA-q7qp-rjg7-q26m) is a high-severity denial-of-service vulnerability affecting the multer multipart/form-data upload middleware for Node.js and Express in versions 2.0.0 through 2.4.0. When an endpoint is configured to accept multiple files using an asynchronous fileFilter callback, a crafted, truncated multipart HTTP request can trigger an unhandled error event on the underlying busboy stream parser after request teardown has already completed. Because all error listeners are stripped during teardown, Node.js treats the resulting error event as an uncaught exception and immediately terminates the server process.

Amit Schendel
Amit Schendel
9 views•12 min read
•2 days ago•CVE-2026-115897
2.1

CVE-2026-115897: Cross-Site Scripting via Function Body Boundary Bypass in serialize-javascript

CVE-2026-115897 (also tracked as GHSA-m5mm-p8h7-m29v and aliased as CVE-2026-115754) is a Cross-Site Scripting (XSS) vulnerability in the Yahoo serialize-javascript npm package prior to version 7.1.3. The flaw exists in the regular expression used by escapeFunctionBody() to neutralize HTML script closing tags within serialized JavaScript functions. Because function bodies are sanitized in isolation before structural formatting is applied, a function whose string representation terminates directly with the sequence '</script' bypasses the positive lookahead check. When combined with serialization formatting options that introduce whitespace delimiters and a subsequent property that supplies a closing bracket, an attacker can prematurely terminate an enclosing HTML <script> block and inject arbitrary HTML or JavaScript into the rendered document.

Amit Schendel
Amit Schendel
7 views•13 min read
•2 days ago•CVE-2026-109841
5.9

CVE-2026-109841: Subresource Integrity Verification Bypass in Node.js Undici

CVE-2026-109841 is a Subresource Integrity (SRI) verification bypass vulnerability in undici, the official HTTP/1.1 and HTTP/2 client library for Node.js that powers the global fetch() implementation. The flaw stems from improper handling of case sensitivity (CWE-178) when validating cryptographic hash algorithm tokens within SRI metadata. Because undici compared incoming algorithm identifiers against a strictly lowercase set without prior ASCII-lowercase normalization, valid uppercase or mixed-case tokens such as SHA256- or Sha384- were treated as unrecognized algorithms and discarded. Under SRI forward-compatibility rules, discarding all provided tokens results in an empty integrity list, causing undici to fail open and accept tampered HTTP response bodies without cryptographic verification.

Alon Barad
Alon Barad
17 views•9 min read