
On September 5, 2026, a post titled "Actively exploited sandbox RCE in all Chromium versions" sat near the top of Hacker News. By the time it had been reblogged twice, "sandbox RCE" had quietly become "an attacker can take over your machine by opening a tab," and "all Chromium versions" had become "there is no fixed version yet."
Neither is true. The gap between the headline and the advisory is a better story than the panic version, mostly because closing it means understanding how Chromium is actually built.
The bug underneath the headline is real, serious, and was still being weaponized against real targets as this was written. It's called CVE-2026-85046, it lives in V8, and Google shipped the fix two days before this piece went up.
What it is not, on its own, is a sandbox escape. That distinction is the whole point of this piece: not to downplay a genuinely dangerous vulnerability class, but to explain what Chromium's architecture actually bought its two billion or so users while the bug was live.
What CVE-2026-85046 actually is
Google patched the flaw in Chrome 152.0.7977.82/.83 (Windows/macOS) and 152.0.7977.82 (Linux) on September 3, 2026. It's a type-confusion bug in Maglev, V8's mid-tier JIT compiler, rated CVSS 8.8.
The U.S. Cybersecurity and Infrastructure Security Agency added it to the Known Exploited Vulnerabilities catalog the next day, giving federal civilian agencies until September 18 to remediate under Binding Operational Directive 22-01. That deadline binds federal agencies specifically, not the rest of us, but it's still the industry's highest-confidence public signal that a bug is actually being used against real targets.
Security researcher Salvatore Gulizia, who goes by "Serotav," reported the bug to Google on August 4, 2026, and was paid a $1,000 bounty. He published a full technical writeup on his own blog on August 28, before Chrome 152 had even shipped, laying out how he'd chained the bug with a separate, already-known sandbox-escape vulnerability to enter Google's v8CTF competition.
That detail matters more than it looks. It's Gulizia's own account of how he built a full exploit chain, and it undercuts the "sandbox RCE" framing on its own terms: that framing implies the bug itself breaks the sandbox. It doesn't. What it gets you is arbitrary read/write inside the sandboxed renderer process, which is bad, but a different and much more contained thing.
Google's standard Vulnerability Reward Program pays far more for renderer remote-code-execution reports, which makes the $1,000 bounty worth a second look. The V8 zero-day patched three months earlier, CVE-2026-11645, earned its reporter $55,000 for what was, on paper, a comparable class of bug.
The gap isn't about severity. Gulizia reported through v8CTF, Google's standing capture-the-flag program, which pays a fixed prize regardless of impact, rather than through the standard VRP pipeline that scales rewards to real-world damage. Same bug class, wildly different payout, simply because of which door it walked in through.
Because V8 is shared code across the whole Chromium project, the bug was never really Chrome-specific. Microsoft Edge, Brave, Opera, and Vivaldi all ship the same vulnerable V8 code, and each needs its own vendor update on its own schedule. That's the part of "all Chromium versions" that's actually true, and actually underreported: not that Chrome itself remains unpatched, but that patching Chrome does nothing for the other four browsers sitting in the same Applications folder.
Here's how the clock actually ran:

Gulizia's technical writeup, which laid out the exploitation approach without being a copy-paste weapon, went public on August 28, six days before Chrome 152 shipped. The disclosure-to-patch window was already short; the disclosure-to-public-writeup window was shorter still.
Chromium's actual defense-in-depth
Most coverage of "sandbox RCE" skips the part where Chromium isn't one program with one set of privileges. It's a federation of OS processes with deliberately unequal trust, wired together over an internal IPC layer called Mojo:

Three things in that diagram do the actual work.
Site Isolation puts each origin in its own OS-level renderer process, so a bug triggered by evil.example can't directly read memory belonging to your bank's tab in the next process over. They're not just logically separate; they're physically separate address spaces.
It wasn't originally conceived as a browser-exploitation defense at all. Google fast-tracked its rollout in 2018 as a direct response to Spectre, the speculative-execution hardware flaw that meant any JavaScript sharing a process with sensitive data could potentially read it through a timing side channel.
A fix built for a CPU-level information leak ended up doubling as one of the sturdiest walls against process-level exploitation. Defense-in-depth built for one threat often pays off against a completely different one.
The renderer OS sandbox strips the renderer process of almost all direct syscall access: no arbitrary file opens, no raw sockets, no spawning processes. Everything it needs, like rendering a page or fetching a resource, goes through Mojo IPC to the privileged Browser process, which can apply its own policy checks on every request.
The V8 Sandbox is the newest and narrowest layer, and it's the one CVE-2026-85046 actually lives inside. It's an in-process mitigation: heap pointers inside V8 are represented in a way that keeps a corrupted pointer from forging an arbitrary address into the rest of the process.
Samuel Groß, who leads V8 security at Google, has made the underlying argument plainly: V8's worst bugs are mostly subtle compiler logic errors rather than classic memory-safety bugs, which is exactly why ordinary memory-safety fixes don't reach them. He's called the V8 Sandbox "a necessary step towards memory safety" for that reason. It shipped as the default in Chrome 123, in early 2024.
Put together: reaching the Browser process, and from there the OS, means beating Site Isolation (or already being on the same origin), beating the renderer's OS sandbox, and beating the V8 Sandbox — or finding one bug that skips past all three at once, which is a different and much harder thing than what Gulizia found. CVE-2026-85046 broke the third layer only. That's a real result. It is not sandbox RCE.
Where the bug lived, and how it worked
To see why a bug like this keeps recurring, it helps to look at where in V8 it actually sits. V8 doesn't run JavaScript one way; it pushes code through increasingly aggressive tiers, promoting "hot" functions to faster, more speculative compilers as it learns more about the types actually flowing through them:

Maglev, added to V8 in 2023, sits between the baseline Sparkplug JIT and the deeply optimizing TurboFan. One of its optimizations, TryReduceArrayPrototypeSort, replaces calls to Array.prototype.sort on small arrays (16 elements or fewer) with a much cheaper inline insertion sort, but only once it has observed, through type feedback, that a call site has been trained on both of V8's "packed" array representations: PACKED_SMI_ELEMENTS for small integers and PACKED_ELEMENTS for arbitrary objects.
Because a JavaScript comparator function can have side effects, the inlined sort can't safely sort in place. It copies the array's contents into a temporary buffer, sorts the copy, and then re-checks the original array's map before writing the sorted values back, since the comparator might have mutated the array in the meantime.
Gulizia's writeup, linked at the end of this piece, shows exactly what that check verifies: that the array's current map is present somewhere in the set of maps the call site was trained on, not that it's the same map the array had when sorting began.
That's the whole bug. Array.prototype.fill(), when it replaces every element of an array, is allowed to migrate the array's map backward, from PACKED_ELEMENTS to PACKED_SMI_ELEMENTS, without reallocating the backing store, since both representations are, under the hood, a plain FixedArray of tagged pointer-sized slots.
Call fill() inside the comparator, and the trained-maps check passes even though the array now claims to hold raw integers over memory that still holds real object pointers. From there it's standard V8-exploitation technique: reading the confused slots leaks heap addresses, an "addrof" primitive, and writing through them, using an operation like Array.prototype.unshift() that shifts elements without triggering V8's garbage-collector write barrier, turns into a fake-object primitive.
Chain the two together and you have arbitrary read/write across the JavaScript heap: still inside the V8 Sandbox, still inside the renderer's OS sandbox, and still, on its own, nowhere near your filesystem.
It's worth being precise about what the V8 Sandbox does and doesn't stop here. It doesn't prevent type confusion inside the JS heap; it can't, since that confusion happens entirely within V8's own bookkeeping, before any pointer goes anywhere.
What it prevents is that confusion turning into a pointer that reaches outside the sandboxed heap region into the rest of the renderer process's memory. Gulizia's addrof and fakeobj primitives work on sandboxed, compressed heap references: powerful within that boundary, useless outside it without a second bug that itself breaks out of the Sandbox. That's the layer CVE-2026-85046 broke, and the layer it didn't.
The fix Google shipped is narrow and fairly unglamorous: Maglev simply stops inlining Array.prototype.sort once a call site has been trained on mixed element kinds. No architectural change was needed here. The architecture wasn't what failed; one optimization's bookkeeping was.
Why V8 keeps producing this exact bug class
CVE-2026-85046 was the third V8 zero-day patched in Chrome in 2026, out of six actively exploited zero-days total:

Every one of 2026's six actively-exploited Chrome zero-days carried an identical CVSS score of 8.8. Half of them lived directly in V8; the other half hit adjacent memory subsystems (Skia's 2D rasterizer, the Dawn WebGPU backend) that feed the same rendering pipeline.
That's not a coincidence, and it isn't new. Google's own security research has found that roughly sixty percent of Chrome exploits observed in the wild between 2021 and 2023 originated in V8.
The reason is structural, not a staffing problem. V8's most dangerous bugs are rarely classic memory-unsafety, like a use-after-free or an out-of-bounds write; they're subtle logic errors in speculative compiler optimizations, exactly like the map-check gap here. Conventional memory-safety tooling (bounds checking, Rust rewrites, hardware memory tagging) doesn't reach a bug where every individual memory access is, technically, in-bounds.
The V8 Sandbox exists because Google's own team decided this bug class can't be eliminated at the source, only contained after the fact.
This particular shape of bug, a fast-path optimization for a built-in Array method gated on element-kind feedback that a callback can invalidate mid-operation, isn't a one-off.
Array and TypedArray methods that accept a user callback (sort, map, forEach, splice, and their relatives) have been a recurring source of V8 type-confusion bugs for years, precisely because each one creates the same structural trap: the engine has to trust that an array's shape hasn't changed between when it checked and when it acts, and a callback is a standing invitation to change it in between.
Fixing TryReduceArrayPrototypeSort closes this instance. It doesn't close the pattern, and V8's own security team would likely be the first to admit it.
The other three 2026 zero-days (a CSS font-handling use-after-free in February, a Skia 2D-rasterizer out-of-bounds write in March, and a Dawn/WebGPU use-after-free in April) sit in the same broad territory: native C++ code processing untrusted, attacker-shaped input as fast as possible. None of the six needed a user to do anything beyond load a page.
The blind spot: headless Chrome, Electron, and CI images
Most coverage of a Chrome zero-day assumes a human with a mouse. A meaningful share of Chromium's install base doesn't have one. Headless Chrome renders PDFs and screenshots in backend services; Electron embeds a full Chromium in thousands of desktop apps; CI runners spin up Chrome to run end-to-end test suites against pages they don't fully control.
None of that changes the exploit's mechanics; rendering the malicious page is still what triggers it. But it does change the blast radius, since a compromised renderer in a CI job or a scraping pipeline can sit far closer to real credentials (CI secrets, internal network access) than a compromised renderer in a consumer's browser tab.
Electron makes this worse in one specific, structural way: unlike Chrome or Edge, an Electron app doesn't auto-update its bundled Chromium independently of the app itself. Its maintainers have to bump the Electron dependency, rebuild, test, and ship a new release before users ever see the fix.
That adds days to weeks on top of Google's own patch timeline as a matter of routine, and sometimes much longer for apps still pinned to an older Electron major version. A vulnerable V8 build can keep shipping inside a popular desktop app long after Chrome itself is clean.
It also changes the patch story in a way that's easy to miss. Chrome updates its binaries on disk but doesn't take effect until the process restarts, which matters more for a long-lived headless service or a kiosk build than for a browser someone closes and reopens every day.
VM templates, Docker base images, and CI runner images are exactly the kind of artifact that quietly reverts a patched Chromium back to a vulnerable one the next time it gets rebuilt from an older layer. If your team ships Electron, runs headless Chrome for PDF generation or link previews, or bakes Chrome into a CI image, updating Chrome is a fleet-management problem, not a one-click menu action.
What to actually do about it
Update and restart, not just update. Downloading the patch in the background doesn't protect a running process; every Chrome and Chromium-based browser needs a full relaunch to load 152.0.7977.82 or later.
Check every Chromium-based browser separately. Edge, Brave, Opera, and Vivaldi each ship their own build on their own timeline. Updating Chrome does nothing for the others.
Audit build images, not just endpoints. CI base images, Docker images bundling headless Chrome, and Electron app bundles are common places for a patched version to silently regress on the next rebuild.
Treat anomalous renderer behavior as a signal. A Chrome renderer process spawning a shell, hitting non-Google infrastructure, or restarting unexpectedly is a stronger detection signal than trying to catch the initial JavaScript exploit, which executes entirely in-memory and leaves little to fingerprint.
If you operate Federal Civilian Executive Branch infrastructure, the CISA KEV deadline of September 18, 2026 is a binding compliance date, not a suggestion.
Is "the sandbox held" the real headline?
Here's the opinion part, since a headline correction alone doesn't quite earn the label "opinion breakdown." Chromium's process-and-sandbox architecture is, in my view, one of the more genuinely successful pieces of applied security engineering in mainstream consumer software, and that fact is nearly invisible in how zero-days get covered, including, this time, in the framing of the original submission.
A bug that gets arbitrary read/write on the JavaScript heap and still can't touch your filesystem is exactly what defense-in-depth is supposed to produce. The fact that it takes real effort to explain why that's true, and that the effort mostly doesn't get made, says more about how security coverage works than about the bug itself.
That doesn't make the instinct to patch immediately wrong. It's the correct instinct, and the bug really is being used against real targets today. But there's a second, quieter problem that the accurate framing surfaces and the inaccurate one doesn't: Gulizia's complete technical writeup, methodology included, went live on a public blog six days before most of Chrome's install base had the fix.
Google's own restrained-disclosure policy (withholding bug-tracker details until most users update) depends on nobody else publishing the technical path first. A researcher publishing for CTF credit, entirely within the rules of a program Google itself runs, ended up creating exactly the situation that policy exists to prevent.
That tension, between what's good for an individual researcher's career and what's good for the ecosystem's rollout timing, is the more interesting story underneath this one. "Sandbox RCE in all Chromium versions" doesn't leave room for it.
None of this is unique to Chrome. Almost every high-profile CVE goes through the same compression on its way to a headline: a precise, hedged advisory gets summarized by a blog, re-summarized by an aggregator, and re-titled by whoever wants the most clicks off the front page. The words that survive that process tend to be the scariest ones, not the most accurate ones.
"Sandbox RCE in all Chromium versions" isn't really a lie. It's a headline that won a game of telephone. The advisory it started from was more careful than that, and so, it turns out, was the researcher who found the bug.
Further reading
Salvatore Gulizia's technical writeup — the original source for the Maglev bug mechanics described above
Comments (0)
Login to post a comment.