flawopen.com/Incidents/bluemoon-chrome-v8-windows-alpc-september-2026
BlueMoon: three flaws crossed Chrome and Windows isolation boundaries
Proofpoint reported targeted BlueMoon campaigns chaining CVE-2026-85046 (V8 type confusion), CVE-2026-87491 (V8 sandbox escape), and CVE-2026-85880 (Windows kernel LPE). Google and Microsoft each confirmed exploitation before their fixes; update Chromium browsers and Windows separately.[1], [2], [3], [4]
Imagine a sorter checking that every parcel contains books, then letting a visitor swap the contents before sorting by the old labels. That first mistake gives access to a locked sorting cage; a second flaw opens the cage, and a third tampers with the building’s access badges. Fixing one lock does not repair the other two.[1]
Core Concepts & Subsystem Terms
V8 / type confusion- V8 executes JavaScript.
CVE-2026-85046involved Array.prototype.sort assumptions invalidated byfill()changing the elements kind.[1], [2]
Framework mappings
- CWE reference for the weakness described in this guide: CWE-122 CWE-787 CWE-843
- CISA KEV — added 2026-09-04 — CVE-2026-85046
BlueMoon exploit-chain stages and patch decisions
| Stage / CVE / boundary | What the sources establish | Defender action |
|---|---|---|
V8 JIT type confusion — CVE-2026-85046 | Proofpoint describes Array.prototype.sort comparator mutation through fill() invalidating an elements-kind assumption. Google says an exploit existed in the wild. | Install Chrome/Chromium 152.0.7977.82/.83 (Windows/Mac) or .82 (Linux), or later; restart the browser. Google’s September 3 release contains the fix. |
V8 sandbox escape — CVE-2026-87491 | Proofpoint reports WebAssembly module-metadata corruption crossing V8’s memory sandbox, distinct from the renderer-process sandbox. Google says an exploit existed in the wild. | Install Chrome/Chromium 153.0.8010.36/.37 (Windows/Mac) or .36 (Linux), or later; restart the browser. Google’s September 8 release contains the fix. |
Windows kernel LPE — CVE-2026-85880 | Proofpoint describes an ALPC/WNF path to SeDebugPrivilege and lists the older Windows builds targeted by the kit. Microsoft confirms exploitation before its September 8 updates. The kit’s target list is not a complete affected-version inventory. | Install current supported Windows security updates, including the September 8, 2026 update or later; use MSRC for the OS-specific package and complete any required reboot. Patch Windows separately from Chrome. |
Incident Timeline
Proofpoint first observed BlueMoon activity.[1]
Chrome Stable fixed CVE-2026-85046 in 152.0.7977.82/.83 for Windows and Mac, and .82 for Linux.[2]
Step-by-Step Attack Flow
Observed delivery
Proofpoint saw targeted spearphishing campaigns deliver a link to the exploit kit. The browser stages required the recipient to open the link in a vulnerable Chromium-based browser.[1]
V8 type confusion — CVE-2026-85046
Proofpoint describes an optimized Array.prototype.sort path whose type assumption could be invalidated when its comparator changed the receiver with fill(). The resulting type confusion was the chain’s initial renderer-stage vulnerability; Google said an exploit existed in the wild.[1], [2]
Source Code: Flaw vs. Secure Implementation
Safe Python illustration of invalidated assumptions, not V8 source, an exploit or a vendor patch. A benign callback can replace integers with strings after the initial check. The fix validates a bounded snapshot after the callback and performs no further callbacks while consuming it. Python raises an exception for the vulnerable string case; this does not emulate native memory corruption. Use only trusted, bounded callbacks and ordinary lists in this synchronous example.
def numeric_total(values, callback):
if type(values) is not list or len(values) > 1024:
raise ValueError("Invalid batch")
if any(type(x) is not int for x in values):
raise ValueError("Expected integers")
callback(values)
# The callback may have invalidated the type assumption.
return sum(values)
def numeric_total(values, callback):
if type(values) is not list or len(values) > 1024:
raise ValueError("Invalid batch")
callback(values)
if len(values) > 1024:
raise ValueError("Invalid batch")
snapshot = tuple(values)
if any(type(x) is not int or abs(x) > 1_000_000
for x in snapshot):
raise ValueError("Expected bounded integers")
# Consume the validated snapshot without another callback.
return sum(snapshot)
Engineering & System Hardening Checklist
- ✓Inventory browser and Windows versions separately; apply current supported vendor updates and verify browser restarts and OS reboot completion against the release advisories.[2], [3], [4], [5]
- ✓Add callback-mutation regression cases to code review: changed element types and oversized batches must be rejected before optimized consumption; test unchanged integer input still returns the expected total.[1]
- ✓Review optimized paths for calls into user-controlled code between validation and use. Revalidate the relevant invariants or consume an immutable validated snapshot.[1]
- ✓Record each CVE separately in patch tracking. Chrome rated
CVE-2026-85046High andCVE-2026-87491Medium; Microsoft ratedCVE-2026-85880High (CVSS 7.8,CWE-122). Do not treat platform mitigations as substitutes for these fixes.[2], [3], [4], [5]