Chrome · V8
CVE-2026-87601
Race in V8
Overview
Low
Severity
—
CVSS
No
Exploited ITW
Fixed
Fix Status
Files Changed
src/builtins/builtins-string-gen.cc
Patch
From c46cc7a032bd26cf6e7c2d8db8e6f849b83d9b57 Mon Sep 17 00:00:00 2001
From: pthier <pthier@chromium.org>
Date: Wed, 12 Aug 2026 10:11:16 +0200
Subject: [PATCH] Fix String.toWellFormed
Check that the destination is a sequential 2-byte string. Since the
destination is freshly allocated, this will always hold.
This prevents racy memory corruption between allocation and writing the
data.
Fixed: 541604100
Change-Id: I4201575476a40e690aee86d1aff0ca7a7f3ef9cf
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/8234944
Reviewed-by: Olivier Flückiger <olivf@chromium.org>
Commit-Queue: Patrick Thier <pthier@chromium.org>
Auto-Submit: Patrick Thier <pthier@chromium.org>
Cr-Commit-Position: refs/heads/main@{#109196}
---
diff --git a/src/builtins/builtins-string-gen.cc b/src/builtins/builtins-string-gen.cc
index d763ebb..06c2de1 100644
--- a/src/builtins/builtins-string-gen.cc
+++ b/src/builtins/builtins-string-gen.cc
@@ -1859,13 +1859,16 @@
if_indirect);
TNode<RawPtrT> source_data = DirectStringData(source, source_instance_type);
- // The destination string is a freshly allocated SeqString, and so is always
- // direct.
- TNode<Uint16T> dest_instance_type = LoadInstanceType(dest);
- CSA_DCHECK(this, Word32Equal(Word32And(dest_instance_type,
- Int32Constant(kStringEncodingMask)),
- Int32Constant(kTwoByteStringTag)));
- TNode<RawPtrT> dest_data = DirectStringData(dest, dest_instance_type);
+ // The destination string is a freshly allocated TwoByteSeqString, and so is
+ // always direct.
+ CSA_DCHECK(this,
+ Word32Equal(
+ Word32And(LoadInstanceType(dest),
+ Int32Constant(kIsNotStringMask |
+ kStringRepresentationAndEncodingMask)),
+ Int32Constant(kSeqTwoByteStringTag)));
+ TNode<RawPtrT> dest_data =
+ DirectStringData(dest, Int32Constant(SEQ_TWO_BYTE_STRING_TYPE));
TNode<IntPtrT> length = LoadStringLengthAsWord(source);
CSA_DCHECK(this, IntPtrEqual(length, LoadStringLengthAsWord(dest)));
Loading diff…
Original Bug Report
The reporter's bug is still restricted on the tracker. Chrome de-restricts security bugs ~30–90 days after the fix ships; a later run will backfill it here.
References
On This Page