
QEMU 11.1.2 – Hoch – Lokal – UAF – xhci_complete Überbleibsel von 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
Klasse: UAF (Heap-Use-after-free). Reichweite: Lokal (Gast).
xhci_complete ist der Überrest von CVE-2026-17588. Der Patch für 11.1.2 schützt die beiden xHCI-Timer. Er schützt nicht den asynchronen USB-Complete-Pfad. Ein Gast, der den Event-Ring auf die Doorbell-BAR richtet, erhält weiterhin einen 16-Byte-TRB, der per DMA aus xhci_complete in Doorbell 0 geschrieben wird, wobei der mem_reentrancy_guard vom TYPE_XHCI bereits aufgehoben ist. Dieser Schreibvorgang führt xhci_process_commands aus. Ein vorbereitetes CR_DISABLE_SLOT gibt den aktiven XHCITransfer frei, während xhci_complete ihn noch hält.
q35 liefert qemu-xhci mit. Der Bulk-Partner in diesem Lab ist usb-uas. Derselbe Complete-Callback ist auch von usb-storage, usb-redir und usb-host aus erreichbar.
Ein Gast-Kernel auf qemu-xhci plus einem asynchronen Bulk-Gerät kann einen UAF im Heap des QEMU-Prozesses auslösen.
| ID | noch keine CVE |
| CWE | CWE-416 |
| CVSS | Hoch: 8.2 CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H |
| Produkt | QEMU |
| Betroffen | v11.1.2 (4fc49f46) |
| Auth | Gast-Kernel auf qemu-xhci (q35-Standard) plus USB_RET_ASYNC Bulk |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1:18700 nur qtest |
Wer: nicht vertrauenswürdiger Gast-Kernel (oder USB-Passthrough-Peer). Gast-zu-Host. QEMU-Userspace-Heap.
| Methode | Sink | Privileg |
|---|---|---|
| Gast-ERST / ERDP an der Doorbell-BAR, dann asynchrones UAS-Complete | xhci_complete hw/usb/hcd-xhci.c:3282-3295 -> xhci_write_event DMA | ASan heap-use-after-free von XHCITransfer, während das äußere Complete ihn noch hält. CR_DISABLE_SLOT wird aus der Doorbell-Reentry abgerufen. |
Derselbe Pfad, xhci_ep_nuke_xfers / xhci_ep_free_xfer | g_free(xfer) | Freigabe des aktiven Transfers und des Endpoint-Kontexts. Double-Free, wenn Complete anschließend erneut freigibt. |
QEMU-Prozessabbruch unter ASan. Ohne ASan ist dies ein Live-Heap-UAF im Hypervisor-Prozess: Gast-zu-Host-Absturz und, abgeleitet, Wiederverwendung des freigegebenen XHCITransfer.
Nichts erforderlich außer der Enumeration von qemu-xhci. Der q35-Standard enthält es.
xhci_mfwrap_timer und xhci_ep_kick_timer setzen xhci->parent.mem_reentrancy_guard. Auf diesem Pin geschlossen.DeviceState geschützt. Der Überrest ist das xHCI-Objekt via Event-Ring-DMA, kein 2021er-n-day des UAS-Objekts.Das Lab demonstriert keine RIP-Kontrolle und keine Gast-zu-Host-Shell. Die Klasse ist Heap-UAF des QEMU-Prozesses.
Ich habe v11.1.2 gepinnt, weil das die aktuelle GA-Version und der Tag ist, der CVE-2026-17588 geschlossen hat. Ich habe mich mit hw/usb/hcd-xhci.c befasst und gefragt, welche Schreiber des Event-Rings der Patch übersehen hat.
Die Timer nehmen den TYPE_XHCI-Guard. xhci_complete nicht. EHCI hat diese Klasse bereits 2021 auf einen BH verlagert. xHCI schreibt weiterhin DMA aus dem USB-Complete-Callback.
Falsche Ansätze: den UAS-Status BH als ausreichend zu betrachten (er schützt UAS, nicht xHCI); auf HID NAK zu warten (Timer, bereits gepatcht); einen echten Gast-Kernel statt qtest doorbell + usb-uas zu wollen.
cd lab
./run.sh
Nur 127.0.0.1:18700 (qtest) und 127.0.0.1:18701 (QMP) anvisieren. Pin ist von github.com/qemu/QEMU Tag v11.1.2 / 4fc49f46 geklont. ASan-Build. Loopback. Nur 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.
Aktiviere xhci->parent.mem_reentrancy_guard für den gesamten Ablauf von xhci_complete, so wie es die beiden Timer bereits tun. Oder verschiebe xhci_try_complete_packet / xhci_kick_epctx auf einen TYPE_XHCI-geschützten BH, analog zu EHCI. In beiden Fällen darf das DMA-Schreiben in den Event-Ring nicht ausgeführt werden, solange der Guard nicht gesetzt ist.
4fc49f46dc95d4a27de2509e7fceb2931e91faebxhci_completeGNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.