
Prueba de concepto exclusivamente de simulación para CVE-2026-99999, un fallo de validación de csum_start en IPv4 de virtio-net del kernel de Linux que permite la divulgación de memoria del heap del invitado al host.
Divulgación de información del kernel de Linux mediante metadatos de checksum de virtio-net malformados.
CVSS 9.3 CRÍTICO | CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
Descubierto por Paulos | CNA: kernel.org | Publicado: 2026-10-15
⚠️ Este es un PoC educativo / de validación. Se ejecuta únicamente en modo --simulate
(sin E/S de red, no requiere root). Demuestra la cadena de ataque localmente
sin explotar ningún sistema en vivo.
Una VM invitada puede enviar una trama virtio-net cuyo virtio_net_hdr lleva
csum_start == 0 — apuntando hacia la cabecera IPv4 en lugar de a la cabecera
de transporte. Durante la segmentación GSO en el host, skb_checksum_help() recalcula
el checksum que cubre [csum_start, csum_start + csum_offset + 2) y escribe
el resultado de vuelta en csum_start + csum_offset.
Cuando csum_start = 0 y csum_offset = 0, la escritura recae sobre el byte IHL
(offset IP 0), corrompiéndolo de 0x45 (IHL 5 → 20 bytes) a 0x4F
(IHL 15 → 60 bytes). El ip_do_fragment() del kernel entonces lee 60 bytes de
cabecera IP cuando solo existen 20 bytes — arrastrando ~32–64 bytes de memoria
heap adyacente del kernel del host hacia cada fragmento saliente.
Impacto: Divulgación continua de memoria heap del kernel del invitado al host.
Superficie de ataque: Hosts KVM/QEMU con NICs virtio-net y puenteo TAP habilitado, o cualquier ruta de comunicación VM→host donde el host procese tramas virtio-net a través de GSO.
| Offset | Campo | csum_offset=0 corrompe | csum_offset=6 corrompe |
|---|---|---|---|
| 0 | Versión + IHL | ✅ byte IHL | |
| 1 | TOS | ||
| 2–3 | Longitud Total | ||
| 4–5 | Identificación | ||
| 6–7 | Flags / Offset de Fragmento | ✅ Flags/FragOffset (lo) | |
| 8 | TTL | ||
| 9 | Protocolo | ||
| 10–11 | Checksum de Cabecera | ||
| 12–15 | IP de Origen | ||
| 16–19 | IP de Destino |
Guest VM
→ constructs virtio_net_hdr with csum_start=0 (pointing at IP header)
→ sends frame through virtio-net to host
Host kernel (GSO segmentation path)
→ skb_checksum_help() called
→ writes checksum result to csum_start + csum_offset
→ if csum_offset=0: writes IHL byte (0x45 → 0x4F)
→ ip_do_fragment() reads 60B header when only 20B exist
→ ~32–64B heap memory included in each outbound fragment
| csum_offset | Campo corrompido | Consecuencia | Vector CVSS |
|---|---|---|---|
0 (predeterminado) | Byte IHL (offset 0) | Lectura OOB del heap → fuga de memoria | Divulgación de información |
6 | Flags/FragOffset (offset 6) | Interrupción del reensamblado de fragmentos | Disponibilidad |
Todas las versiones del kernel de Linux anteriores a los commits de corrección.
No afectadas (parcheadas): 5.10.272+, 5.15.223+, 6.1.190+, 6.12.113+, 6.18.57+, 7.2.11+
Comprueba la versión de tu kernel:
uname -r
cat /proc/version
Requisitos: solo Python 3.6+. Sin paquetes pip, sin red, sin root.
# Clone
git clone https://github.com/01luyicheng/CVE-2026-99999.git
cd CVE-2026-99999
# Run — IHL corruption / heap-leak simulation (CVSS 9.3 path, default)
python3 CVE-2026-99999_pwnescape.py --simulate
# Simulate with 5 datagrams and 8 fragments each
python3 CVE-2026-99999_pwnescape.py --simulate -n 5 -f 8
# Flags/FragOffset corruption path (fragment reassembly disruption)
python3 CVE-2026-99999_pwnescape.py --simulate -c 6
Sin --simulate, el script imprime la descripción completa de la vulnerabilidad y sale:
python3 CVE-2026-99999_pwnescape.py
| Flag | Descripción | Predeterminado |
|---|---|---|
--simulate | Ejecutar la simulación de la cadena de explotación (obligatorio) | — |
-c, --csum-offset | 0 = byte IHL (lectura fuera de límites, predeterminado); 6 = Flags/FragOffset | 0 |
-n, --num-packets | Número de datagramas a simular | 3 |
-f, --fragments | Fragmentos por datagrama (mínimo 2) | 4 |
La simulación se ejecuta en 5 pasos (no se requiere red):
virtio_net_hdr con
csum_start=0 (apuntando al byte IHL de IPv4) y un
csum_offset configurable.csum_start + csum_offset, mostrando qué byte de la cabecera IP
se sobrescribe y con qué valor.csum_offset=0), señala la fuga de memoria del heap de ~32–64B.python3 CVE-2026-99999_pwnescape.py --simulate -n 1 -c 0
csum_start=0, csum_offset=0 → la escritura recae sobre el byte IHL → IHL 5→15 →
ip_do_fragment() lee 60B cuando solo existen 20B → ~32–64B de memoria
heap filtrada por fragmento.
python3 CVE-2026-99999_pwnescape.py --simulate -n 1 -c 6
csum_start=0, csum_offset=6 → la escritura recae sobre el byte Flags/FragOffset →
metadatos de reensamblado de fragmentos corruptos → el reensamblado de fragmentación falla.
Este PoC ha sido revisado de forma independiente. Hallazgos clave:
Los informes completos de revisión técnica se conservan en el repositorio interno
(CVE-2026-99999-internal) por razones de seguridad.
Compruebe el estado del parche:
# Check if your kernel has the fix (look for commit 6785011f8b16abf40b1e9d8b2)
cat /proc/config.gz 2>/dev/null | zcat | grep CONFIG_IPV4
# Or check dmesg for related errors after heavy network activity from a VM