
CVE-2026-78938에 대한 근본 원인 분석 및 동작하는 익스플로잇으로, 압축 힙 내 임의 읽기/쓰기로 이어지는 V8 TurboFan 타입 혼동입니다. 크래시 PoC 및 런타임 주소 지정 프리미티브를 포함합니다.
CVE-2026-78938에 대한 근본 원인 분석 및 익스플로잇입니다. 이는 Chrome 152.0.7977.64(V8 15.2.124.18)에서 수정된 V8 TurboFan 로드 제거(load elimination)의 타입 혼동 취약점입니다. 이 버그는 실제 환경에서 악용된 것으로 보고되었습니다.
이 익스플로잇은 버그를 out-of-bounds Float64Array로 변환한 다음, 이를 통해 addrof/fakeobj 및 V8 압축 힙(compressed heap)에 대한 임의 읽기/쓰기를 수행합니다. 초기 쓰기 이후의 모든 작업은 런타임에 위치가 결정됩니다. R/W 단계에는 하드코딩된 힙 오프셋이 없습니다.
50597b0bb48a — "[compiler] Invalidate tracked fields on CheckMaps with instance migration"macOS arm64에서 두 버전 모두 로컬로 빌드한 d8로 테스트했습니다.
| 파일 | 설명 |
|---|
pocs/crash.js | 최소 트리거. 취약한 빌드에서는 SIGBUS, 패치된 빌드에서는 정상 종료. |
pocs/rw_final.js | 전체 익스플로잇, 1단계: 트리거 + OOB 배열. 바이트 고정됨 — 아래 "재현" 참조. |
pocs/logic_final.js | 전체 익스플로잇, 2단계: addrof/fakeobj/임의 R\W, 1단계에서 런타임에 로드됨. |
WRITEUP.md | 전체 근본 원인 분석 및 익스플로잇 노트. |
두 d8 버전을 빌드한 후(정확한 커밋과 GN 인자는 WRITEUP.md 참조), 저장소 루트에서 다음을 실행합니다:
# crash PoC: 취약 버전에서는 SIGBUS, 패치 버전에서는 정상 종료
out/vuln/d8 --allow-natives-syntax --homomorphic-ic --max-valid-polymorphic-map-count=4 pocs/crash.js
out/patched/d8 --allow-natives-syntax --homomorphic-ic --max-valid-polymorphic-map-count=4 pocs/crash.js
# 전체 R/W: 취약 버전에서 동작, 패치 버전에서는 정상적으로 중단
out/vuln/d8 --allow-natives-syntax --homomorphic-ic --max-valid-polymorphic-map-count=4 pocs/rw_final.js
취약한 빌드에서 기대되는 출력:
[+] OOB Float64Array len=0x7f000004
[+] after write: victim2.z = 2.5
[+] fakeobj(hn|1) typeof=number
[+] ALL PRIMITIVES VERIFIED
중요한 두 가지 사항:
--homomorphic-ic --max-valid-polymorphic-map-count=4는 다형성 맵 피드백을 형성하여 최적화된 코드에서 마이그레이션 경로가 실행되도록 합니다. 이 플래그가 없으면 트리거는 조용히 아무것도 하지 않습니다.pocs/rw_final.js는 바이트 단위로 고정되어 있습니다. 단일 손상 쓰기는 피해 배열이 할당된 위치에 따라 달라지는 힙 상대 오프셋에 도달하며, 이는 다시 스크립트의 정확한 바이트와 경로에 따라 달라집니다. 파일을 편집하거나 이름을 바꾸면 고정된 오프셋이 무효화됩니다. 재보정 방법은 WRITEUP.md에 문서화되어 있습니다. pocs/logic_final.js는 트리거가 발생한 후에 로드되므로 자유롭게 편집할 수 있습니다.pocs/rw_final.js의 단일 쓰기 오프셋뿐입니다.이 저장소는 교육 및 방어 연구 목적으로 제공됩니다. 이 버그는 현재 Chrome에서 패치되었으며, 세부 사항은 V8 소스 트리에 공개되어 있습니다.