
CVE-2026-2766, 하지만 wasm 사용
상태: 검증된 크래시 PoC, 제어 흐름 하이재킹 시연 완료
(디버그 셸에서 크래시 pc = 해제된 셀 포이즌 0xcdcdcdcdcdcdcdcd
— 엔진이 해제된 ICScript에서 읽어낸 포인터로 점프함).
남은 작업: 재점유된 바이트를 제어하는 것. research/README.md 참조.
2026년 버그에 대한 WasmBlazeFox 계열 체인: CVE-2026-2766, "JavaScript Engine의 JIT 오컴파일 / use-after-free: JIT 컴포넌트", Firefox 148에서 수정됨 (MFSA 2026-13). 최종 목표는 CVE-2024-29943-but-with-wasm과 동일하다: 프리미티브를 코드 포인터 제어로 전환하고, 셸코드 상수로 가득 찬 WASM JIT 페이지를 겨냥하는 것.
Mozilla 자체의 회귀 테스트 주석(bug 2013583, 테스트는 hg 457b68097f81에 랜딩됨)과 js/src/jit/JitScript.h의 ICScript Lifetimes SMDOC에서:
removeInlinedChild를 호출 → 자식의 ICScript가 에서 제거되지만, 여전히 의 벡터에 의해 참조됨 — 그리고 치명적으로, 호출자의 IC 체인에 여전히 남아 있는 오래된 스텁에 의해 참조됨.inlinedChildren_InliningRootinlinedScripts_CallInlinedFunctiongczeal(14, 1), 즉 매 할당마다 ZealCompactValue)가 고아가 된 ICScript를 이동/대피시키는 동안 오래된 스텁 체인은 이전 주소를 유지함.0xe5로 포이즌되어 매우 읽기 쉬운 크래시를 제공함.취약 빌드: mozilla-central rev b3663be61a1a (2026-01-15 나이틀리; 수정은 2026-01-15와 2026-02-09 사이에 랜딩됨 — 2월 9일 나이틀리는 생존함). 셸: 해당 rev의 Taskcluster linux64-fuzzing-asan-opt jsshell (gczeal에 필요; 릴리스-opt 셸에는 없음).
./js --ion-warmup-threshold=100000 poc.js
== ERROR: AddressSanitizer: SEGV on unknown address 0xe5e5e5e5e5e5e5e5
The signal is caused by a READ memory access.
#0-#3 <unknown module> <- baseline JIT code
#4 EnterJit / MaybeEnterJit <- js/src/jit/Jit.cpp
#10 js::jit::DoCallFallback <- BaselineIC.cpp (the stale IC chain)
rdi = 0xe5e5e5e5e5e5e5e5 <- the freed ICScript
역참조는 오래된 스텁 체인을 순회하는 baseline JIT 코드에서 발생함: 재점유된 셀의 제어 = baseline이 신뢰하는 ICEntry/스텁 필드의 제어, 여기에는 점프하는 스텁 코드 포인터도 포함됨.
orphaned ICScript (this PoC)
-> compacting GC moves it; stale chain keeps old address
-> reclaim the old cell with controlled bytes (size-class spray)
-> baseline reads fake ICEntry -> fake ICStub -> fake code_ pointer
-> jump into the WASM JIT page shellcode (f64.const immediates,
FuncExport entry-offset overwrite — see the 2024-29943 repo)
전체 무기화 로그는 research/README.md를 참조. 현재 상황 요약:
TrailingArray) ICScript에 대한 use-after-move — 원칙적으로 크기 클래스별 버퍼로 스프레이-재점유 가능함.new Ctor(flag) 호출 내부에서 마이크로초 간격으로 발생하며, 그 사이에 JS 콜백 지점이 없음; 순진한 스프레이는 윈도우를 놓치거나(reclaim1/2) zeal GC 폭풍으로 IC 상태를 쓸어버림(reclaim3). 오래된 체인은 단일 일반 gc()는 견딤(purge_check).WASM 단계 자체는 이미 CVE-2024-29943-but-with-wasm에서 구축되고 시연됨; 이 FF149 시대 빌드에 맞춰 객체 모델 오프셋만 다시 도출하면 됨.
poc.js — Mozilla의 회귀 테스트(bug 2013583), 위에 표시된 대로 2026-01-15 ASAN jsshell을 크래시시키는 것으로 검증됨.457b68097f81