
QEMU 11.1.2 - उच्च - स्थानीय/रिमोट - OOB - COLO filter-rewriter लघु IPv4 L4 हीप ओवरफ़्लो
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · qemu-colo-l4-oob
QEMU v11.1.2 (4fc49f46dc95d4a27de2509e7fceb2931e91faeb) - COLO filter-rewriter
वर्ग: OOB (हीप बफ़र ओवरफ़्लो READ/WRITE)। पहुँच: स्थानीय (गेस्ट) / रिमोट (COLO पीयर)।
parse_packet_early IPv4 को तब स्वीकार करता है जब L2 के साथ ip_hl*4 फ़िट हो जाता है। यह कभी भी न्यूनतम L4 हेडर की आवश्यकता नहीं रखता। इसके बाद fill_connection_key बिना किसी शेष-लंबाई जाँच के transport_header पर चार बाइट पढ़ता है। filter-rewriter फ़्रेम को g_malloc0(size) के साथ कॉपी करता है और, SYN द्वारा कनेक्शन को TCPS_SYN_RECEIVED में ले जाने के बाद, conn->offset != 0 वाला एक ACK th_ack / th_seq को उस चंक से आगे लिखता है जब कैप्चर की गई लंबाई ट्रांसपोर्ट हेडर पर समाप्त होती है।
COLO डिफ़ॉल्ट नहीं है। यह तब चालू होता है जब -object filter-rewriter (और colo-compare) कॉन्फ़िगर किया गया हो। उस रीराइटर पर गेस्ट TX/RX वर्चुअलाइज़ेशन सुरक्षा मॉडल में है। primary_in / secondary_in पर एक COLO पीयर एक नेटवर्क प्रोटोकॉल है, जो अविश्वसनीय भी है।
filter-rewriter में ASan हीप-बफ़र-ओवरफ़्लो READ के लिए 34-बाइट का IPv4/TCP फ़्रेम पर्याप्त है।
| ID | अभी तक कोई CVE नहीं |
| CWE | CWE-125 / CWE-787 |
| 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), COLO रीराइटर/कंपेयर सक्षम |
| प्रमाणीकरण | COLO रीराइटर नेटडेव पर गेस्ट, या एक COLO कंपेयर पीयर |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | 127.0.0.1:18770 / 18771 लूपबैक सॉकेट |
कौन: COLO-सक्षम NIC पर अविश्वसनीय गेस्ट, या एक शत्रुतापूर्ण COLO कंपेयर पीयर। गेस्ट-से-होस्ट / पीयर-से-होस्ट। QEMU यूज़रस्पेस हीप।
| विधि | सिंक | विशेषाधिकार |
|---|---|---|
| पूर्ण-हेडर SYN के बाद छोटा IPv4/TCP ACK (34-बाइट फ़्रेम, लंबाई ट्रांसपोर्ट हेडर पर समाप्त) | filter-rewriter handle_primary_tcp_pkt / fill_connection_key | filter-rewriter में ASan हीप-बफ़र-ओवरफ़्लो READ। पूर्ण-हेडर TCP को नियंत्रित करने पर QEMU जीवित रहता है। |
| वही अनुपस्थित L4 न्यूनतम सीमा | parse_packet_early net/colo.c:43-98 | पैकेट को TCP के रूप में वर्गीकृत किया जाता है, बिना बफ़र में L4 हेडर के। |
SYN के बाद, conn->offset != 0, रीराइटर th_ack / th_seq को net/filter-rewriter.c:112-114 और :216-218 पर संग्रहीत करता है। IP विकल्प (ip_hl > 5) उस लेखन को अगले हीप चंक पर स्थानांतरित कर देते हैं। गेस्ट-ट्रिगर करने योग्य होस्ट हीप WRITE।
colo-compare fill_pkt_tcp_info header_size को th_off<<2 से सेट करता है, बिना pkt->size के विरुद्ध कोई जाँच के। payload_size अंडरफ़्लो हो जाता है। colo_compare_packet_payload दोनों पैकेट आवंटनों से दसियों किलोबाइट आगे memcmp करता है। क्रैश के साथ होस्ट हीप READ।
रीराइटर READ पर ASan के अंतर्गत QEMU एबॉर्ट हो जाता है। ASan के बिना यह हाइपरवाइज़र प्रक्रिया में एक लाइव हीप OOB है।
net_fill_rstate packet_len > NET_BUFSIZE को अस्वीकार करता है)।लैब RIP नियंत्रण या गेस्ट-से-होस्ट शेल प्रदर्शित नहीं करता। वर्ग COLO-सक्षम नेटडेव पर QEMU प्रक्रिया का हीप OOB है।
मैंने net/colo.c पढ़ा, ऐसी लंबाई-सीमा की तलाश में जिसमें L4 शामिल हो। यह सीमा Ethernet प्लस VLAN प्लस vnet_hdr है। ip_hl एक छोटे टेल से लिया जाता है। इसके बाद fill_connection_key transport_header पर भरोसा करता है। filter-rewriter हमेशा struct tcp_hdr के ऑफ़सेट 13 पर th_flags लोड करता है।
गलत रास्ते: TAP लंबाई को COLO सीमा मानना (अलग पथ); ओवरफ़्लो को पहले पैकेट के रूप में भेजना (rewriter को पहले SYN चाहिए ताकि conn->offset लाइव हो); colo-compare th_off अंडरफ़्लो को प्राथमिक साक्ष्य मानना (rewriter READ पहले सक्रिय हुआ)।
cd lab
./run.sh
केवल लूपबैक सॉकेट 127.0.0.1:18770 (filter-rewriter netdev) और 18771 (colo-compare) को लक्षित करता है। Pin को github.com/qemu/QEMU टैग v11.1.2 / 4fc49f46 से क्लोन किया गया है। ASan. कॉन्फ़िगर समय पर COLO proxy सक्षम। केवल-साक्षी (Witness-only)।
SUCCESS qemu-colo-l4-oob asan=heap-buffer-overflow access=READ sink=filter-rewriter control=alive QEMU-COLO-L4-OOB-WITNESS
रीप्ले: python3 qemu-colo-l4-oob-Abraxas-Labs.py.
parse_packet_early को IP हेडर के बाद एक पूर्ण L4 हेडर (TCP 20, UDP 8, SCTP 12, AH 8) की आवश्यकता होनी चाहिए, और जब size transport_header पर या उससे पहले समाप्त हो तो अस्वीकार करना चाहिए। fill_connection_key और रीराइटर के th_* स्टोर को शेष लंबाई की जाँच करनी चाहिए। colo-compare को payload_size की गणना से पहले उस th_off<<2 को अस्वीकार करना चाहिए जो pkt->size में फ़िट नहीं होता।
4fc49f46dc95d4a27de2509e7fceb2931e91faebparse_packet_early · filter-rewriterGNU Affero GPL v3.0. देखें LICENSE. केवल लूपबैक लैब। कोई वारंटी नहीं।