
QEMU 11.1.2 - Alta - Locale - UAF - xhci_complete residuo di 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
Classe: UAF (use-after-free dell'heap). Raggiungibilità: Locale (guest).
xhci_complete è ciò che resta di CVE-2026-17588. La patch della 11.1.2 protegge i due timer xHCI. Non protegge il percorso di completamento asincrono USB. Un guest che punta l'event ring al doorbell BAR ottiene comunque un TRB di 16 byte scritto via DMA nel doorbell 0 da xhci_complete, con il mem_reentrancy_guard di TYPE_XHCI già rilasciato. Quella scrittura esegue xhci_process_commands. Un CR_DISABLE_SLOT preparato libera l'XHCITransfer attivo mentre xhci_complete lo tiene ancora.
q35 include qemu-xhci. Il partner bulk in questo laboratorio è usb-uas. La stessa callback di completamento è raggiungibile da usb-storage, usb-redir e usb-host.
Un kernel guest su qemu-xhci più un dispositivo bulk asincrono può causare un UAF dell'heap del processo QEMU.
| ID | nessun CVE al momento |
| 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 |
| Prodotto | QEMU |
| Affetto | v11.1.2 (4fc49f46) |
| Auth | kernel guest su qemu-xhci (default q35) più bulk USB_RET_ASYNC |
| Licenza | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1:18700 solo qtest |
Chi: kernel guest non attendibile (o peer di USB passthrough). Da guest a host. Heap dello userspace QEMU.
| Metodo | Sink | Privilegio |
|---|---|---|
| ERST / ERDP del guest al doorbell BAR, poi completamento UAS asincrono | xhci_complete hw/usb/hcd-xhci.c:3282-3295 -> DMA di xhci_write_event | ASan heap-use-after-free di XHCITransfer mentre il completamento esterno lo tiene ancora. CR_DISABLE_SLOT recuperato dalla rientranza del doorbell. |
Stesso percorso, xhci_ep_nuke_xfers / xhci_ep_free_xfer | g_free(xfer) | Liberazione del transfer attivo e del contesto dell'endpoint. Double-free se il completamento libera di nuovo. |
Abort del processo QEMU sotto ASan. Senza ASan si tratta di un UAF dell'heap attivo nel processo dell'hypervisor: crash da guest a host, e riuso dedotto dell'XHCITransfer liberato.
Nessuna necessaria oltre all'enumerazione di qemu-xhci. Il default q35 lo include.
xhci_mfwrap_timer e xhci_ep_kick_timer impostano xhci->parent.mem_reentrancy_guard. Chiuso su questo pin.DeviceState UAS. Ciò che resta è l'oggetto xHCI tramite DMA dell'event ring, non un n-day del 2021 dell'oggetto UAS.Il laboratorio non dimostra il controllo di RIP né una shell da guest a host. La classe è l'UAF dell'heap del processo QEMU.
Ho fissato la v11.1.2 perché è la GA corrente e il tag che ha chiuso CVE-2026-17588. Mi sono concentrato su hw/usb/hcd-xhci.c e mi sono chiesto quali scrittori dell'event ring la patch avesse mancato.
I timer acquisiscono la guardia TYPE_XHCI. xhci_complete no. EHCI aveva già rimandato questa classe a un BH nel 2021. xHCI scrive ancora via DMA dalla callback di completamento USB.
Giri sbagliati: considerare sufficiente lo stato BH dell'UAS (protegge l'UAS, non xHCI); attendere l'HID NAK (timer, già corretto); volere un vero kernel guest invece del doorbell qtest + usb-uas.
cd lab
./run.sh
Prendi di mira solo 127.0.0.1:18700 (qtest) e 127.0.0.1:18701 (QMP). Pin è clonato da github.com/qemu/QEMU tag v11.1.2 / 4fc49f46. Build ASan. Loopback. Solo witness.
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
Replay: python3 qemu-xhci-complete-uaf-Abraxas-Labs.py.
Attivare xhci->parent.mem_reentrancy_guard per l'intera durata di xhci_complete, allo stesso modo in cui già fanno i due timer. Oppure rimandare xhci_try_complete_packet / xhci_kick_epctx su un BH protetto da TYPE_XHCI, come in EHCI. In entrambi i casi, la scrittura DMA sull'event ring non deve essere eseguita con la guardia disattivata.
4fc49f46dc95d4a27de2509e7fceb2931e91faebxhci_completeGNU Affero GPL v3.0. Vedi LICENSE. Solo laboratorio loopback. Nessuna garanzia.