
Reproduction d'une vulnérabilité use-after-free WebAssembly dans le moteur JavaScript de Mozilla, démontrant une condition de course déterministe et fournissant une preuve de concept contrôlée.
Une reproduction sans fioritures. La base de départ a nécessité quelques ajustements.
Mozilla décrit ce problème comme un use-after-free dans WebAssembly. Le correctif
public 9823b5c86ffa maintient en vie le wasm::Code qui piège exactement dans JitActivation.
Le test effectue un appel final croisé entre instances avec une signature invalide. Un hook de déroulement de pile du Debugger efface la dernière référence de cible de la table et force un GC de rétrécissement pendant que le moteur gère le piège. Avant d'entrer dans l'appel final, Wasm invoque un import JavaScript normal qui imprime le marqueur.
9b564f641a42 : statut 139 (SIGSEGV).9823b5c86ffa : imprime PASS: trap handled after target release et
se termine avec le code 0.poc-controlled.js étend l'allocation de stub partagé de la cible avec 144
imports. Sa continuation de throw obsolète atterrit dans l'une des quatre pages
exécutables. Un porteur de tiering paresseux pré-créé embarque 6 000 constantes SIMD uniques dans un
segment de code optimisé de quatre pages. Pendant le déroulement d'exception, le GC libère la
cible et le tiering synchrone réutilise ce trou. Une piste d'appels système tous les 64
octets imprime UAF NACHOS et invoque exit_group(0).
Exécution :
js --wasm-compiler=baseline+ion \
--setpref=wasm_lazy_tiering_level=9 \
--setpref=wasm_lazy_tiering_synchronous=true \
--more-compartments poc-controlled.js
Fiabilité observée sur le shell pré-correctif Linux x86-64 compilé depuis les sources : 3/3
exécutions ont imprimé le marqueur et se sont terminées avec le code 0. Le shell corrigé correspondant lève l'erreur
RuntimeError: indirect call signature mismatch normale et ne l'imprime pas.
Le PoC contrôlé utilise des fonctions Debugger et GC propres au shell pour rendre la course déterministe. Il établit un contrôle natif dans jsshell, et non une livraison depuis une page web ou une évasion du sandbox de contenu Firefox.
Exécution avec un shell de débogage équivalent :
js --wasm-compiler=baseline --more-compartments poc.js
Il s'agit d'une preuve de régression de durée de vie, et non d'une primitive mémoire ou d'un exploit. Le marqueur apparaît sur les deux builds et ne résulte pas du UAF.