Google Chrome(123 及更早版本)中存在一个严重的远程代码执行漏洞,影响 WebAssembly (WASM) 垃圾回收类型处理。该漏洞允许类型混淆,进而可升级为任意内存读写并最终实现代码执行。
该漏洞源于 WASM 等递归 规范类型 ID 与 JavaScript 到 WASM 转换函数中使用的 wasm::HeapType / wasm::ValueType 表示之间的混淆。
关键的是,规范类型 ID 完全不受 kV8MaxWasmTypes 的限制——它可以增长到主机内存支持的大小。
ValueType 类使用一个 20 位字段 编码堆类型,但规范类型 ID 可能超过此限制。当一个规范类型 ID 如:
tn = t0 + 0x100000 * n
被截断为 20 位时,会与 t0 重叠,从而引发类型混淆攻击。
此外,匹配 kAny + 0x100000 * n(其中 kAny = 1000005)的规范类型 ID 会绕过类型检查,允许任意 WASM 类型混淆。
该咨询将利用过程分为三个阶段:
构造包含 1,000,000+ 种类型的 WASM 模块会导致规范类型 ID 回绕,从而混淆结构类型和引用类型。精心构造与 kAny 重叠的结构类型可绕过 JS 到 WASM 的类型检查。
通过修改 ArrayBuffer 的后备存储字段,攻击者获得任意地址写入能力,其中写入的值是元数据地址。这利用了 SlotSpanMetadata 结构来泄露 chrome.dll 地址并实现任意内存写入。
该利用程序劫持了 CodePointerTable 并将执行流程导向一个 ROP 链,该链将 shellcode 区域标记为可执行。
PoC 演示了:
kAny 重叠的结构类型以绕过 JS 到 WASM 的类型检查。这是 CVE-2024-2887 的一个变种,由 Manfred Paul 发现并在 Pwn2Own 温哥华 2024 上展示。它通过不同的向量利用了类似的类型规范化弱点。
Google Chrome 123 及更早版本。
在 Google Chrome 124 中修复。
Seunghyun Lee (Xion, @0x10n),2024 年 TyphoonPWN 参与者。