
QEMU 11.1.2 - Alta - Local - UAF - xhci_complete remanente de CVE-2026-17588 doorbell DMA
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · qemu-xhci-complete-uaf
QEMU v11.1.2 (4fc49f46dc95d4a27de2509e7fceb2931e91faeb) - qemu-xhci
Clase: UAF (use-after-free en el heap). Alcance: Local (invitado).
xhci_complete es el remanente de CVE-2026-17588. El parche de 11.1.2 protege los dos temporizadores de xHCI. No protege la ruta de finalización asíncrona de USB. Un invitado que apunta el anillo de eventos al BAR de doorbell todavía consigue que se escriba por DMA un TRB de 16 bytes en el doorbell 0 desde xhci_complete, con el mem_reentrancy_guard de TYPE_XHCI ya despejado. Esa escritura ejecuta xhci_process_commands. Un CR_DISABLE_SLOT preparado libera el XHCITransfer activo mientras xhci_complete todavía lo mantiene.
q35 incluye qemu-xhci. El dispositivo bulk asociado en este laboratorio es usb-uas. El mismo callback de finalización es alcanzable desde usb-storage, usb-redir y usb-host.
Un kernel invitado sobre qemu-xhci más un dispositivo bulk asíncrono puede provocar un UAF en el heap del proceso QEMU.
| ID | aún sin CVE |
| CWE | CWE-416 |
| CVSS | Alto: 8.2 CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H |
| Producto | QEMU |
| Afectado | v11.1.2 (4fc49f46) |
| Autenticación | kernel invitado sobre qemu-xhci (predeterminado en q35) más bulk USB_RET_ASYNC |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | 127.0.0.1:18700 solo qtest |
Quién: kernel invitado no confiable (o par de passthrough USB). De invitado a host. Heap del espacio de usuario de QEMU.
| Método | Destino | Privilegio |
|---|---|---|
| ERST / ERDP del invitado en el BAR de doorbell, luego finalización asíncrona de UAS | xhci_complete hw/usb/hcd-xhci.c:3282-3295 -> DMA de xhci_write_event | heap-use-after-free bajo ASan de XHCITransfer mientras la finalización externa todavía lo mantiene. CR_DISABLE_SLOT obtenido desde la reentrada del doorbell. |
Misma ruta, xhci_ep_nuke_xfers / xhci_ep_free_xfer | g_free(xfer) | Liberación de la transferencia activa y del contexto del endpoint. Doble liberación si la finalización vuelve a liberar. |
Aborto del proceso QEMU bajo ASan. Sin ASan esto es un UAF en el heap activo dentro del proceso del hipervisor: caída de invitado a host, y reutilización inferida del XHCITransfer liberado.
No se requiere nada más allá de enumerar qemu-xhci. El predeterminado de q35 lo incluye.
xhci_mfwrap_timer y xhci_ep_kick_timer establecen xhci->parent.mem_reentrancy_guard. Cerrada en esta versión fijada.DeviceState de UAS. El remanente es el objeto xHCI vía DMA del anillo de eventos, no un n-day de 2021 del objeto UAS.El laboratorio no demuestra control de RIP ni una shell de invitado a host. La clase es UAF en el heap del proceso QEMU.
Fijé v11.1.2 porque es la GA actual y la etiqueta que cerró CVE-2026-17588. Me detuve en hw/usb/hcd-xhci.c y me pregunté qué escritores del anillo de eventos pasó por alto el parche.
Los temporizadores toman el guard de TYPE_XHCI. xhci_complete no. EHCI ya difirió esta clase a un BH en 2021. xHCI todavía escribe por DMA desde el callback de finalización de USB.
Errores de enfoque: considerar suficiente el estado BH de UAS (protege UAS, no xHCI); esperar el NAK de HID (temporizador, ya parcheado); querer un kernel invitado real en lugar de qtest doorbell + usb-uas.
cd lab
./run.sh
Dirígete solo a 127.0.0.1:18700 (qtest) y 127.0.0.1:18701 (QMP). Pin se clona desde github.com/qemu/QEMU tag v11.1.2 / 4fc49f46. Compilación ASan. Loopback. Solo testigo.
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
Reproducción: python3 qemu-xhci-complete-uaf-Abraxas-Labs.py.
Emplear xhci->parent.mem_reentrancy_guard durante todo xhci_complete, de la misma manera que ya lo hacen los dos temporizadores. O diferir xhci_try_complete_packet / xhci_kick_epctx a un BH protegido por TYPE_XHCI, igual que EHCI. En cualquier caso, la escritura por DMA en el anillo de eventos no debe ejecutarse con el guard desactivado.
4fc49f46dc95d4a27de2509e7fceb2931e91faebxhci_completeGNU Affero GPL v3.0. Véase LICENSE. Solo laboratorio de loopback. Sin garantía.