
CVE-2026-2766, aber mit wasm
Status: validierter Crash-PoC mit nachgewiesener Control-Flow-Übernahme
(Crash pc = Poison der freigegebenen Zelle 0xcdcdcdcdcdcdcdcd unter der Debug-
Shell — die Engine springt zu einem Zeiger, der aus dem freigegebenen ICScript gelesen wird).
Verbleibende Arbeit: die zurückgewonnenen Bytes kontrollieren. Siehe
research/README.md.
Eine Kette aus der WasmBlazeFox-Familie zu einem Bug aus 2026: CVE-2026-2766, „JIT- Fehlkompilierung / Use-after-Free in der JavaScript Engine: JIT-Komponente“, behoben in Firefox 148 (MFSA 2026-13). Das Endspiel ist dasselbe wie bei CVE-2024-29943-but-with-wasm: das Primitiv in die Kontrolle über einen Code-Zeiger verwandeln und ihn auf eine WASM-JIT- Seite voller Shellcode-Konstanten richten.
Aus Mozillas eigenen Regressionstest-Kommentaren (Bug 2013583, Test gelandet in
hg 457b68097f81) und dem ICScript Lifetimes SMDOC in js/src/jit/JitScript.h:
removeInlinedChild auf → das ICScript des Kindes wird aus
inlinedChildren_ entfernt, wird aber weiterhin vom inlinedScripts_-Vektor
des InliningRoot referenziert — und, fatalerweise, vom veralteten
CallInlinedFunction-Stub, der noch in der IC-Kette des Aufrufers sitzt.gczeal(14, 1), d. h. ZealCompactValue bei jeder
Allokation) verschiebt/evakuiert das verwaiste ICScript, während die veraltete Stub-
Kette die alte Adresse behält.0xe5 vergiftet, was einen sehr gut lesbaren Crash ergibt.Verwundbarer Build: mozilla-central Rev b3663be61a1a (Nightly vom 2026-01-15;
der Fix landete zwischen 2026-01-15 und 2026-02-09 — das Nightly vom 09.02.
überlebt). Shell: Taskcluster linux64-fuzzing-asan-opt jsshell für diese
Rev (benötigt für gczeal; release-opt-Shells haben es nicht).
./js --ion-warmup-threshold=100000 poc.js
== ERROR: AddressSanitizer: SEGV on unknown address 0xe5e5e5e5e5e5e5e5
The signal is caused by a READ memory access.
#0-#3 <unknown module> <- baseline JIT code
#4 EnterJit / MaybeEnterJit <- js/src/jit/Jit.cpp
#10 js::jit::DoCallFallback <- BaselineIC.cpp (the stale IC chain)
rdi = 0xe5e5e5e5e5e5e5e5 <- the freed ICScript
Die Dereferenzierung erfolgt in Baseline-JIT-Code, der die veraltete Stub-Kette durchläuft: Kontrolle über die zurückgewonnene Zelle = Kontrolle über die ICEntry/Stub-Felder, denen die Baseline vertraut, einschließlich des Stub-Code-Zeigers, zu dem sie springt.
orphaned ICScript (this PoC)
-> compacting GC moves it; stale chain keeps old address
-> reclaim the old cell with controlled bytes (size-class spray)
-> baseline reads fake ICEntry -> fake ICStub -> fake code_ pointer
-> jump into the WASM JIT page shellcode (f64.const immediates,
FuncExport entry-offset overwrite — see the 2024-29943 repo)
Siehe research/README.md für das vollständige
Waffenisierungs-Log. Zusammenfassung des aktuellen Stands:
TrailingArray) ICScript —
im Prinzip per Spray zurückgewinnbar mit größenklassierten Puffern.new Ctor(flag)-Aufrufs, ohne JS-Callback-Punkt dazwischen; naive
Sprays verfehlen entweder das Zeitfenster (reclaim1/2) oder wirbeln den IC-Zustand durch
einen Zeal-GC-Sturm durcheinander (reclaim3). Die veraltete Kette überlebt ein einzelnes
einfaches gc() (purge_check).Die WASM-Stufe selbst ist bereits gebaut und demonstriert in CVE-2024-29943-but-with-wasm; nur die Objektmodell-Offsets müssen für diesen Build aus der FF149-Ära neu hergeleitet werden.
poc.js — Mozillas Regressionstest (Bug 2013583), verifiziert, dass er die
2026-01-15-ASAN-jsshell wie oben gezeigt zum Absturz bringt.457b68097f81