ad3210/CVE-2024-2887-REPORT

GitHub: ad3210/CVE-2024-2887-REPORT

该项目是 Google Chrome WASM 类型混淆漏洞 CVE-2024-2887 变体的安全研究报告与概念验证代码,揭示了从类型混淆到远程代码执行的完整利用链。

Stars: 0 | Forks: 1

# SSD 安全通告 – Google Chrome RCE ## 概述 Google Chrome(版本 123 及更早版本)中存在一个严重的远程代码执行漏洞,该漏洞影响 WebAssembly (WASM) 的垃圾回收类型处理机制。此 Bug 允许发生类型混淆,进而可被升级为任意内存读写,并最终实现代码执行。 ## 漏洞详情 该漏洞源于 WASM isorecursive **canonical type ID** 与 JavaScript 到 WASM 转换函数中使用的 `wasm::HeapType` / `wasm::ValueType` 表示之间的混淆。 关键在于,canonical type ID *并未*以任何方式受限于 `kV8MaxWasmTypes` —— 它可以增长到宿主内存支持的最大容量。 ### 根本原因 `ValueType` 类将 heap type 编码在一个 **20 位字段**中,但 canonical type ID 可以超过此限制。当如下所示的 canonical type ID: ``` tn = t0 + 0x100000 * n ``` 被截断为 20 位时,它会与 `t0` 发生别名冲突,从而使得类型混淆攻击成为可能。 此外,匹配 `kAny + 0x100000 * n`(其中 `kAny = 1000005`)的 canonical type ID 会绕过类型检查,并允许任意的 WASM 类型混淆。 ## 漏洞利用 该安全通告分三个阶段描述了漏洞利用过程: ### 1. 通过 JS 到 WASM 边界进行类型混淆 精心构造包含 1,000,000 个以上类型的 WASM 模块会导致 canonical type ID 发生回绕,从而实现 struct type 和 reference type 之间的混淆。经过精心构造以与 `kAny` 产生别名冲突的 struct type 能够绕过 JS 到 WASM 的类型检查。 ### 2. 滥用 PartitionAlloc 元数据 通过修改 `ArrayBuffer` 的 backing-store 字段,攻击者可以获得任意地址写入权限,其中写入的值即为元数据地址。此过程利用了 `SlotSpanMetadata` 结构来泄漏 `chrome.dll` 地址并实现任意内存写入。 ### 3. 代码执行 该漏洞利用手法劫持了 `CodePointerTable`,并将执行流转移到一条 ROP chain 上,以将 shellcode 区域标记为可执行。 ## 概念验证概述 该 PoC 演示了以下内容: - 堆叠 1,000,000 个以上的规范化类型以触发回绕。 - 创建与 `kAny` 产生别名冲突的 struct type,以绕过 JS 到 WASM 的类型检查。 - 利用类型混淆来读取任意内存位置。 - 滥用 PartitionAlloc 元数据以实现沙箱逃逸和 RCE。 ## 与先前研究的关系 这是 **CVE-2024-2887** 的一个变体,由 Manfred Paul 发现并在 2024 年于温哥华举办的 Pwn2Own 上演示。它通过另一种途径利用了类似的类型规范化弱点。 ## 受影响版本 Google Chrome 123 及更早版本。 ## 供应商回应 已在 Google Chrome 124 中修复。 ## 致谢 Seunghyun Lee (Xion, [@0x10n](https://twitter.com/0x10n)),TyphoonPWN 2024 参赛者。
标签:AI工具, Google Chrome, Go语言工具, WebAssembly, Web报告查看器, 内存安全, 后端开发, 数据可视化, 类型混淆, 编程工具, 远程代码执行