
QEMU 11.1.2 - High - Local - UAF - xhci_complete, 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
분류: UAF(힙 use-after-free). 도달 범위: 로컬(게스트).
xhci_complete는 CVE-2026-17588의 잔재입니다. 11.1.2 패치는 두 개의 xHCI 타이머를 보호합니다. 하지만 비동기 USB 완료 경로는 보호하지 않습니다. 이벤트 링을 도어벨 BAR로 겨냥한 게스트는 여전히 xhci_complete로부터 도어벨 0에 16바이트 TRB가 DMA로 기록되게 하며, 이때 TYPE_XHCI mem_reentrancy_guard는 이미 해제된 상태입니다. 이 기록은 xhci_process_commands를 실행합니다. 준비된 CR_DISABLE_SLOT은 xhci_complete가 여전히 붙잡고 있는 살아있는 XHCITransfer를 해제합니다.
q35는 qemu-xhci를 탑재합니다. 이 랩의 벌크 파트너는 usb-uas입니다. 동일한 complete 콜백은 usb-storage, usb-redir, usb-host에서도 도달 가능합니다.
qemu-xhci와 비동기 벌크 디바이스 위의 게스트 커널은 QEMU 프로세스 힙을 UAF시킬 수 있습니다.
| 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 벌크 |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1:18700 qtest 전용 |
누가: 신뢰할 수 없는 게스트 커널(또는 USB 패스스루 피어). 게스트에서 호스트로. QEMU 사용자 공간 힙.
| 방법 | 싱크 | 권한 |
|---|---|---|
| 게스트 ERST / ERDP를 도어벨 BAR에 설정한 뒤 비동기 UAS 완료 | xhci_complete hw/usb/hcd-xhci.c:3282-3295 -> xhci_write_event DMA | 외부 complete가 여전히 붙잡고 있는 XHCITransfer의 ASan heap-use-after-free. 도어벨 재진입에서 CR_DISABLE_SLOT을 가져옴. |
동일 경로, xhci_ep_nuke_xfers / xhci_ep_free_xfer | g_free(xfer) | 살아있는 transfer와 엔드포인트 컨텍스트 해제. complete 후 다시 해제하면 double-free. |
ASan 하에서 QEMU 프로세스 중단. ASan이 없으면 이는 하이퍼바이저 프로세스 내의 실제 힙 UAF입니다: 게스트에서 호스트로의 크래시, 그리고 해제된 XHCITransfer의 재사용이 추정됩니다.
qemu-xhci를 열거하는 것 외에는 필요 없습니다. q35 기본값에 포함되어 있습니다.
xhci_mfwrap_timer와 xhci_ep_kick_timer는 xhci->parent.mem_reentrancy_guard를 설정합니다. 이 핀에서는 닫혀 있습니다.DeviceState에서 가드됩니다. 남은 것은 이벤트 링 DMA를 통한 xHCI 객체이며, UAS 객체의 2021년 n-day가 아닙니다.이 랩은 RIP 제어나 게스트에서 호스트로의 셸을 입증하지 않습니다. 이 클래스는 QEMU 프로세스의 힙 UAF입니다.
현재 GA이자 CVE-2026-17588을 닫은 태그이기 때문에 v11.1.2를 핀했습니다. hw/usb/hcd-xhci.c를 들여다보며 패치가 놓친 이벤트 링 기록자를 찾았습니다.
타이머는 TYPE_XHCI 가드를 획득합니다. xhci_complete는 그렇지 않습니다. EHCI는 이미 2021년에 이 클래스를 BH로 지연시켰습니다. xHCI는 여전히 USB complete 콜백에서 DMA를 기록합니다.
잘못된 접근: 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 빌드. 루프백. 증인 전용.
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_complete 전체에 걸쳐 xhci->parent.mem_reentrancy_guard를 적용하십시오. 또는 EHCI와 일치하도록 xhci_try_complete_packet / xhci_kick_epctx를 TYPE_XHCI로 보호된 BH로 지연시키십시오. 어느 쪽이든, 이벤트 링에 DMA 쓰기를 수행하는 작업은 가드가 해제된 상태에서 실행되어서는 안 됩니다.
4fc49f46dc95d4a27de2509e7fceb2931e91faebxhci_completeGNU Affero GPL v3.0. LICENSE를 참조하십시오. 루프백 랩 전용. 보증 없음.