
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)। पहुँच: स्थानीय (guest)।
xhci_complete CVE-2026-17588 का अवशेष है। 11.1.2 पैच दो xHCI टाइमरों की रक्षा करता है। यह async USB complete पथ की रक्षा नहीं करता। एक guest जो event ring को doorbell BAR पर लक्षित करता है, अभी भी xhci_complete से doorbell 0 में 16-बाइट TRB DMA-लिखा हुआ प्राप्त करता है, जबकि TYPE_XHCI mem_reentrancy_guard पहले से ही स्पष्ट है। वह लेखन xhci_process_commands चलाता है। एक तैयार CR_DISABLE_SLOT जीवित XHCITransfer को मुक्त करता है जबकि xhci_complete अभी भी उसे पकड़े हुए है।
q35 में qemu-xhci शामिल है। इस लैब में bulk साथी usb-uas है। वही complete callback usb-storage, usb-redir, और usb-host से भी पहुँचा जा सकता है।
qemu-xhci और एक async bulk डिवाइस पर एक guest kernel QEMU प्रोसेस heap का 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 डिफ़ॉल्ट) पर guest kernel और USB_RET_ASYNC bulk |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | 127.0.0.1:18700 केवल qtest |
कौन: अविश्वसनीय guest kernel (या USB passthrough सहकर्मी)। Guest-to-host। QEMU userspace heap।
| विधि | सिंक | विशेषाधिकार |
|---|---|---|
| doorbell BAR पर Guest ERST / ERDP, फिर async UAS complete | xhci_complete hw/usb/hcd-xhci.c:3282-3295 -> xhci_write_event DMA | XHCITransfer का ASan heap-use-after-free जबकि बाहरी complete अभी भी उसे पकड़े हुए है। CR_DISABLE_SLOT doorbell पुनः-प्रवेश से प्राप्त। |
वही पथ, xhci_ep_nuke_xfers / xhci_ep_free_xfer | g_free(xfer) | जीवित transfer और endpoint context का मुक्त होना। यदि complete फिर से मुक्त करता है तो double-free। |
ASan के अंतर्गत QEMU प्रोसेस abort। ASan के बिना यह hypervisor प्रोसेस में एक जीवंत heap UAF है: guest-to-host क्रैश, और मुक्त किए गए XHCITransfer का अनुमानित पुनःउपयोग।
qemu-xhci की गणना के अलावा कुछ भी आवश्यक नहीं। q35 डिफ़ॉल्ट में यह शामिल है।
xhci_mfwrap_timer और xhci_ep_kick_timer xhci->parent.mem_reentrancy_guard सेट करते हैं। इस पिन पर बंद।DeviceState पर guarded है। अवशेष xHCI ऑब्जेक्ट है event-ring DMA के माध्यम से, UAS ऑब्जेक्ट का 2021 n-day नहीं।लैब RIP नियंत्रण या guest-to-host शेल प्रदर्शित नहीं करता। वर्ग QEMU प्रोसेस का heap UAF है।
मैंने v11.1.2 को पिन किया क्योंकि वह वर्तमान GA है और वह टैग है जिसने CVE-2026-17588 को बंद किया। मैं hw/usb/hcd-xhci.c पर बैठा और पूछा कि पैच ने event ring के किन लेखकों को छोड़ दिया।
टाइमर TYPE_XHCI guard लेते हैं। xhci_complete नहीं लेता। EHCI ने पहले ही 2021 में इस वर्ग को BH पर स्थगित कर दिया था। xHCI अभी भी USB complete callback से DMA लिखता है।
गलत मोड़: UAS स्थिति BH को पर्याप्त मानना (यह UAS की रक्षा करता है, xHCI की नहीं); HID NAK पर प्रतीक्षा करना (टाइमर, पहले ही पैच किया जा चुका); qtest doorbell + usb-uas के बजाय वास्तविक guest kernel चाहना।
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-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
रीप्ले: python3 qemu-xhci-complete-uaf-Abraxas-Labs.py।
पूरे xhci_complete के लिए xhci->parent.mem_reentrancy_guard को सक्रिय करें, ठीक उसी तरह जैसे दोनों टाइमर पहले से करते हैं। या फिर xhci_try_complete_packet / xhci_kick_epctx को TYPE_XHCI-गार्डेड BH पर स्थगित करें, EHCI के अनुरूप। किसी भी तरह से, इवेंट रिंग में DMA-राइट गार्ड के बिना नहीं चलना चाहिए।
4fc49f46dc95d4a27de2509e7fceb2931e91faebxhci_completeGNU Affero GPL v3.0। देखें LICENSE। केवल लूपबैक लैब। कोई वारंटी नहीं।