
Mozilla JavaScript 엔진의 WebAssembly use-after-free 취약점 재현으로, 결정적 경쟁 조건을 시연하고 통제된 개념 증명을 제공합니다.
화려하지 않은 재현입니다. 기본 설정에는 약간의 조정이 필요했습니다.
Mozilla는 이 이슈를 WebAssembly use-after-free로 설명합니다. 공개
수정본 9823b5c86ffa는 정확히 트래핑하는 wasm::Code를 JitActivation에
살아 있게 유지합니다.
이 테스트는 잘못된 시그니처의 교차 인스턴스 꼬리 호출을 수행합니다. Debugger 언와인드 훅은 테이블의 마지막 대상 참조를 해제하고, 엔진이 트랩을 처리하는 동안 축소 GC를 강제합니다. 꼬리 호출에 진입하기 전에 Wasm은 마커를 출력하는 일반 JavaScript import를 호출합니다.
9b564f641a42: 상태 139 (SIGSEGV).9823b5c86ffa: PASS: trap handled after target release를 출력하고
0으로 종료합니다.poc-controlled.js는 대상의 공유 스텁 할당을 144개의
import로 확장합니다. 그 오래된 throw 연속체는 4개의 실행 가능한
페이지 중 하나에 위치합니다. 사전 생성된 lazy-tier 캐리어는 4페이지 최적화 코드 세그먼트에
6,000개의 고유 SIMD 상수를 포함합니다. 예외 언와인드 중에 GC는 대상을
해제하고 동기식 티어링이 그 구멍을 재사용합니다. 64바이트마다 syscall 런웨이가
를 출력하고 을 호출합니다.
UAF NACHOSexit_group(0)실행:
js --wasm-compiler=baseline+ion \
--setpref=wasm_lazy_tiering_level=9 \
--setpref=wasm_lazy_tiering_synchronous=true \
--more-compartments poc-controlled.js
소스 빌드 Linux x86-64 수정 전 셸에서 관찰된 신뢰성: 3/3
실행이 마커를 출력하고 0으로 종료했습니다. 일치하는 수정된 셸은 일반적인
RuntimeError: indirect call signature mismatch를 발생시키며 이를 출력하지 않습니다.
통제된 PoC는 셸 전용 Debugger 및 GC 함수를 사용하여 경쟁을 결정적으로 만듭니다. 이는 jsshell에서 네이티브 제어를 확립하며, 웹 페이지에서의 전달이나 Firefox 콘텐츠 샌드박스 탈출이 아닙니다.
동등한 디버그 셸로 실행:
js --wasm-compiler=baseline --more-compartments poc.js
이는 수명 주기 회귀 증거이며, 메모리 프리미티브나 익스플로잇이 아닙니다. 마커는 두 빌드 모두에 나타나며 UAF로 인한 결과가 아닙니다.