
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 (استخدام بعد التحرير في الكومة). الوصول: محلي (من الضيف).
xhci_complete هو ما تبقّى من CVE-2026-17588. تُحصّن رقعة 11.1.2 مؤقّتي xHCI. لكنها لا تحصّن مسار إكمال USB غير المتزامن. الضيف الذي يوجّه حلقة الأحداث نحو نافذة doorbell BAR لا يزال يحصل على TRB بحجم 16 بايت يُكتب عبر DMA في doorbell 0 من xhci_complete، بينما يكون mem_reentrancy_guard الخاص بـ TYPE_XHCI قد أُفرغ بالفعل. هذا الكتابة تُشغّل xhci_process_commands. أمر CR_DISABLE_SLOT المُعدّ مسبقًا يحرّر XHCITransfer الحيّ بينما لا يزال xhci_complete ممسكًا به.
يوفّر q35 منفذ qemu-xhci. الشريك الكتلي في هذا المختبر هو usb-uas. يمكن الوصول إلى نفس دالة الإكمال من usb-storage وusb-redir وusb-host.
نواة ضيف على qemu-xhci مع جهاز كتلي غير متزامن يمكنها إحداث UAF في كومة عملية QEMU.
| المعرّف | لا يوجد CVE بعد |
| CWE | CWE-416 |
| CVSS | عالٍ: 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 الخاص بالضيف عند doorbell BAR، ثم إكمال UAS غير متزامن | xhci_complete hw/usb/hcd-xhci.c:3282-3295 -> xhci_write_event DMA | ASan heap-use-after-free لـ XHCITransfer بينما لا يزال الإكمال الخارجي ممسكًا به. يُجلب CR_DISABLE_SLOT من إعادة الدخول عبر doorbell. |
نفس المسار، xhci_ep_nuke_xfers / xhci_ep_free_xfer | g_free(xfer) | تحرير النقل الحيّ وسياق نقطة النهاية. تحرير مزدوج إذا أكمل ثم حرّر مرة أخرى. |
إجهاض عملية QEMU تحت ASan. بدون ASan يكون هذا UAF حيًّا في كومة عملية hypervisor: انهيار من الضيف إلى المضيف، واستنتاج إعادة استخدام XHCITransfer المحرَّر.
لا شيء مطلوب عدا تعداد qemu-xhci. الافتراضي في q35 يتضمنه.
xhci_mfwrap_timer وxhci_ep_kick_timer يضبطان xhci->parent.mem_reentrancy_guard. مغلق على هذا الإصدار المثبّت.DeviceState الخاص بـ UAS. المتبقي هو كائن xHCI عبر DMA حلقة الأحداث، وليس ثغرة n-day من 2021 لكائن UAS.لا يُظهر المختبر التحكم في RIP أو صدفة من الضيف إلى المضيف. الفئة هي UAF في كومة عملية QEMU.
ثبّتت v11.1.2 لأنها الإصدار GA الحالي والوسم الذي أغلق CVE-2026-17588. جلست على hw/usb/hcd-xhci.c وسألت أي كتّاب حلقة الأحداث فاتتهم الرقعة.
المؤقّتان يأخذان حارس TYPE_XHCI. xhci_complete لا يفعل. EHCI سبق أن أجّل هذه الفئة إلى BH في 2021. لا يزال xHCI يكتب DMA من دالة إكمال 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-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->parent.mem_reentrancy_guard طوال تنفيذ xhci_complete، بالطريقة نفسها التي تتبعها المؤقتان بالفعل. أو أجّل xhci_try_complete_packet / xhci_kick_epctx إلى BH محمي بـ TYPE_XHCI، بما يطابق EHCI. في كلتا الحالتين، يجب ألا يعمل الكتابة عبر DMA إلى حلقة الأحداث بينما الحارس غير مفعّل.
4fc49f46dc95d4a27de2509e7fceb2931e91faebxhci_completeGNU Affero GPL v3.0. راجع LICENSE. مختبر loopback فقط. دون أي ضمان.