0xCyberstan/cxl-mailbox-overflow
GitHub: 0xCyberstan/cxl-mailbox-overflow
针对 QEMU CXL Type 3 邮箱模拟中三个漏洞的 PoC,通过越界读取、堆溢出和任意写漏洞链实现完整的客户机到宿主机逃逸并绕过 ASLR。
Stars: 1 | Forks: 0
# cxl-mailbox-overflow
针对 QEMU 的 CXL Type 3 邮箱模拟(`hw/cxl/cxl-mailbox-utils.c`)中三个可由客户机触发的漏洞的 PoC(概念验证)。包含越界读取、堆溢出,以及通过 write-what-where 漏洞链实现的完整带有 ASLR 绕过的客户机到宿主机逃逸。已在 QEMU v11.0.0-rc2 上测试。
## 漏洞
**漏洞 1 (cxl-escape-poc.c):** `cmd_logs_get_log` 中的越界读取。CEL 日志边界检查与指针算术运算中的字节偏移量与元素偏移量之间存在类型混淆,导致范围扩大了 4 倍。泄漏 QEMU .text 指针,通过单个邮箱命令即可绕过 PIE/ASLR。
**漏洞 2 (cxl-mbox-test.c, 测试 1):** `cmd_ccls_get_lsa` 中的堆缓冲区溢出。客户机控制的长度虽然针对 LSA 备用存储大小进行了检查,但并未针对 2048 字节的 payload 缓冲区进行检查。使用攻击者可控的内容覆盖相邻的 CXLDeviceState 字段。不会触发 ASan(7MB QOM 分配中对象内部的溢出)。
**漏洞 3 (cxl-mbox-test.c, 测试 2):** `cmd_features_set_feature` 中的 write-what-where 漏洞。六个 UUID 分支(soft_ppr, hard_ppr, cacheline_sparing, row_sparing, bank_sparing, rank_sparing)接受客户机控制的偏移量 (0-65535) 和 payload 大小,且没有进行边界检查。patrol_scrub 和 ecs 具有的相同验证在这些分支中完全缺失。
## 逃逸利用链
漏洞 1 和 2 可链接起来,通过四个邮箱命令实现确定性的客户机到宿主机逃逸:
1. **Get Log** 使用精心构造的偏移量泄漏 handler 函数指针,从而获得 PIE 基址。
2. **Set LSA** 在 LSA 中的精确偏移位置植入一个伪造的 `cxl_cmd` 条目(handler = `system@plt`,name = `/tmp/x`),以便在溢出后恰好命中 `cxl_cmd_set[0][0]`。
3. **Get LSA** 设置 length=2680 导致 2048 字节的 payload 缓冲区溢出,从而将伪造的 handler 安装到命令分派表中。
4. **Command (set=0, cmd=0)** 分派至 `system("/tmp/x")`,在宿主机上执行攻击者控制的脚本。
完整的 ASLR 绕过,无需暴力破解,无需访问 /proc。
## 文件
- `poc/cxl-escape-poc.c` - 完整逃逸利用链 qtest PoC(链接了漏洞 1 + 2)
- `poc/cxl-mbox-test.c` - 带有 ASan 验证的独立漏洞 PoC(漏洞 2 + 3)
## 构建与运行
在 Ubuntu 24.04、GCC 13.3.0、QEMU commit `b6a7d06213` (v11.0.0-rc2) 上测试。
### 环境配置
克隆此仓库及存在漏洞的 QEMU commit:
```
git clone https://github.com/0xCyberstan/cxl-mailbox-overflow.git
git clone https://gitlab.com/qemu-project/qemu.git
cd qemu && git checkout b6a7d06213
```
### 独立漏洞(附带 ASan)
将测试文件复制到 QEMU 目录树中,并在构建中注册:
```
cp ../cxl-mailbox-overflow/poc/cxl-mbox-test.c tests/qtest/
```
在 `tests/qtest/meson.build` 中的 `'cxl-test'` 旁添加 `'cxl-mbox-test'`:
```
- (config_all_devices.has_key('CONFIG_CXL') ? ['cxl-test'] : [])
+ (config_all_devices.has_key('CONFIG_CXL') ? ['cxl-test', 'cxl-mbox-test'] : [])
```
构建并运行:
```
mkdir build && cd build
../configure --enable-asan --target-list=x86_64-softmmu --enable-debug
ninja -j$(nproc)
QTEST_QEMU_BINARY=./qemu-system-x86_64 ./tests/qtest/cxl-mbox-test --verbose
```
### 完整逃逸利用链(不带 ASan)
该利用链需要稳定的二进制文件偏移量,因此必须关闭 ASan。`cxl-escape-poc.c` 中的硬编码值(SYSTEM_PLT_OFFSET, IDENTIFY_HANDLER_OFFSET)是特定于上述确切构建版本的。如果您使用不同的编译器、优化级别或 QEMU commit 进行构建,则需要更新它们:
```
objdump -t build/qemu-system-x86_64 | grep system@plt
objdump -t build/qemu-system-x86_64 | grep cmd_infostat_identify
```
对于结构布局偏移量,请使用 GDB:
```
(gdb) ptype /o CXLType3Dev
```
一旦确认或更新了偏移量,将逃逸 PoC 复制到 QEMU 目录树中:
```
cp ../cxl-mailbox-overflow/poc/cxl-escape-poc.c tests/qtest/
```
按照上述相同方式,在 `tests/qtest/meson.build` 中添加 `'cxl-escape-poc'`。
构建并运行:
```
cd build
../configure --target-list=x86_64-softmmu
ninja -j$(nproc) qemu-system-x86_64 tests/qtest/cxl-escape-poc
rm -f /tmp/pwned-by-cxl-guest /tmp/x
QTEST_QEMU_BINARY=./qemu-system-x86_64 tests/qtest/cxl-escape-poc
cat /tmp/pwned-by-cxl-guest
```
## 策略说明
CXL 模拟不属于 QEMU 安全支持的虚拟化用例的一部分。这些漏洞已于 2026 年 4 月报告给 qemu-security,并根据已发布的策略被归类为非安全问题。完整分析详情请见我的博客:[链接]
标签:ASLR绕过, CVE, CXL, Exploit, PoC, QEMU, qtest, 任意写, 内存泄漏, 内存破坏, 内联执行, 堆溢出, 客户端加密, 数字签名, 暴力破解, 沙箱逃逸, 硬件仿真, 类型混淆, 虚拟化安全, 虚拟机逃逸, 越界读取