Overview

High
Severity
8.8
CVSS
No
Exploited ITW
Fixed
Fix Status
ImpactIncorrect calculation in V8
DescriptionIncorrect calculation in V8
ComponentV8
Sub-componentTurbofan
Bug ClassLogic Error
Action tierwatch — ub-class only — no demonstrated corruption path
Computed by PatchGap's deterministic exploitability ruler from the fixing commit. patch-now = RCE-class & attacker-reachable in a default config, or exploited in the wild; watch = real security signal below that bar; noise = no security relevance.
Tracker539350801
Fix commitab2cad06c8e2 (v8/v8) +1/-1
CWECWE-682
CVSS vectorCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
CISA KEVNot listed
CreditedRaghav Maheshwari
Reported2026-07-27 (per vendor advisory)
Fix landed2026-07-31 (public git)
Disclosed2026-08-18
Patch gap18 days — fix public in source before the advisory

Background

TurboFan
V8’s optimizing JIT compiler that specializes JavaScript code using runtime type feedback and range typing to emit fast machine code.
`AdditiveSafeInteger`
a feedback/typing category TurboFan applies to additive operations, asserting that operands and results stay within the safe-integer range so cheaper integer arithmetic can replace generic number arithmetic.
`additive_safe_int_feedback`
the V8 flag defined by DEFINE_BOOL(additive_safe_int_feedback, ...) in src/flags/flag-definitions.h that gates whether TurboFan is allowed to collect and use AdditiveSafeInteger feedback on 64-bit targets.
Killswitch flag
a boolean whose default value turns an entire optimization path on or off without altering the optimization’s own code, letting a defective path be disabled by flipping one default.

Root Cause Analysis

The vulnerable path is TurboFan’s AdditiveSafeInteger optimization, which was enabled by default via DEFINE_BOOL(additive_safe_int_feedback, true, ...) under V8_TARGET_ARCH_64_BIT in src/flags/flag-definitions.h. That optimization applies unsound additive-safe-integer typing/feedback: it assumes additive operations stay within the safe-integer range and lowers them to narrower integer arithmetic, but the assumption can be violated, so the compiled code computes an incorrect result — matching the bug’s LogicError class and “Incorrect calculation in V8” impact.

The patch does not repair the defective lowering logic, which lives elsewhere in the compiler pipeline; instead it flips the flag default from true to false, so TurboFan no longer collects or acts on AdditiveSafeInteger feedback on 64-bit targets. With the feedback disabled, the additive operations fall back to sound generic-number arithmetic, restoring correct calculation. The companion flag turbolev_additive_safe_int_feedback is deliberately left at true, scoping the mitigation to the affected default path.

Key insight
The single core mistake is trusting unsound AdditiveSafeInteger typing/feedback to justify narrower additive arithmetic in TurboFan, which can miscompute; the fix is a killswitch that changes the additive_safe_int_feedback default to false so the defective optimization never runs, rather than fixing the optimization itself.

Attack Path

  1. Trigger feedback collection Craft JavaScript with additive operations whose operands stay in patterns that make TurboFan record AdditiveSafeInteger feedback while additive_safe_int_feedback is true.
  2. Force optimization Run the function hot so TurboFan compiles it and lowers the additive operations under the unsound safe-integer typing assumption.
  3. Violate the assumption Feed inputs whose additive result escapes the assumed safe-integer range, so the specialized code produces an incorrect calculation the optimizer believed impossible.
  4. Leverage the wrong value Use the miscalculated result (for example as an index, length, or bounds computation) to drive subsequent logic into an inconsistent, attacker-favorable state.

Impact Assessment

An attacker running untrusted JavaScript in the V8/renderer process gains a deterministic incorrect calculation from JIT-compiled code, which can be steered into unsound size or bounds computations that undermine memory-safety invariants downstream. The precondition is that the target build has additive_safe_int_feedback defaulting to true on a 64-bit target (V8_TARGET_ARCH_64_BIT) and that the attacker can get the vulnerable function tiered up into TurboFan.

Files Changed

  • src/flags/flag-definitions.h

Audit Directions

  • Feedback-gated numeric optimizations
    review other TurboFan typing/feedback categories that permit narrowing arithmetic based on assumed value ranges, since an unenforced range assumption can produce the same class of incorrect calculation.
  • Killswitch-only mitigations
    track flags disabled rather than fixed (here additive_safe_int_feedback set false while turbolev_additive_safe_int_feedback stays true) to find optimizations whose defective logic still exists behind a still-enabled sibling path.
  • Architecture-scoped defaults
    audit optimizations gated only under V8_TARGET_ARCH_64_BIT or similar guards, where a soundness bug may be present on one target family but not others.
From ab2cad06c8e209248ce0d2cf76e1f0d16aa51533 Mon Sep 17 00:00:00 2001
From: Victor Gomes <[email protected]>
Date: Fri, 31 Jul 2026 16:05:08 +0200
Subject: [PATCH] [turbofan] Disable additive safe integer feedback

Bug: 539350801

Change-Id: I679b5120df2d736da823f7420b2432df31302d6c
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/8174345
Auto-Submit: Victor Gomes <[email protected]>
Commit-Queue: Victor Gomes <[email protected]>
Reviewed-by: Leszek Swirski <[email protected]>
Commit-Queue: Leszek Swirski <[email protected]>
Cr-Commit-Position: refs/heads/main@{#108981}
---
diff --git a/src/flags/flag-definitions.h b/src/flags/flag-definitions.h
index 630dca6..988936d 100644
--- a/src/flags/flag-definitions.h
+++ b/src/flags/flag-definitions.h
@@ -890,7 +890,7 @@
 
 
 #ifdef V8_TARGET_ARCH_64_BIT
-DEFINE_BOOL(additive_safe_int_feedback, true,
+DEFINE_BOOL(additive_safe_int_feedback, false,
             "Enable the use of AdditiveSafeInteger feedback")
 DEFINE_BOOL(turbolev_additive_safe_int_feedback, true,
             "Enable the use of AdditiveSafeInteger feedback for Turbolev")
Loading diff…

Original Bug Report

reported by [email protected]

[V8] Incomplete fix for CVE-2026-11075: TurboFan multi-add AdditiveSafeInteger truncation produces an OOB SlicedString and controlled Uri::Unescape OOB write

Security Bug

Important: Please do not change the component of this bug manually.


VULNERABILITY DETAILS

Title: [V8] Incomplete fix for CVE-2026-11075: TurboFan multi-add AdditiveSafeInteger truncation creates an out-of-bounds mutable SlicedString

The fix for CVE-2026-11075 restricts AdditiveSafeInteger feedback operands to approximately +/-2^51 so that adding two accepted operands remains within JavaScript’s safe-integer range. A longer truncatable addition chain can still propagate CheckedSafeIntTruncatingWord32 through several intermediate additions. Every leaf passes the post-fix feedback checks, but an intermediate JavaScript Number crosses 2^53 and rounds. TurboFan’s Word32 computation then differs from JavaScript Number semantics.

I use the incorrect result in a substring index calculation. Optimized code creates a 32,768-character SlicedString at the end of a 98,303-character source. The slice extends beyond its source and aliases a neighboring FixedDoubleArray. Ordinary JavaScript writes to that array subsequently change the contents of the supposedly immutable string after V8 has hashed and used it as a property key.

The attached poc.html is self-contained, uses no external resources, contains no personal information, and requires neither V8 native syntax nor --js-flags. It changes one string object’s contents from:

[97,113,119,115,101,100,114,102,116,103,121,104,117]

to:

[112,108,109,111,107,110,105,106,98,117,104,121,103]

using ordinary writes to the aliased FixedDoubleArray. It then shows the resulting property-key invariant violation: one object contains two distinct own keys whose current character contents are identical.

On success, the page title is PASS and the console result contains:

"ownCount":2
"sameContent":true
"sameIdentity":false

Root-cause lineage:

This report is not claiming AdditiveSafeInteger as a new class. It is a potentially new incomplete-fix variant of CVE-2026-11075, pending Chrome’s private duplicate check. The affected V8 revision already contains:

  • 330a25ad001ee1ac3b7a2176a1f175cee2592a5f ([turbofan] Fix and simplify additive safe integer optimization, issue 499659070 / CVE-2026-11075)
  • 289f555107da890a67a21f0826dbd5e71095c0ce (the follow-up retaining the Word32-truncated path used here)

The exact five-term post-fix trigger and mutable OOB SlicedString reproduce on the affected stable Chrome build and on locally built V8 main 5177b10891e65108c1a19dfc56bff4e58d79d216.

Security impact:

The primitive exposes attacker-controlled heap bytes through a V8 string and allows mutation after hashing, violating assumptions made by property tables, regular expressions, Script source, and other string consumers.

I also confirmed a controlled forward out-of-bounds write through Uri::Unescape: its first pass can count %41 triplets and allocate a small destination, while allocation/GC changes the physical OOB backing seen by the second pass. The second pass then emits more bytes than were counted without a release check of dest_position against the destination length. I can provide that deterministic diagnostic and the full source-level analysis if needed; the attached stock-Chrome PoC is intentionally limited to the smallest demonstration of the root bug.

Suggested remediation:

Do not retain CheckedSafeIntTruncatingWord32 through arbitrary addition chains based only on per-leaf feedback bounds. Prove the safe-integer range of every intermediate result, or deopt/use non-truncating Number semantics. Regression tests should cover three or more same-sign terms followed by cancellation after an intermediate result crosses 2^53.

VERSION

Chrome Version: 150.0.7871.46 stable, Chrome for Testing, Linux x86-64

Chromium tag: 5b586c06e0d27582900f17e2d59c5370d8d6e0bb

DEPS-pinned V8: 968f19a8970f8d91702d86f0ec1522f3909781b7 (V8 15.0.245.13)

Chrome binary SHA-256: 8c60a3ce09ad007490a232bb8a7243e60ec74d40d8d078b2648200b1c4f7f923

Operating System: Kali GNU/Linux Rolling 2024.3, x86-64, under WSL2 kernel 5.15.153.1-microsoft-standard-WSL2.

REPRODUCTION CASE

Attached poc.html directly to this report.

  1. Open poc.html in Chrome 150.0.7871.46 using a fresh profile.

  2. Allow approximately two seconds.

  3. Observe page title PASS.

  4. The console logs JSON containing:

    "ownCount":2
    "sameContent":true
    "sameIdentity":false
    

Exact headless command used for validation:

profile="$(mktemp -d)"
/path/to/chrome-150.0.7871.46/chrome-linux64/chrome \
  --headless=new --no-sandbox \
  --disable-crashpad --disable-breakpad --disable-crash-reporter \
  --enable-logging=stderr --user-data-dir="$profile" \
  "file://$PWD/poc.html"

--no-sandbox was used only because the validation process ran as root. It is not needed to trigger the V8 bug. No --js-flags are used.

The PoC succeeded in 10/10 fresh-profile runs on the affected binary.

Attachment:

poc.html

Size: 2,959 bytes

SHA-256: cb18bd99c80a5bea3f808699a3918a288b94ef01ce74804206e36218e929eec7

FOR CRASHES, PLEASE INCLUDE THE FOLLOWING ADDITIONAL INFORMATION

CREDIT INFORMATION

Reporter credit: Raghav Maheshwari [[email protected]]

Additional submission note: I intend to use this initial-corruption bug for a v8CTF 0-day submission. v8CTF requires reporting it to Chrome VRP before capturing the flag, so this Chrome security report is being filed first. I will use the same reporter email address for the later v8CTF submission.

View on issue tracker