
QEMU 11.1.2 - 高 - ローカル - 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 のパッチは 2 つの xHCI タイマーを保護している。しかし非同期 USB complete パスは保護していない。イベントリングをドアベル 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 complete | 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) | ライブなトランスファとエンドポイントコンテキストの解放。complete の後に再度解放されるとダブルフリーになる。 |
ASan 下で QEMU プロセスが abort する。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 である。
CVE-2026-17588 をクローズしたタグであり、現行の GA でもあるため、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 ドアベル + 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 ビルド。ループバック。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。
既存の2つのタイマーと同様に、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 を参照。ループバックラボ専用。保証なし。