
Reprodução de uma vulnerabilidade de use-after-free em WebAssembly no motor JavaScript da Mozilla, demonstrando uma condição de corrida determinística e fornecendo uma prova de conceito controlada.
Uma reprodução não sofisticada. A base exigiu alguns ajustes aqui.
A Mozilla descreve este problema como um use-after-free em WebAssembly. A correção
pública 9823b5c86ffa mantém o exato wasm::Code que gera o trap vivo em JitActivation.
O teste realiza uma chamada de cauda cross-instance com assinatura inválida. Um hook de unwind do Debugger limpa a última referência de alvo da tabela e força um GC de encolhimento enquanto o mecanismo lida com o trap. Antes de entrar na chamada de cauda, o Wasm invoca uma importação JavaScript normal que imprime o marcador.
9b564f641a42: status 139 (SIGSEGV).9823b5c86ffa: imprime PASS: trap handled after target release e
sai com 0.poc-controlled.js expande a alocação de stub compartilhado do alvo com 144
importações. Sua continuação de throw obsoleta cai dentro de uma de quatro páginas
executáveis. Um carrier de tiering lazy pré-criado incorpora 6.000 constantes SIMD únicas em um
segmento de código otimizado de quatro páginas. Durante o unwind de exceção, o GC libera o
alvo e o tiering síncrono reutiliza esse buraco. Uma pista de syscall a cada 64
bytes imprime UAF NACHOS e invoca exit_group(0).
Execute:
js --wasm-compiler=baseline+ion \
--setpref=wasm_lazy_tiering_level=9 \
--setpref=wasm_lazy_tiering_synchronous=true \
--more-compartments poc-controlled.js
Confiabilidade observada no shell pré-correção compilado a partir do código-fonte Linux x86-64: 3/3
execuções imprimiram o marcador e saíram com 0. O shell corrigido correspondente levanta o normal
RuntimeError: indirect call signature mismatch e não o imprime.
O PoC controlado usa funções de Debugger e GC exclusivas do shell para tornar a corrida determinística. Ele estabelece controle nativo no jsshell, não entrega a partir de uma página web ou fuga do sandbox de conteúdo do Firefox.
Execute com um shell de depuração equivalente:
js --wasm-compiler=baseline --more-compartments poc.js
Isto é evidência de regressão de tempo de vida, não uma primitiva de memória ou exploit. O marcador aparece em ambas as compilações e não resulta do UAF.