针对 CVE-2026-78938 的根因分析与漏洞利用,这是 V8 TurboFan 加载消除中的一个类型混淆漏洞,已在 Chrome 152.0.7977.64(V8 15.2.124.18)中修复。该漏洞被报告已在野外被利用。
该漏洞利用将缺陷转化为越界 Float64Array,进而实现 addrof / fakeobj 以及针对 V8 压缩堆的任意读写。初始写入之后的所有操作均在运行时定位——读写阶段没有硬编码的堆偏移。
50597b0bb48a — “[compiler] Invalidate tracked fields on CheckMaps with instance migration”已在 macOS arm64 上针对本地构建的两个版本的 d8 进行测试。
| 文件 | 说明 |
|---|---|
pocs/crash.js | 最小化触发器。在易受攻击的构建上触发 SIGBUS,在已修补的构建上正常退出。 |
pocs/rw_final.js | 完整漏洞利用,阶段 1:触发器 + 越界数组。已冻结——参见下方“复现”。 |
pocs/logic_final.js | 完整漏洞利用,阶段 2:addrof/fakeobj/任意读写,由阶段 1 在运行时加载。 |
WRITEUP.md | 完整的根因分析与利用说明。 |
构建两个 d8 版本(确切的提交和 GN 参数参见 WRITEUP.md),然后从仓库根目录执行:
# 崩溃 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
# 完整读写:在易受攻击版本上有效,在已修补版本上干净退出
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 源码树中公开。