
Proof-of-concept di una catena di exploit per Firefox JIT CVE-2026-2764, che combina miscompilazione JIT e use-after-free per ottenere lettura/scrittura arbitraria ed esecuzione di shellcode WASM.
Stato: analisi + PoC validato. Armatizzazione della primitiva in corso.
Una chain in stile WasmBlazeFox costruita questa volta su un bug del 2026: CVE-2026-2764, una "miscompilazione JIT + use-after-free" in IonMonkey/baseline nel componente JavaScript Engine: JIT, corretta in Firefox 148 (MFSA 2026-13, CVSS TBD). Stesso obiettivo finale di CVE-2024-29943-but-with-wasm: alimentare la primitiva con una pagina JIT WASM piena di costanti shellcode.
Il bug 2012608 di Bugzilla è riservato, ma il fix è arrivato in pubblico:
hg 1b58f51668d3 — "Bug 2012608: Call CreateThis directly from PBL":
PortableBaselineInterpret.cpp ha smesso di instradare la creazione di
this nei costruttori scriptati attraverso CreateThisFromIC (che rileggeva lo stato dell'IC) e ora
chiama js::CreateThis direttamente con valori correttamente radicati.hg 3adad00d0042 — formattazione/documentazione sul contratto di
createThis in BaselineCacheIRCompiler.cpp (argc deve includere gli argomenti spread).hg 57885d520e85 — i test di regressione (i nostri PoC).Modalità di guasto: su new Ctor(...arr) / Reflect.construct con una Proxy come
newTarget, la trap get della proxy viene eseguita mentre il motore si trova tra
lo spread degli argomenti e la creazione di this. Quel callback può mutare o
liberare proprio l'array che il motore sta espandendo, e il motore continua con
assunzioni stantie:
arr[0] scambiato da int a object dopo lo snapshot dello spread
(poc-typeconfusion.js)arr.length = 0; gc() libera lo store degli elementi durante lo spread
(poc-uaf.js)Contro la jsshell nightly mozilla-central del 2026-02-09 (JavaScript-C149.0a1,
linux x86-64, pre-fix), in un container Docker x86_64:
./js poc-typeconfusion.js -> Error: Assertion failed: got "oops", expected 1
./js poc-uaf.js -> Segmentation fault
Entrambi i PoC sono i test di regressione ufficiali di Mozilla, verbatim.
poc-typeconfusion.js (confusione controllabile del valore degli argomenti, nessun crash)
-> ottimizzare con Ion un costruttore che fa assunzioni di tipo fisse sui propri
argomenti spread; inserire un oggetto dove era stato provato un int32
-> addrof / fakeobj
-> corrompere la lunghezza di un TypedArray -> R/W arbitrario
-> stage shellcode JIT WASM (come in CVE-2024-29943-but-with-wasm:
immediati f64.const, sovrascrittura dell'offset di ingresso FuncExport)
Lo stage WASM e il codice per il walk degli offset vengono portati invariati, tranne gli offset
da ricalcolare contro la build dell'era FF149 (vedi
CVE-2024-29943-but-with-wasm/test.gdb per la ricetta).
1b58f51668d3, 3adad00d0042, test 57885d520e85