
Proof-of-concept цепочка эксплойтов для Firefox JIT CVE-2026-2764, объединяющая некорректную JIT-компиляцию и use-after-free в произвольное чтение/запись и выполнение WASM-шеллкода.
Статус: анализ + подтверждённый PoC. Доведение примитива до эксплойта в процессе.
Цепочка в стиле WasmBlazeFox, на этот раз на баге 2026 года: CVE-2026-2764, IonMonkey/baseline «JIT-мискомпиляция + use-after-free» в компоненте JavaScript Engine: JIT, исправленная в Firefox 148 (MFSA 2026-13, CVSS TBD). Финал тот же, что и в CVE-2024-29943-but-with-wasm: передать примитив в WASM-JIT-страницу, заполненную константами шеллкода.
Баг 2012608 в Bugzilla имеет ограниченный доступ, но фикс попал в публичный доступ:
hg 1b58f51668d3 — "Bug 2012608: Call CreateThis directly from PBL":
PortableBaselineInterpret.cpp перестал направлять создание this для
скриптовых конструкторов через CreateThisFromIC (которая заново читала состояние IC) и теперь
вызывает js::CreateThis напрямую с корректно закреплёнными (rooted) значениями.hg 3adad00d0042 — форматирование/документация по контракту
в (argc должен включать spread-аргументы).createThisBaselineCacheIRCompiler.cpphg 57885d520e85 — регрессионные тесты (наши PoC).Режим отказа: при new Ctor(...arr) / Reflect.construct с Proxy в роли
newTarget, ловушка get прокси выполняется в тот момент, когда движок находится между
разворачиванием аргументов и созданием this. Этот колбэк может изменить или
освободить тот самый массив, который движок разворачивает, и движок продолжает с
устаревшими предположениями:
arr[0] заменён с int на object после снимка spread-аргументов
(poc-typeconfusion.js)arr.length = 0; gc() освобождает хранилище элементов в середине разворачивания
(poc-uaf.js)Проверено на ночном jsshell mozilla-central от 2026-02-09 (JavaScript-C149.0a1,
linux x86-64, до фикса), в x86_64 Docker-контейнере:
./js poc-typeconfusion.js -> Error: Assertion failed: got "oops", expected 1
./js poc-uaf.js -> Segmentation fault
Оба PoC — это собственные регрессионные тесты Mozilla, без изменений.
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)
WASM-этап и код обхода смещений переносятся без изменений, кроме смещений,
которые нужно пересчитать для сборки времён FF149 (рецепт см. в
CVE-2024-29943-but-with-wasm/test.gdb).
1b58f51668d3, 3adad00d0042, тесты 57885d520e85