
Reproducción de una vulnerabilidad de use-after-free en WebAssembly en el motor JavaScript de Mozilla, que demuestra una condición de carrera determinista y proporciona una prueba de concepto controlada.
Una reproducción no muy elegante. La línea base requirió algunos ajustes aquí.
Mozilla describe este problema como un use-after-free en WebAssembly. El parche
público 9823b5c86ffa mantiene vivo el wasm::Code que provoca el trap exacto en JitActivation.
La prueba realiza una llamada tail cross-instance con firma incorrecta. Un hook de unwind del Debugger libera la última referencia al objetivo de la tabla y fuerza un GC de reducción mientras el motor maneja el trap. Antes de entrar en la llamada tail, Wasm invoca una importación normal de JavaScript que imprime el marcador.
9b564f641a42: estado 139 (SIGSEGV).9823b5c86ffa: imprime PASS: trap handled after target release y
sale con 0.poc-controlled.js expande la asignación del stub compartido del objetivo con 144
importaciones. Su continuación de throw obsoleto aterriza dentro de una de cuatro páginas
ejecutables. Un portador de tiering lazy pre-creado incrusta 6,000 constantes SIMD únicas en un
segmento de código optimizado de cuatro páginas. Durante el unwind de excepción, el GC libera el
objetivo y el tiering síncrono reutiliza ese hueco. Un runway de syscall cada 64
bytes imprime UAF NACHOS e invoca exit_group(0).
Ejecutar:
js --wasm-compiler=baseline+ion \
--setpref=wasm_lazy_tiering_level=9 \
--setpref=wasm_lazy_tiering_synchronous=true \
--more-compartments poc-controlled.js
Fiabilidad observada en el shell pre-parche compilado desde el código fuente para Linux x86-64: 3/3
ejecuciones imprimieron el marcador y salieron con 0. El shell corregido correspondiente lanza el
RuntimeError: indirect call signature mismatch normal y no lo imprime.
El PoC controlado utiliza funciones de Debugger y GC exclusivas del shell para hacer la carrera determinista. Establece control nativo en jsshell, no entrega desde una página web ni escapa del sandbox de contenido de Firefox.
Ejecutar con un shell de depuración equivalente:
js --wasm-compiler=baseline --more-compartments poc.js
Esto es evidencia de regresión de ciclo de vida, no una primitiva de memoria ni un exploit. El marcador aparece en ambas compilaciones y no resulta del UAF.