abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · qemu-xhci-complete-uaf
QEMU v11.1.2(4fc49f46dc95d4a27de2509e7fceb2931e91faeb)- qemu-xhci
类别: UAF(堆释放后使用)。可达性: 本地(客户机)。
xhci_complete 是 CVE-2026-17588 的遗留问题。11.1.2 的补丁保护了两个 xHCI 定时器,却没有保护异步 USB 完成路径。当客户机将事件环指向 doorbell BAR 时,xhci_complete 仍会向 doorbell 0 写入一个 16 字节的 TRB DMA,而此时 TYPE_XHCI 的 mem_reentrancy_guard 已经清除。该写入会执行 xhci_process_commands。一个预先准备好的 CR_DISABLE_SLOT 会释放仍然存活的 XHCITransfer,而 xhci_complete 仍持有该对象。
q35 默认搭载 qemu-xhci。本实验中的批量传输搭档是 usb-uas。同一个完成回调也可从 usb-storage、usb-redir 和 usb-host 到达。
在 qemu-xhci 上运行的客户机内核,配合一个异步批量设备,即可对 QEMU 进程堆造成 UAF。
| ID | 暂无 CVE |
| CWE | CWE-416 |
| CVSS | 高危:8.2 CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H |
| 产品 | QEMU |
| 受影响版本 | v11.1.2(4fc49f46) |
| 认证 | qemu-xhci(q35 默认)上的客户机内核,外加 USB_RET_ASYNC 批量传输 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 127.0.0.1:18700 仅 qtest |
攻击者:不受信任的客户机内核(或 USB 直通对端)。客户机到宿主机。QEMU 用户态堆。
| 方法 | 汇聚点 | 权限 |
|---|---|---|
| 客户机将 ERST / ERDP 指向 doorbell BAR,然后触发异步 UAS 完成 | xhci_complete hw/usb/hcd-xhci.c:3282-3295 -> xhci_write_event DMA | 对 XHCITransfer 的 ASan 堆释放后使用,而外层完成仍持有该对象。CR_DISABLE_SLOT 从 doorbell 重入中被取出。 |
同一路径,xhci_ep_nuke_xfers / xhci_ep_free_xfer | g_free(xfer) | 释放仍然存活的传输和端点上下文。若完成后再释放一次,则构成双重释放。 |
QEMU 进程在 ASan 下中止。没有 ASan 时,这是虚拟机监控器进程中的真实堆 UAF:客户机到宿主机崩溃,并可推断出对已释放 XHCITransfer 的复用。
除枚举 qemu-xhci 外无需任何操作。q35 默认即包含。
xhci_mfwrap_timer 和 xhci_ep_kick_timer 会设置 xhci->parent.mem_reentrancy_guard。在此版本上已关闭。DeviceState 上受保护。遗留问题是经由事件环 DMA 的 xHCI 对象,而非 2021 年的 UAS 对象 n-day。本实验未演示 RIP 控制或客户机到宿主机的 shell。此类漏洞是 QEMU 进程的堆 UAF。
我锁定 v11.1.2,因为它是当前 GA 版本,也是关闭 CVE-2026-17588 的标签。我专注于 hw/usb/hcd-xhci.c,追问补丁遗漏了哪些事件环写入者。
定时器会获取 TYPE_XHCI 保护。xhci_complete 不会。EHCI 早在 2021 年就已将此类操作推迟到 BH 上。xHCI 仍然从 USB 完成回调中写入 DMA。
错误转向:认为 UAS 状态 BH 已经足够(它保护的是 UAS,而不是 xHCI);等待 HID NAK(定时器,已打补丁);想要一个真正的客户机内核,而不是 qtest doorbell + usb-uas。
cd lab
./run.sh
仅针对 127.0.0.1:18700(qtest)和 127.0.0.1:18701(QMP)。Pin 克隆自 github.com/qemu/QEMU 标签 v11.1.2 / 4fc49f46。ASan 构建。回环。仅见证。
SUCCESS qemu-xhci-complete-uaf how=ERROR: AddressSanitizer: heap-use-after-free erst=doorbell async=1 success=1 disable-slot-fetch=1 QEMU-XHCI-COMPLETE-UAF-WITNESS
复现:python3 qemu-xhci-complete-uaf-Abraxas-Labs.py。
在整个 xhci_complete 过程中启用 xhci->parent.mem_reentrancy_guard,与两个定时器已有的做法相同。或者将 xhci_try_complete_packet / xhci_kick_epctx 延迟到受 TYPE_XHCI 保护的 BH 上执行,与 EHCI 保持一致。无论采用哪种方式,在向事件环写入 DMA 时都不能在保护未启用的状态下运行。
4fc49f46dc95d4a27de2509e7fceb2931e91faebxhci_completeGNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。不提供任何担保。