
QEMU 11.1.2 - Alta - Local/Remoto - OOB - Desbordamiento de heap L4 IPv4 corto en COLO filter-rewriter
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · qemu-colo-l4-oob
QEMU v11.1.2 (4fc49f46dc95d4a27de2509e7fceb2931e91faeb) - filtro reescritor de COLO
Clase: OOB (desbordamiento de búfer en el heap READ/WRITE). Alcance: Local (invitado) / Remoto (par de COLO).
parse_packet_early acepta IPv4 una vez que L2 más ip_hl*4 encaja. Nunca exige una cabecera L4 mínima. fill_connection_key entonces lee cuatro bytes en transport_header sin comprobar la longitud restante. filter-rewriter copia la trama con g_malloc0(size) y, después de que SYN haya movido la conexión a TCPS_SYN_RECEIVED, un ACK con conn->offset != 0 escribe th_ack / th_seq más allá de ese bloque cuando la longitud capturada termina en la cabecera de transporte.
COLO no está activado por defecto. Se activa cuando se configura -object filter-rewriter (y colo-compare). El TX/RX del invitado en ese reescritor está dentro del modelo de seguridad de la virtualización. Un par de COLO en primary_in / secondary_in es un protocolo de red, también no confiable.
Una trama IPv4/TCP de 34 bytes es suficiente para un heap-buffer-overflow READ de ASan en filter-rewriter.
| ID | aún sin CVE |
| CWE | CWE-125 / CWE-787 |
| CVSS | Alto: 8.2 CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H |
| Producto | QEMU |
| Afectado | v11.1.2 (4fc49f46), reescritor/compare de COLO habilitados |
| Autenticación | invitado en un netdev de reescritor COLO, o un par de comparación COLO |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | sockets de loopback 127.0.0.1:18770 / 18771 |
Quién: invitado no confiable en una NIC con COLO habilitado, o un par de comparación COLO hostil. De invitado a host / de par a host. Heap del espacio de usuario de QEMU.
| Método | Sumidero | Privilegio |
|---|---|---|
| ACK IPv4/TCP corto tras un SYN con cabecera completa (trama de 34 bytes, la longitud termina en la cabecera de transporte) | filter-rewriter handle_primary_tcp_pkt / fill_connection_key | ASan heap-buffer-overflow READ en filter-rewriter. El TCP de control con cabecera completa deja QEMU vivo. |
| Misma ausencia de mínimo L4 | parse_packet_early net/colo.c:43-98 | El paquete se clasifica como TCP sin una cabecera L4 en el búfer. |
Tras el SYN, conn->offset != 0, el reescritor almacena th_ack / th_seq en net/filter-rewriter.c:112-114 y :216-218. Las opciones IP (ip_hl > 5) desplazan esa escritura al siguiente bloque del heap. Escritura en el heap del host activable por el invitado.
fill_pkt_tcp_info de colo-compare establece header_size a partir de th_off<<2 sin comprobarlo contra pkt->size. payload_size sufre underflow. colo_compare_packet_payload hace memcmp decenas de kilobytes más allá de ambas asignaciones de paquetes. Caída más lectura del heap del host.
QEMU aborta bajo ASan en la lectura del reescritor. Sin ASan, esto es un OOB de heap en vivo en el proceso del hipervisor.
net_fill_rstate rechaza packet_len > NET_BUFSIZE).El laboratorio no demuestra control de RIP ni una shell de invitado a host. La clase es OOB de heap del proceso QEMU en un netdev con COLO habilitado.
Leí net/colo.c buscando un límite inferior de longitud que incluyera L4. El límite es Ethernet más VLAN más vnet_hdr. ip_hl se toma de una cola corta. fill_connection_key luego confía en transport_header. filter-rewriter siempre carga th_flags en el desplazamiento 13 de struct tcp_hdr.
Desvíos: tratar la longitud de TAP como el límite de COLO (ruta distinta); enviar el desbordamiento como primer paquete (el rewriter necesita SYN primero para que conn->offset esté activo); el subdesbordamiento de th_off en colo-compare como testigo principal (la LECTURA del rewriter se disparó primero).
cd lab
./run.sh
Se dirige únicamente a sockets de loopback 127.0.0.1:18770 (netdev de filter-rewriter) y 18771 (colo-compare). El pin se clona desde github.com/qemu/QEMU tag v11.1.2 / 4fc49f46. ASan. Proxy COLO habilitado en tiempo de configuración. Solo witness.
SUCCESS qemu-colo-l4-oob asan=heap-buffer-overflow access=READ sink=filter-rewriter control=alive QEMU-COLO-L4-OOB-WITNESS
Reproducción: python3 qemu-colo-l4-oob-Abraxas-Labs.py.
parse_packet_early debe exigir un encabezado L4 completo (TCP 20, UDP 8, SCTP 12, AH 8) después del encabezado IP, y rechazar cuando size termina en o antes de transport_header. fill_connection_key y los almacenamientos th_* del reescritor deben verificar la longitud restante. colo-compare debe rechazar th_off<<2 que no encaje en pkt->size antes de calcular payload_size.
4fc49f46dc95d4a27de2509e7fceb2931e91faebparse_packet_early · filter-rewriterGNU Affero GPL v3.0. Consulte LICENSE. Solo laboratorio de loopback. Sin garantía.