
Riproduzione di una vulnerabilità use-after-free in WebAssembly nel motore JavaScript di Mozilla, che dimostra una condizione di gara deterministica e fornisce una proof-of-concept controllata.
Una riproduzione non raffinata. La baseline ha richiesto qualche aggiustamento.
Mozilla descrive questo problema come un use-after-free in WebAssembly. La correzione pubblica
9823b5c86ffa mantiene vivo il wasm::Code che genera il trap esatto in JitActivation.
Il test esegue una tail call cross-istanza con firma non valida. Un hook di unwind del Debugger rimuove l'ultimo riferimento al target della tabella e forza una GC di riduzione mentre il motore gestisce il trap. Prima di entrare nella tail call, Wasm invoca un normale import JavaScript che stampa il marcatore.
9b564f641a42: stato 139 (SIGSEGV).9823b5c86ffa: stampa PASS: trap handled after target release ed
esce con 0.poc-controlled.js espande l'allocazione dello shared-stub del target con 144
import. La sua continuation di throw obsoleta atterra all'interno di una delle quattro pagine
eseguibili. Un carrier lazy-tier pre-creato incorpora 6.000 costanti SIMD uniche in un
segmento di codice ottimizzato di quattro pagine. Durante l'unwind dell'eccezione, la GC rilascia il
target e il tiering sincrono riutilizza quel buco. Una runway di syscall ogni 64
byte stampa UAF NACHOS e invoca exit_group(0).
Esegui:
js --wasm-compiler=baseline+ion \
--setpref=wasm_lazy_tiering_level=9 \
--setpref=wasm_lazy_tiering_synchronous=true \
--more-compartments poc-controlled.js
Affidabilità osservata sulla shell pre-fix Linux x86-64 compilata da sorgente: 3/3
esecuzioni hanno stampato il marcatore ed sono uscite con 0. La shell fix corrispondente solleva il normale
RuntimeError: indirect call signature mismatch e non lo stampa.
Il PoC controllato utilizza funzioni Debugger e GC disponibili solo in shell per rendere la race deterministica. Stabilisce il controllo nativo in jsshell, non la consegna da una pagina web o la fuga dalla sandbox dei contenuti di Firefox.
Esegui con una shell di debug equivalente:
js --wasm-compiler=baseline --more-compartments poc.js
Questa è una prova di regressione del lifetime, non una primitiva di memoria o un exploit. Il marcatore appare su entrambe le build e non deriva dalla UAF.