Resizable ArrayBuffer length re-read races background grow
V8 reads a resizable or growable ArrayBuffer’s length or byte-length twice with a background-thread grow in between, desynchronizing the two snapshots. A destination array sized from the earlier value is then filled using a larger current length re-read live from the backing store. The mismatch produces an out-of-bounds write.
Mechanism
Fix shape
CVEs in this pattern
1 component · V8| CVE | What | Component | Vendor | Severity | Month | |
|---|---|---|---|---|---|---|
| CVE-2026-5893 | Race in V8 | V8 | chrome | Medium | 2026-04 | 🔧 |
| CVE-2026-4450 | OOB in V8 | V8 | chrome | High | 2026-03 | 🔧 |
| CVE-2025-12432 | Race in V8 | V8 | chrome | High | 2025-10 | 🔧 |
Hunt for siblings
Commit-scanner flags functions that read a RAB/GSAB length or byte_length more than once; a fuzzer that grows a shared buffer from a background thread mid-operation surfaces the desync overflow.
Mitigations that would catch this class
- Snapshot the length once and reuse it for both sizing and iteration
- Pass the sampled element count as an explicit bound into inner loops
- Derive element count from byte_length rather than re-reading a mutable length