
QEMU 11.1.2 - High - Local/Remote - OOB - تجاوز سعة الكومة في IPv4 L4 القصير في COLO filter-rewriter
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · qemu-colo-l4-oob
QEMU v11.1.2 (4fc49f46dc95d4a27de2509e7fceb2931e91faeb) - مرشح COLO filter-rewriter
الفئة: OOB (تجاوز سعة المخزن المؤقت في الكومة قراءة/كتابة). الوصول: محلي (ضيف) / عن بُعد (نظير COLO).
parse_packet_early يقبل IPv4 بمجرد أن يتسع L2 مع ip_hl*4. لا يشترط أبدًا حدًا أدنى لترويسة L4. بعد ذلك يقرأ fill_connection_key أربعة بايتات عند transport_header دون التحقق من الطول المتبقي. ينسخ filter-rewriter الإطار باستخدام g_malloc0(size)، وبعد أن ينقل SYN الاتصال إلى TCPS_SYN_RECEIVED، فإن ACK مع conn->offset != 0 يكتب th_ack / th_seq بعد تلك الكتلة عندما ينتهي الطول الملتقط عند ترويسة النقل.
COLO ليس افتراضيًا. يتم تفعيله عند تكوين -object filter-rewriter (و colo-compare). إرسال/استقبال الضيف على ذلك المرشح يقع ضمن نموذج أمان المحاكاة الافتراضية. نظير COLO على primary_in / secondary_in هو بروتوكول شبكة، وهو أيضًا غير موثوق.
إطار IPv4/TCP بحجم 34 بايت كافٍ لقراءة ASan heap-buffer-overflow في filter-rewriter.
| المعرّف | لا يوجد 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 rewriter/compare |
| المصادقة | ضيف على netdev لـ COLO rewriter، أو نظير COLO compare |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | مآخذ loopback 127.0.0.1:18770 / 18771 |
من: ضيف غير موثوق على NIC مفعّل عليه COLO، أو نظير COLO compare معادٍ. من الضيف إلى المضيف / من النظير إلى المضيف. كومة مساحة مستخدم QEMU.
| الطريقة | الموقع | الامتياز |
|---|---|---|
| ACK قصير IPv4/TCP بعد SYN بترويسة كاملة (إطار 34 بايت، ينتهي الطول عند ترويسة النقل) | filter-rewriter handle_primary_tcp_pkt / fill_connection_key | ASan heap-buffer-overflow READ في filter-rewriter. التحكم في 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) تنقل تلك الكتابة إلى كتلة الكومة التالية. كتابة في كومة المضيف يمكن للضيف إثارتها.
fill_pkt_tcp_info في colo-compare يضبط header_size من th_off<<2 دون التحقق مقابل pkt->size. يحدث underflow في payload_size. يقوم colo_compare_packet_payload بـ memcmp لعشرات الكيلوبايتات بعد تخصيصي الحزمتين. انهيار مع قراءة في كومة المضيف.
إجهاض QEMU تحت ASan عند قراءة المرشح. بدون ASan، هذا OOB حي في الكومة داخل عملية hypervisor.
net_fill_rstate يرفض packet_len > NET_BUFSIZE).لا يُظهر المختبر التحكم في RIP أو صدفة من الضيف إلى المضيف. الفئة هي OOB في كومة عملية QEMU على netdev مفعّل عليه COLO.
قرأت net/colo.c باحثًا عن حد أدنى للطول يتضمن L4. الحد الأدنى هو Ethernet بالإضافة إلى VLAN بالإضافة إلى vnet_hdr. يُؤخذ ip_hl من ذيل قصير. ثم تثق fill_connection_key بـ transport_header. يقوم filter-rewriter دائمًا بتحميل th_flags عند الإزاحة 13 من struct tcp_hdr.
مسارات خاطئة: التعامل مع طول TAP كحد COLO (مسار مختلف)؛ إرسال الفائض كأول حزمة (يحتاج rewriter إلى SYN أولًا حتى يكون conn->offset نشطًا)؛ اعتبار underflow الخاص بـ th_off في colo-compare كدليل أساسي (أطلق قراءة rewriter أولًا).
cd lab
./run.sh
يستهدف فقط مقابس loopback 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 وجود رأس L4 كامل (TCP 20، UDP 8، SCTP 12، AH 8) بعد رأس IP، وأن يرفض عندما ينتهي size عند transport_header أو قبله. ويجب أن تتحقق fill_connection_key ومخازن th_* في المُعيد الكتابة من الطول المتبقي. ويجب أن يرفض colo-compare قيمة th_off<<2 التي لا تتسع داخل pkt->size قبل حساب payload_size.
4fc49f46dc95d4a27de2509e7fceb2931e91faebparse_packet_early · filter-rewriterGNU Affero GPL v3.0. راجع LICENSE. مختبر loopback فقط. دون أي ضمان.