
QEMU 11.1.2 - उच्च - स्थानीय - UAF - NVMe SGL span into BAR0 अपूर्ण CVE-2021-3929
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · qemu-nvme-sgl-bar
QEMU v11.1.2 (4fc49f46dc95d4a27de2509e7fceb2931e91faeb) - NVMe
वर्ग: UAF (अपूर्ण BAR0 deny-list; MMIO में फैलता SGL DMA)। पहुँच: स्थानीय (guest)।
nvme_map_addr CVE-2021-3929 का अवशेष है। iomem जाँच केवल प्रारंभ पर होती है। एक SGL डेटा ब्लॉक जो BAR0 से ठीक पहले शुरू होकर MBAR में चला जाता है, स्वीकार कर लिया जाता है। Identify अभी भी NVME_CTRL_SGLS_SUPPORT_NO_ALIGN रिपोर्ट करता है। PRP पेज-संरेखित BAR में नहीं फैल सकता। SGL फैल सकता है।
उस SGL के साथ एक NVMe READ nvme_blk_read -> dma_blk_read से गुज़रता है। Bounce DMA फिर DMA हेल्पर कॉलबैक से, NVMe mem_reentrancy_guard BH के बाहर, guest डिस्क बाइट्स को address_space_write द्वारा BAR0 पर लिखता है। Guest द्वारा चुने गए शून्य CC पर पहुँच जाते हैं। nvme_ctrl_reset तब चलता है जब लाइव NvmeRequest अभी भी completion पथ में है।
एक guest NVMe ड्राइवर SGL को BAR0 में फैला सकता है, DMA unmap से कंट्रोलर रीसेट कर सकता है, और लाइव रिक्वेस्ट के साथ रेस कर सकता है।
| ID | अभी तक कोई CVE नहीं |
| CWE | CWE-119 / 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) |
| प्रमाणीकरण | NVMe कंट्रोलर (SGL) वाला guest कर्नेल |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | 127.0.0.1:18720 केवल qtest |
कौन: NVMe PCI डिवाइस वाला अविश्वसनीय guest कर्नेल। Guest-से-host।
| विधि | सिंक | विशेषाधिकार |
|---|---|---|
NVMe READ SGL addr=0xdfffffec len=0x1000 (BAR0 से 0x14 पहले शुरू होता है, जो 0xe0000000 पर है) | nvme_map_addr / nvme_addr_is_iomem केवल प्रारंभ पर | मैपिंग स्वीकृत। BAR0 में प्रारंभ वाला Control Identify अभी भी 0x4004 (DATA_TRAS_ERROR | DNR) लौटाता है। |
Bounce unmap CC पर LBA शून्य लिखता है | DMA bounce का address_space_write BAR0 में, nvme_write_bar | CSTS.RDY गिर जाता है। लॉग में pci_nvme_mmio_stopped। कंट्रोलर रीसेट DMA हेल्पर से होता है, NVMe BH में guest MMIO स्टोर से नहीं। |
CC / अन्य BAR0 रजिस्टरों पर guest-नियंत्रित डिस्क बाइट्स। रीसेट इनफ्लाइट AIO को रद्द कर देता है, लेकिन जो रिक्वेस्ट DMA unmap/completion के अंदर है वह अभी भी लाइव NvmeRequest / SQ / CQ के साथ रेस करती है। CVE-2021-3929 के समान वर्ग; deny-list ने कभी फैलते SGL को कवर नहीं किया। DIF bounce (AIO कॉलबैक से nvme_tx) में भी वही छेद है।
कंट्रोलर रुक जाता है (CSTS.RDY=0, mmio-stopped=1)। इस लैब में हाइपरवाइज़र प्रोसेस चालू रहता है (asan=0)। NvmeRequest का नेस्टेड रीसेट UAF अनुमानित अगला कदम है, इस रन में प्रिंट हुआ witness नहीं।
कोई नहीं। NVMe BAR0 guest को दिखता है।
0x4004।nvme_post_cqes BH संरक्षित है, नेस्टेड MMIO MEMTX_ACCESS_ERROR है।लैब RIP नियंत्रण या guest-से-host शेल प्रदर्शित नहीं करता। वर्ग है MMIO में फैलता DMA और लाइव रिक्वेस्ट का कंट्रोलर रीसेट।
CVE-2021-3929 ने ट्री को NVMe मैपिंग प्रारंभ के रूप में iomem को अस्वीकार करना सिखाया। मैंने पूछा कि क्या उस परीक्षण में SGL डेटा ब्लॉक का अंत शामिल था। यह शामिल नहीं है। CMB/PMR पहले से ही दोनों सिरों की जाँच करते हैं। BAR0 नहीं करता। Identify असंरेखित SGL का विज्ञापन करता है।
गलत रास्ते: PRP (पेज-सीमित, पिछले पेज से पेज-संरेखित BAR में घुस नहीं सकता); admin कमांड (SGL अस्वीकृत); यह आशा करना कि ASan पहले READ पर सक्रिय होगा (गवाह CSTS.RDY और pci_nvme_mmio_stopped है, कोई हीप रिपोर्ट नहीं)।
cd lab
./run.sh
केवल 127.0.0.1:18720 (qtest) को लक्षित करें। Pin को github.com/qemu/QEMU टैग v11.1.2 / 4fc49f46 से क्लोन किया गया है। Loopback। केवल-साक्षी (Witness-only)। डिस्क इमेज 1 MiB शून्यों की है ताकि bounce लिखावट CC.EN=0 करे।
SUCCESS qemu-nvme-sgl-bar control-sc=0x4004 span-addr=0xdfffffec span-end=0xe0000fec csts-rdy-before=1 csts-rdy-after=0 mmio-stopped=1 asan=0 QEMU-NVME-SGL-BAR-WITNESS
रीप्ले: python3 qemu-nvme-sgl-bar-Abraxas-Labs.py.
यदि [addr, addr+len) का कोई भी बाइट BAR0 (और MSI-X) में स्थित है, तो मैपिंग को अस्वीकार करें, जो CMB/PMR से मेल खाता है। nvme_addr_is_iomem को प्रारंभ के बजाय एक रेंज लेनी चाहिए। CVE-2021-3929 नियंत्रण के रूप में BAR0 में प्रारंभ-स्थिति को अस्वीकार करने को बनाए रखें।
4fc49f46dc95d4a27de2509e7fceb2931e91faebnvme_map_addr / nvme_addr_is_iomemGNU Affero GPL v3.0. देखें LICENSE. केवल लूपबैक लैब। कोई वारंटी नहीं।