
Firefox JIT CVE-2026-2764에 대한 개념 증명(PoC) 익스플로잇 체인으로, JIT 오컴파일과 use-after-free를 연결하여 임의 읽기/쓰기 및 WASM 셸코드 실행을 달성합니다.
상태: 분석 + 검증된 PoC. 프리미티브 무기화 진행 중.
이번에는 2026년 버그를 기반으로 한 WasmBlazeFox 스타일 체인: CVE-2026-2764, JavaScript Engine: JIT 구성 요소의 IonMonkey/baseline "JIT 오류 컴파일 + use-after-free", Firefox 148에서 수정됨(MFSA 2026-13, CVSS 미정). CVE-2024-29943-but-with-wasm과 동일한 종착점: 프리미티브를 셸코드 상수로 가득 찬 WASM JIT 페이지에 공급.
Bugzilla 버그 2012608은 제한되어 있지만, 수정 사항은 공개 저장소에 반영됨:
hg 1b58f51668d3 — "Bug 2012608: Call CreateThis directly from PBL":
PortableBaselineInterpret.cpp가 스크립트 생성자(constructor)의
this 생성 경로를 CreateThisFromIC(IC 상태를 다시 읽음)를 경유하지 않고,
올바르게 루팅된 값을 사용해 js::CreateThis를 직접 호출하도록 변경.hg 3adad00d0042 — BaselineCacheIRCompiler.cpp의
createThis 계약에 대한 형식/문서 수정(argc에 spread 인자가 포함되어야 함).hg 57885d520e85 — 회귀 테스트(우리의 PoC).실패 모드: newTarget으로 Proxy를 사용하는 new Ctor(...arr) /
Reflect.construct에서, 엔진이 인자를 스프레드하고 this를 생성하는 사이에
proxy의 get 트랩이 실행됨. 이 콜백은 엔진이 스프레드 중인 배열 자체를
변경하거나 해제할 수 있으며, 엔진은 오래된(stale) 가정을 유지한 채 계속 실행됨:
arr[0]이 int에서 object로 교체됨
(poc-typeconfusion.js)arr.length = 0; gc()가 스프레드 중간에 elements 저장소를 해제함
(poc-uaf.js)수정 전 x86_64 Docker 컨테이너에서 2026-02-09 mozilla-central 야간 jsshell
(JavaScript-C149.0a1, linux x86-64) 기준:
./js poc-typeconfusion.js -> Error: Assertion failed: got "oops", expected 1
./js poc-uaf.js -> Segmentation fault
두 PoC 모두 Mozilla 자체 회귀 테스트를 그대로 사용한 것입니다.
poc-typeconfusion.js (제어 가능한 인자 값 혼동, 크래시 없음)
-> 스프레드 인자에 대해 고정된 타입 가정을 만드는 생성자를 Ion 최적화;
int32가 증명된 자리에 객체를 교체
-> addrof / fakeobj
-> TypedArray 길이를 손상시켜 임의 R/W 확보
-> WASM JIT 셸코드 스테이지 (CVE-2024-29943-but-with-wasm과 동일:
f64.const 즉시값, FuncExport 엔트리 오프셋 덮어쓰기)
WASM 스테이지와 오프셋 탐색 코드는 오프셋만 FF149 시대 빌드에 맞게 다시
도출하면 그대로 이식됩니다(방법은
CVE-2024-29943-but-with-wasm/test.gdb 참조).
1b58f51668d3, 3adad00d0042, 테스트 57885d520e85