
Chaîne d'exploitation de preuve de concept pour le JIT de Firefox CVE-2026-2764, enchaînant une erreur de compilation JIT et une use-after-free en lecture/écriture arbitraire et exécution de shellcode WASM.
Statut : analyse + PoC validé. Armement de la primitive en cours.
Une chaîne de style WasmBlazeFox basée cette fois sur un bug de 2026 : CVE-2026-2764, une « miscompilation JIT + use-after-free » IonMonkey/baseline dans le composant JavaScript Engine: JIT, corrigée dans Firefox 148 (MFSA 2026-13, CVSS à déterminer). Même finalité que CVE-2024-29943-but-with-wasm : injecter la primitive dans une page JIT WASM remplie de constantes de shellcode.
Le bug Bugzilla 2012608 est restreint, mais le correctif a été fusionné publiquement :
hg 1b58f51668d3 — « Bug 2012608 : appeler CreateThis directement depuis
PBL » : PortableBaselineInterpret.cpp a cessé d'acheminer la création de
this des constructeurs scriptés via CreateThisFromIC (qui relisait
l'état de l'IC) et appelle désormais js::CreateThis directement avec des
valeurs correctement ancrées.hg 3adad00d0042 — mise en forme/documentation du contrat createThis de
BaselineCacheIRCompiler.cpp (argc doit inclure les arguments spread).hg 57885d520e85 — les tests de régression (nos PoC).Mode de défaillance : sur new Ctor(...arr) / Reflect.construct avec un
Proxy comme newTarget, le piège get du proxy s'exécute pendant que le
moteur est entre l'étalement des arguments et la création de this. Ce
callback peut muter ou libérer le tableau même que le moteur est en train
d'étaler, et le moteur continue avec des hypothèses obsolètes :
arr[0] échangé d'int vers objet après l'instantané de
l'étalement (poc-typeconfusion.js)arr.length = 0; gc() libère le stockage des éléments en
plein étalement (poc-uaf.js)Contre la nightly jsshell de mozilla-central du 2026-02-09
(JavaScript-C149.0a1, linux x86-64, pré-correctif), dans un conteneur
Docker x86_64 :
./js poc-typeconfusion.js -> Error: Assertion failed: got "oops", expected 1
./js poc-uaf.js -> Segmentation fault
Les deux PoC sont les tests de régression de Mozilla eux-mêmes, reproduits à l'identique.
poc-typeconfusion.js (controllable argument-value confusion, no crash)
-> Ion-optimize a constructor that makes baked type assumptions on its
spread arguments; swap in an object where an int32 was proven
-> addrof / fakeobj
-> corrupt TypedArray length -> arbitrary R/W
-> WASM JIT shellcode stage (same as CVE-2024-29943-but-with-wasm:
f64.const immediates, FuncExport entry-offset overwrite)
L'étape WASM et le code de parcours d'offsets sont portés sans modification,
sauf les offsets à redériver pour la build de l'ère FF149 (voir
CVE-2024-29943-but-with-wasm/test.gdb pour la recette).
1b58f51668d3, 3adad00d0042, tests
57885d520e85