
QEMU 11.1.2 - Élevé - Local/Distant - OOB - Débordement de tas L4 IPv4 court dans le filtre-rewriter COLO
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · qemu-colo-l4-oob
QEMU v11.1.2 (4fc49f46dc95d4a27de2509e7fceb2931e91faeb) - filtre réécrivain COLO
Classe : OOB (débordement de tampon de tas en LECTURE/ÉCRITURE). Portée : Locale (invité) / Distante (pair COLO).
parse_packet_early accepte l'IPv4 dès que la couche L2 plus ip_hl*4 tient. Il n'exige jamais d'en-tête L4 minimal. fill_connection_key lit ensuite quatre octets à transport_header sans vérification de la longueur restante. filter-rewriter copie la trame avec g_malloc0(size) et, après que SYN a fait passer la connexion à TCPS_SYN_RECEIVED, un ACK avec conn->offset != 0 écrit th_ack / th_seq au-delà de ce bloc lorsque la longueur capturée se termine à l'en-tête de transport.
COLO n'est pas activé par défaut. Il est actif lorsque -object filter-rewriter (et colo-compare) est configuré. Le TX/RX de l'invité sur ce réécrivain relève du modèle de sécurité de la virtualisation. Un pair COLO sur primary_in / secondary_in est un protocole réseau, également non fiable.
Une trame IPv4/TCP de 34 octets suffit pour une LECTURE de débordement de tampon de tas ASan dans filter-rewriter.
| ID | pas encore de CVE |
| CWE | CWE-125 / CWE-787 |
| CVSS | Élevé : 8.2 CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H |
| Produit | QEMU |
| Affecté | v11.1.2 (4fc49f46), réécrivain/comparateur COLO activé |
| Auth | invité sur un netdev de réécrivain COLO, ou un pair de comparaison COLO |
| Licence | GNU Affero GPL v3.0 |
| Labo | sockets loopback 127.0.0.1:18770 / 18771 |
Qui : invité non fiable sur une NIC compatible COLO, ou pair de comparaison COLO hostile. Invité-vers-hôte / pair-vers-hôte. Tas de l'espace utilisateur QEMU.
| Méthode | Point d'aboutissement | Privilège |
|---|---|---|
| ACK IPv4/TCP court après un SYN à en-tête complet (trame de 34 octets, longueur se terminant à l'en-tête de transport) | filter-rewriter handle_primary_tcp_pkt / fill_connection_key | LECTURE de débordement de tampon de tas ASan dans filter-rewriter. Un TCP à en-tête complet de contrôle laisse QEMU en vie. |
| Même absence de plancher L4 | parse_packet_early net/colo.c:43-98 | Le paquet est classé comme TCP sans en-tête L4 dans le tampon. |
Après SYN, conn->offset != 0, le réécrivain stocke th_ack / th_seq à net/filter-rewriter.c:112-114 et :216-218. Les options IP (ip_hl > 5) décalent cette écriture sur le bloc de tas suivant. ÉCRITURE de tas hôte déclenchable par l'invité.
colo-compare fill_pkt_tcp_info définit header_size à partir de th_off<<2 sans vérification par rapport à pkt->size. payload_size subit un sous-dépassement. colo_compare_packet_payload effectue un memcmp sur des dizaines de kilooctets au-delà des deux allocations de paquets. Plantage plus LECTURE de tas hôte.
QEMU s'interrompt sous ASan lors de la LECTURE du réécrivain. Sans ASan, il s'agit d'un OOB de tas actif dans le processus de l'hyperviseur.
net_fill_rstate rejette packet_len > NET_BUFSIZE).Le labo ne démontre pas de contrôle du RIP ni de shell invité-vers-hôte. La classe est un OOB de tas du processus QEMU sur un netdev compatible COLO.
Je lis net/colo.c à la recherche d'un plancher de longueur qui inclut la couche L4. Le plancher est Ethernet plus VLAN plus vnet_hdr. ip_hl est pris depuis une queue courte. fill_connection_key fait ensuite confiance à transport_header. filter-rewriter charge toujours th_flags à l'offset 13 de struct tcp_hdr.
Fausses pistes : traiter la longueur TAP comme la borne COLO (chemin différent) ; envoyer le débordement comme premier paquet (le rewriter a besoin du SYN en premier pour que conn->offset soit actif) ; considérer le sous-dépassement de th_off de colo-compare comme le témoin principal (la LECTURE du rewriter s'est déclenchée en premier).
cd lab
./run.sh
Cible uniquement les sockets loopback 127.0.0.1:18770 (netdev filter-rewriter) et 18771 (colo-compare). Le pin est cloné depuis github.com/qemu/QEMU tag v11.1.2 / 4fc49f46. ASan. Proxy COLO activé au moment de la configuration. Witness-only.
SUCCESS qemu-colo-l4-oob asan=heap-buffer-overflow access=READ sink=filter-rewriter control=alive QEMU-COLO-L4-OOB-WITNESS
Rejouer : python3 qemu-colo-l4-oob-Abraxas-Labs.py.
parse_packet_early doit exiger un en-tête L4 complet (TCP 20, UDP 8, SCTP 12, AH 8) après l'en-tête IP, et rejeter lorsque size se termine à ou avant transport_header. fill_connection_key et les stockages th_* du réécrivain doivent vérifier la longueur restante. colo-compare doit rejeter th_off<<2 qui ne tient pas dans pkt->size avant de calculer payload_size.
4fc49f46dc95d4a27de2509e7fceb2931e91faebparse_packet_early · filter-rewriterGNU Affero GPL v3.0. Voir LICENSE. Laboratoire en boucle locale uniquement. Aucune garantie.