
Proof of concept esclusivamente simulativo per CVE-2026-99999, una vulnerabilità di validazione di csum_start IPv4 in virtio-net del kernel Linux che consente la divulgazione di memoria heap da guest a host.
Divulgazione di informazioni nel kernel Linux tramite metadati di checksum virtio-net malformati.
CVSS 9.3 CRITICO | CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
Scoperta da Paulos | CNA: kernel.org | Pubblicata: 2026-10-15
⚠️ Questo è un PoC didattico / di validazione. Viene eseguito solo in modalità --simulate
(nessun I/O di rete, nessun privilegio root richiesto). Dimostra la catena di attacco localmente
senza sfruttare alcun sistema attivo.
Una VM guest può inviare un frame virtio-net il cui virtio_net_hdr porta
csum_start == 0 — puntando all'interno dell'header IPv4 invece che all'header
di trasporto. Durante la segmentazione GSO sull'host, skb_checksum_help() ricalcola
il checksum che copre [csum_start, csum_start + csum_offset + 2) e scrive
il risultato in csum_start + csum_offset.
Quando csum_start = 0 e csum_offset = 0, la scrittura finisce sul byte IHL
(offset IP 0), corrompendolo da 0x45 (IHL 5 → 20 byte) a 0x4F
(IHL 15 → 60 byte). La funzione ip_do_fragment() del kernel legge quindi 60 byte di
header IP quando ne esistono solo 20 — trascinando ~32–64 byte di memoria heap
adiacente del kernel host in ciascun frammento in uscita.
Impatto: Divulgazione continua di memoria heap del kernel da guest a host.
Superficie di attacco: Host KVM/QEMU con NIC virtio-net e bridging TAP abilitato, o qualsiasi percorso di comunicazione VM→host in cui l'host elabora frame virtio-net tramite GSO.
| Offset | Campo | csum_offset=0 corrompe | csum_offset=6 corrompe |
|---|---|---|---|
| 0 | Version + IHL | ✅ byte IHL | |
| 1 | TOS | ||
| 2–3 | Total Length | ||
| 4–5 | Identification | ||
| 6–7 | Flags / Fragment Offset | ✅ Flags/FragOffset (lo) | |
| 8 | TTL | ||
| 9 | Protocol | ||
| 10–11 | Header Checksum | ||
| 12–15 | Source IP | ||
| 16–19 | Destination IP |
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 corrotto | Conseguenza | Vettore CVSS |
|---|---|---|---|
0 (predefinito) | Byte IHL (offset 0) | Lettura OOB dell'heap → memory leak | Divulgazione di informazioni |
6 | Flags/FragOffset (offset 6) | Interruzione del riassemblaggio dei frammenti | Disponibilità |
Tutte le versioni del kernel Linux precedenti ai commit di correzione.
Non interessate (corrette): 5.10.272+, 5.15.223+, 6.1.190+, 6.12.113+, 6.18.57+, 7.2.11+
Verifica la versione del tuo kernel:
uname -r
cat /proc/version
Requisiti: solo Python 3.6+. Nessun pacchetto pip, nessuna rete, nessun 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
Senza --simulate, lo script stampa la descrizione completa della vulnerabilità ed esce:
python3 CVE-2026-99999_pwnescape.py
| Flag | Descrizione | Predefinito |
|---|---|---|
--simulate | Esegue la simulazione della catena di exploit (obbligatorio) | — |
-c, --csum-offset | 0 = byte IHL (lettura OOB, predefinito); 6 = Flags/FragOffset | 0 |
-n, --num-packets | Numero di datagrammi da simulare | 3 |
-f, --fragments | Frammenti per datagramma (minimo 2) | 4 |
La simulazione si svolge in 5 passaggi (non è richiesta la rete):
virtio_net_hdr con
csum_start=0 (che punta al byte IHL dell'IPv4) e csum_offset
configurabile.csum_start + csum_offset, mostrando quale byte dell'header IP
viene sovrascritto e con quale valore.csum_offset=0), segnala la perdita di memoria heap di ~32–64B.python3 CVE-2026-99999_pwnescape.py --simulate -n 1 -c 0
csum_start=0, csum_offset=0 → la scrittura finisce sul byte IHL → IHL da 5 a 15 →
ip_do_fragment() legge 60B quando ne esistono solo 20 → ~32–64B di memoria heap
divulgati per frammento.
python3 CVE-2026-99999_pwnescape.py --simulate -n 1 -c 6
csum_start=0, csum_offset=6 → la scrittura finisce sul byte Flags/FragOffset →
metadati di riassemblaggio dei frammenti corrotti → il riassemblaggio dei frammenti fallisce.
Questo PoC è stato revisionato in modo indipendente. Risultati principali:
I report completi della revisione tecnica sono conservati nel repository interno
(CVE-2026-99999-internal) per motivi di sicurezza.
Verificare lo stato delle patch:
# 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