
QEMU 11.1.2 — высокий уровень — локальная — UAF — xhci_complete, остаток от CVE-2026-17588, DMA дверного звонка
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · qemu-xhci-complete-uaf
QEMU v11.1.2 (4fc49f46dc95d4a27de2509e7fceb2931e91faeb) - qemu-xhci
Класс: UAF (heap use-after-free). Доступ: локальный (гость).
xhci_complete — это остаток от CVE-2026-17588. Патч 11.1.2 защищает два таймера xHCI. Он не защищает асинхронный путь завершения USB. Гость, направивший event ring на BAR дверного звонка, всё ещё получает 16-байтовый TRB, DMA-записанный в doorbell 0 из xhci_complete, при уже снятом mem_reentrancy_guard для TYPE_XHCI. Эта запись запускает xhci_process_commands. Подготовленный CR_DISABLE_SLOT освобождает живой XHCITransfer, пока xhci_complete всё ещё удерживает его.
q35 поставляется с qemu-xhci. Партнёр по bulk в этой лаборатории — usb-uas. Тот же callback завершения достижим из usb-storage, usb-redir и usb-host.
Гостевое ядро на qemu-xhci плюс асинхронное bulk-устройство может вызвать UAF кучи процесса QEMU.
| ID | CVE пока нет |
| CWE | CWE-416 |
| CVSS | High: 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 bulk |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | 127.0.0.1:18700 только qtest |
Кто: недоверенное гостевое ядро (или пир USB passthrough). Из гостя в хост. Куча пользовательского пространства QEMU.
| Метод | Точка сброса | Привилегия |
|---|---|---|
| Гостевые ERST / ERDP на BAR дверного звонка, затем асинхронное завершение UAS | xhci_complete hw/usb/hcd-xhci.c:3282-3295 -> DMA xhci_write_event | ASan heap-use-after-free для XHCITransfer, пока внешний complete всё ещё удерживает его. CR_DISABLE_SLOT извлекается при повторном входе через дверной звонок. |
Тот же путь, xhci_ep_nuke_xfers / xhci_ep_free_xfer | g_free(xfer) | Освобождение живого transfer и контекста endpoint. Double-free, если complete затем освобождает снова. |
Аварийное завершение процесса QEMU под ASan. Без ASan это живой heap UAF в процессе гипервизора: падение из гостя в хост и предполагаемое повторное использование освобождённого XHCITransfer.
Ничего не требуется сверх перечисления qemu-xhci. По умолчанию в q35 он присутствует.
xhci_mfwrap_timer и xhci_ep_kick_timer устанавливают xhci->parent.mem_reentrancy_guard. Закрыто на этой фиксации.DeviceState UAS. Остаток — это объект xHCI через DMA event ring, а не n-day 2021 года для объекта UAS.Лаборатория не демонстрирует контроль RIP или шелл из гостя в хост. Класс — heap UAF процесса QEMU.
Я зафиксировал v11.1.2, потому что это текущий GA и тег, закрывший CVE-2026-17588. Я сосредоточился на hw/usb/hcd-xhci.c и спросил, каких писателей event ring пропустил патч.
Таймеры берут guard TYPE_XHCI. xhci_complete — нет. EHCI уже отложил этот класс на BH в 2021 году. xHCI всё ещё пишет DMA из callback завершения USB.
Ошибочные решения: считать статус 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. Loopback. Только 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
Воспроизведение: python3 qemu-xhci-complete-uaf-Abraxas-Labs.py.
Задействуйте xhci->parent.mem_reentrancy_guard на всём протяжении xhci_complete — так же, как это уже делают два таймера. Либо отложите xhci_try_complete_packet / xhci_kick_epctx на BH, защищённый TYPE_XHCI, по аналогии с EHCI. В любом случае запись в event ring посредством DMA не должна выполняться при снятом guard.
4fc49f46dc95d4a27de2509e7fceb2931e91faebxhci_completeGNU Affero GPL v3.0. См. LICENSE. Только для лаборатории с loopback. Без гарантий.