
QEMU 11.1.2 – Hoch – Lokal/Remote – OOB – COLO filter-rewriter IPv4-L4-Heap-Overflow bei kurzen Paketen
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · qemu-colo-l4-oob
QEMU v11.1.2 (4fc49f46dc95d4a27de2509e7fceb2931e91faeb) - COLO filter-rewriter
Klasse: OOB (Heap-Pufferüberlauf READ/WRITE). Reichweite: Lokal (Gast) / Remote (COLO-Peer).
parse_packet_early akzeptiert IPv4, sobald L2 plus ip_hl*4 hineinpasst. Ein Mindest-L4-Header wird nie verlangt. fill_connection_key liest dann vier Bytes bei transport_header ohne Prüfung der verbleibenden Länge. filter-rewriter kopiert den Frame mit g_malloc0(size), und nachdem SYN die Verbindung in TCPS_SYN_RECEIVED versetzt hat, schreibt ein ACK mit conn->offset != 0 th_ack / th_seq über diesen Chunk hinaus, wenn die erfasste Länge am Transport-Header endet.
COLO ist nicht Standard. Es ist aktiv, wenn -object filter-rewriter (und colo-compare) konfiguriert ist. Gast-TX/RX auf diesem Rewriter liegt im Virtualisierungssicherheitsmodell. Ein COLO-Peer auf primary_in / secondary_in ist ein Netzwerkprotokoll und ebenfalls nicht vertrauenswürdig.
Ein 34-Byte-IPv4/TCP-Frame genügt für einen ASan-Heap-Buffer-Overflow-READ im filter-rewriter.
| ID | noch keine CVE |
| CWE | CWE-125 / CWE-787 |
| CVSS | Hoch: 8.2 CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H |
| Produkt | QEMU |
| Betroffen | v11.1.2 (4fc49f46), COLO-Rewriter/Compare aktiviert |
| Auth | Gast auf einem COLO-Rewriter-Netdev oder ein COLO-Compare-Peer |
| Lizenz | GNU Affero GPL v3.0 |
| Labor | 127.0.0.1:18770 / 18771 Loopback-Sockets |
Wer: nicht vertrauenswürdiger Gast auf einer COLO-fähigen NIC oder ein feindlicher COLO-Compare-Peer. Gast-zu-Host / Peer-zu-Host. QEMU-Userspace-Heap.
| Methode | Senke | Privileg |
|---|---|---|
| Kurzes IPv4/TCP-ACK nach einem SYN mit vollem Header (34-Byte-Frame, Länge endet am Transport-Header) | filter-rewriter handle_primary_tcp_pkt / fill_connection_key | ASan-Heap-Buffer-Overflow-READ im filter-rewriter. Kontroll-TCP mit vollem Header lässt QEMU am Leben. |
| Derselbe fehlende L4-Mindestwert | parse_packet_early net/colo.c:43-98 | Das Paket wird als TCP klassifiziert, ohne dass ein L4-Header im Puffer liegt. |
Nach SYN, conn->offset != 0, speichert der Rewriter th_ack / th_seq bei net/filter-rewriter.c:112-114 und :216-218. IP-Optionen (ip_hl > 5) verschieben diesen Schreibvorgang auf den nächsten Heap-Chunk. Vom Gast auslösbarer Host-Heap-WRITE.
colo-compare fill_pkt_tcp_info setzt header_size aus th_off<<2 ohne Prüfung gegen pkt->size. payload_size läuft unter. colo_compare_packet_payload führt memcmp über zig Kilobyte über beide Paketallokationen hinaus aus. Absturz plus Host-Heap-READ.
QEMU bricht unter ASan beim Rewriter-READ ab. Ohne ASan ist dies ein aktiver Heap-OOB im Hypervisor-Prozess.
net_fill_rstate lehnt packet_len > NET_BUFSIZE ab).Das Labor demonstriert keine RIP-Kontrolle und keine Gast-zu-Host-Shell. Die Klasse ist Heap-OOB des QEMU-Prozesses auf einem COLO-fähigen Netdev.
Ich habe net/colo.c gelesen und nach einer Längenuntergrenze gesucht, die L4 einschließt. Die Untergrenze ist Ethernet plus VLAN plus vnet_hdr. ip_hl wird aus einem kurzen Tail entnommen. fill_connection_key vertraut dann auf transport_header. Der filter-rewriter lädt immer th_flags an Offset 13 von struct tcp_hdr.
Fehlversuche: die TAP-Länge als COLO-Grenze zu behandeln (anderer Pfad); den Überlauf als erstes Paket zu senden (der Rewriter benötigt zuerst ein SYN, damit conn->offset aktiv ist); den th_off-Unterlauf von colo-compare als primären Beleg zu nehmen (der Rewriter-READ wurde zuerst ausgelöst).
cd lab
./run.sh
Zielt ausschließlich auf Loopback-Sockets 127.0.0.1:18770 (filter-rewriter netdev) und 18771 (colo-compare) ab. Pin ist von github.com/qemu/QEMU Tag v11.1.2 / 4fc49f46 geklont. ASan. COLO-Proxy zur Konfigurationszeit aktiviert. Nur Witness.
SUCCESS qemu-colo-l4-oob asan=heap-buffer-overflow access=READ sink=filter-rewriter control=alive QEMU-COLO-L4-OOB-WITNESS
Replay: python3 qemu-colo-l4-oob-Abraxas-Labs.py.
parse_packet_early muss nach dem IP-Header einen vollständigen L4-Header (TCP 20, UDP 8, SCTP 12, AH 8) verlangen und ablehnen, wenn size bei oder vor transport_header endet. fill_connection_key und die th_*-Speicherzugriffe des Rewriters müssen die verbleibende Länge prüfen. colo-compare muss th_off<<2 ablehnen, wenn es nicht in pkt->size passt, bevor payload_size berechnet wird.
4fc49f46dc95d4a27de2509e7fceb2931e91faebparse_packet_early · filter-rewriterGNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.