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报告查看器, 内存安全, 后端开发, 数据可视化, 类型混淆, 编程工具, 远程代码执行