
Prova de conceito apenas de simulação para CVE-2026-99999, uma falha de validação de csum_start IPv4 do virtio-net no kernel Linux que permite a divulgação de memória heap do convidado para o host.
Divulgação de informações do kernel Linux por meio de metadados de checksum malformados do virtio-net.
CVSS 9.3 CRÍTICO | CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
Descoberto por Paulos | CNA: kernel.org | Publicado: 2026-10-15
⚠️ Este é um PoC educacional / de validação. Ele é executado apenas no modo --simulate
(sem I/O de rede, sem necessidade de root). Ele demonstra a cadeia de ataque localmente
sem explorar nenhum sistema ativo.
Uma VM convidada pode enviar um quadro virtio-net cujo virtio_net_hdr carrega
csum_start == 0 — apontando para o cabeçalho IPv4 em vez do cabeçalho de
transporte. Durante a segmentação GSO no host, skb_checksum_help() recalcula
o checksum cobrindo [csum_start, csum_start + csum_offset + 2) e grava
o resultado de volta em csum_start + csum_offset.
Quando csum_start = 0 e csum_offset = 0, a gravação recai sobre o byte IHL
(offset 0 do IP), corrompendo-o de 0x45 (IHL 5 → 20 bytes) para 0x4F
(IHL 15 → 60 bytes). O ip_do_fragment() do kernel então lê 60 bytes de
cabeçalho IP quando existem apenas 20 bytes — puxando ~32–64 bytes de memória
heap adjacente do kernel do host para cada fragmento de saída.
Impacto: Divulgação contínua de memória heap do kernel do host para o convidado.
Superfície de ataque: Hosts KVM/QEMU com NICs virtio-net e bridge TAP habilitados, ou qualquer caminho de comunicação VM→host em que o host processa quadros virtio-net por meio de GSO.
| Offset | Campo | csum_offset=0 corrompe | csum_offset=6 corrompe |
|---|---|---|---|
| 0 | Versão + IHL | ✅ byte IHL | |
| 1 | TOS | ||
| 2–3 | Comprimento Total | ||
| 4–5 | Identificação | ||
| 6–7 | Flags / Offset de Fragmento | ✅ Flags/FragOffset (lo) | |
| 8 | TTL | ||
| 9 | Protocolo | ||
| 10–11 | Checksum do Cabeçalho | ||
| 12–15 | IP de Origem | ||
| 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 | Consequência | Vetor CVSS |
|---|---|---|---|
0 (padrão) | Byte IHL (offset 0) | Leitura OOB no heap → vazamento de memória | Divulgação de Informações |
6 | Flags/FragOffset (offset 6) | Interrupção da remontagem de fragmentos | Disponibilidade |
Todas as versões do kernel Linux anteriores aos commits de correção.
Não afetadas (corrigidas): 5.10.272+, 5.15.223+, 6.1.190+, 6.12.113+, 6.18.57+, 7.2.11+
Verifique a versão do seu kernel:
uname -r
cat /proc/version
Requisitos: Apenas Python 3.6+. Sem pacotes pip, sem rede, sem 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
Sem --simulate, o script imprime a descrição completa da vulnerabilidade e encerra:
python3 CVE-2026-99999_pwnescape.py
| Flag | Descrição | Padrão |
|---|---|---|
--simulate | Executa a simulação da cadeia de exploração (obrigatório) | — |
-c, --csum-offset | 0 = byte IHL (leitura OOB, padrão); 6 = Flags/FragOffset | 0 |
-n, --num-packets | Número de datagramas a simular | 3 |
-f, --fragments | Fragmentos por datagrama (mínimo 2) | 4 |
A simulação é executada em 5 etapas (não requer rede):
virtio_net_hdr com
csum_start=0 (apontando para o byte IHL do IPv4) e csum_offset
configurável.csum_start + csum_offset, mostrando qual byte do
cabeçalho IP é sobrescrito e com qual valor.csum_offset=0), observa o vazamento de memória heap de ~32–64B.python3 CVE-2026-99999_pwnescape.py --simulate -n 1 -c 0
csum_start=0, csum_offset=0 → a escrita recai sobre o byte IHL → IHL 5→15 →
ip_do_fragment() lê 60B quando existem apenas 20B → ~32–64B de memória heap
vazada por fragmento.
python3 CVE-2026-99999_pwnescape.py --simulate -n 1 -c 6
csum_start=0, csum_offset=6 → a escrita recai sobre o byte Flags/FragOffset →
metadados de remontagem de fragmentos corrompidos → a remontagem de fragmentos falha.
Este PoC foi revisto de forma independente. Principais conclusões:
Os relatórios completos de revisão técnica são mantidos no repositório interno
(CVE-2026-99999-internal) por razões de segurança.
Verifique o estado do 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
6785011f8b16abf40b1e9d8b2 (árvores estáveis), f43798c27684 (mainline)<[email protected]>