
CVE-2026-2766, लेकिन wasm के साथ
स्थिति: validated crash PoC, demonstrated control-flow hijack के साथ
(crash pc = freed-cell poison 0xcdcdcdcdcdcdcdcd debug shell के अंतर्गत
— engine freed ICScript से पढ़े गए pointer पर jump करता है)।
शेष कार्य: reclaimed bytes को नियंत्रित करना। देखें
research/README.md।
2026 के एक bug पर WasmBlazeFox-family chain: CVE-2026-2766, "JIT miscompilation / use-after-free in the JavaScript Engine: JIT component", जिसे Firefox 148 (MFSA 2026-13) में ठीक किया गया। Endgame वही है जो CVE-2024-29943-but-with-wasm में है: primitive को code pointer के नियंत्रण में बदलना, और उसे shellcode constants से भरे WASM JIT page पर निशाना बनाना।
Mozilla की स्वयं की regression test टिप्पणियों (bug 2013583, test hg
457b68097f81 में landed) और js/src/jit/JitScript.h में ICScript Lifetimes
SMDOC से:
removeInlinedChildICScriptinlinedChildren_InliningRootinlinedScripts_CallInlinedFunctiongczeal(14, 1), यानी हर allocation पर
ZealCompactValue) orphaned ICScript को move/evacuate करता है, जबकि
stale stub chain पुराना address बनाए रखती है।0xe5 से poison किया जाता है, जिससे बहुत सुपाठ्य crash मिलता है।Vulnerable build: mozilla-central rev b3663be61a1a (2026-01-15 nightly;
fix 2026-01-15 और 2026-02-09 के बीच landed — Feb-09 nightly बच जाता है)।
Shell: उस rev के लिए Taskcluster linux64-fuzzing-asan-opt jsshell
(gczeal के लिए आवश्यक; release-opt shells में यह नहीं होता)।
./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
Dereference baseline JIT code में stale stub chain पर चलते हुए होता है: reclaimed cell का नियंत्रण = उन ICEntry/stub fields का नियंत्रण जिन पर baseline भरोसा करता है, जिसमें वह stub code pointer भी शामिल है जिस पर वह jump करता है।
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)
पूरा weaponization log research/README.md में
देखें। वर्तमान स्थिति का सारांश:
TrailingArray) ICScript पर use-after-move है —
सिद्धांत रूप में size-classed buffers के साथ spray-reclaimable।new Ctor(flag) call के अंदर microseconds के अंतर
पर होते हैं, उनके बीच कोई JS callback point नहीं होता; naive sprays या तो
window miss कर देते हैं (reclaim1/2) या zeal GC storm से IC state को
churn कर देते हैं (reclaim3)। stale chain एक plain gc()
(purge_check) को जीवित रहती है।WASM stage स्वयं पहले से बना और demonstrated है CVE-2024-29943-but-with-wasm में; इस FF149-era build के लिए केवल object-model offsets को फिर से निकालने की आवश्यकता है।
poc.js — Mozilla का regression test (bug 2013583), जो ऊपर दिखाए अनुसार
2026-01-15 ASAN jsshell को crash करने के लिए verified है।457b68097f81