
QEMU 11.1.2 - Élevé - Local - UAF - xhci_complete résidu 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
Classe : UAF (use-after-free sur le tas). Portée : Locale (invité).
xhci_complete est le reliquat de CVE-2026-17588. Le correctif 11.1.2 protège les deux timers xHCI. Il ne protège pas le chemin de complétion USB asynchrone. Un invité qui pointe l'event ring vers la BAR doorbell obtient toujours un TRB de 16 octets écrit par DMA dans doorbell 0 depuis xhci_complete, avec le mem_reentrancy_guard TYPE_XHCI déjà libéré. Cette écriture exécute xhci_process_commands. Un CR_DISABLE_SLOT préparé libère le XHCITransfer actif alors que xhci_complete le détient encore.
q35 embarque qemu-xhci. Le partenaire bulk dans ce lab est usb-uas. Le même callback de complétion est atteignable depuis usb-storage, usb-redir et usb-host.
Un noyau invité sur qemu-xhci plus un périphérique bulk asynchrone peut provoquer un UAF sur le tas du processus QEMU.
| ID | pas encore de CVE |
| CWE | CWE-416 |
| CVSS | Élevé : 8.2 CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H |
| Produit | QEMU |
| Affecté | v11.1.2 (4fc49f46) |
| Auth | noyau invité sur qemu-xhci (par défaut sur q35) plus bulk USB_RET_ASYNC |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1:18700 qtest uniquement |
Qui : noyau invité non fiable (ou pair de passthrough USB). De l'invité vers l'hôte. Tas de l'espace utilisateur QEMU.
| Méthode | Point de chute | Privilège |
|---|---|---|
| ERST / ERDP de l'invité sur la BAR doorbell, puis complétion UAS asynchrone | xhci_complete hw/usb/hcd-xhci.c:3282-3295 -> DMA xhci_write_event | heap-use-after-free sous ASan de XHCITransfer alors que la complétion externe le détient encore. CR_DISABLE_SLOT récupéré lors de la réentrance doorbell. |
Même chemin, xhci_ep_nuke_xfers / xhci_ep_free_xfer | g_free(xfer) | Libération du transfert actif et du contexte d'endpoint. Double-free si la complétion libère à nouveau. |
Abandon du processus QEMU sous ASan. Sans ASan, il s'agit d'un UAF sur le tas actif dans le processus hyperviseur : crash de l'invité vers l'hôte, et réutilisation inférée du XHCITransfer libéré.
Aucune nécessaire au-delà de l'énumération de qemu-xhci. q35 l'embarque par défaut.
xhci_mfwrap_timer et xhci_ep_kick_timer positionnent xhci->parent.mem_reentrancy_guard. Fermé sur ce pin.DeviceState UAS. Le reliquat est l'objet xHCI via le DMA de l'event ring, pas un n-day 2021 de l'objet UAS.Le lab ne démontre pas de contrôle du RIP ni de shell de l'invité vers l'hôte. La classe est l'UAF sur le tas du processus QEMU.
J'ai épinglé v11.1.2 car c'est la version GA actuelle et le tag qui a fermé CVE-2026-17588. Je me suis penché sur hw/usb/hcd-xhci.c et j'ai demandé quels écrivains de l'event ring le correctif avait manqués.
Les timers prennent le guard TYPE_XHCI. xhci_complete ne le prend pas. EHCI avait déjà reporté cette classe sur un BH en 2021. xHCI écrit toujours par DMA depuis le callback de complétion USB.
Faux pas : considérer le statut BH de l'UAS comme suffisant (il protège l'UAS, pas le xHCI) ; attendre un NAK HID (minuteur, déjà corrigé) ; vouloir un vrai noyau invité au lieu de qtest doorbell + usb-uas.
cd lab
./run.sh
Cibler uniquement 127.0.0.1:18700 (qtest) et 127.0.0.1:18701 (QMP). Pin est cloné depuis github.com/qemu/QEMU tag v11.1.2 / 4fc49f46. Build ASan. Loopback. Witness-only.
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
Rejouer : python3 qemu-xhci-complete-uaf-Abraxas-Labs.py.
Engager xhci->parent.mem_reentrancy_guard pendant toute la durée de xhci_complete, de la même manière que le font déjà les deux timers. Ou bien différer xhci_try_complete_packet / xhci_kick_epctx vers un BH protégé par TYPE_XHCI, à l'image d'EHCI. Dans les deux cas, l'écriture DMA dans l'event ring ne doit pas s'exécuter avec le garde désactivé.
4fc49f46dc95d4a27de2509e7fceb2931e91faebxhci_completeGNU Affero GPL v3.0. Voir LICENSE. Laboratoire en boucle locale uniquement. Aucune garantie.