
CVE-2026-99999 Educational Analysis — Simulation der Angriffskette der Linux-Kernel-csum_start-Schwachstelle (CVSS 9.3). Siehe auch: CVE-2026-99999-exploit (funktionierender PoC).
⚠️ Dies ist das Repository für Schulungs-/Analysezwecke. Es demonstriert die Angriffskette von CVE-2026-99999 lokal (kein Netzwerk, kein Root, kein echter Exploit).
🔴 Sie suchen einen funktionierenden Exploit? → Siehe CVE-2026-99999-exploit (echter VM-Escape-PoC, erfordert KVM/QEMU-Laborumgebung).
Validierungsfehler bei csum_start im IPv4-Stack des Linux-Kernels — Guest-to-Host-Speicherofflegung
CVSS 9.3 CRITICAL | CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
Entdeckt von Paulos | CNA: kernel.org | Veröffentlicht: 2026-10-15
Dies ist ein Schulungs-/Analyseprojekt. Es demonstriert die Angriffskette von CVE-2026-99999 lokal (kein Netzwerk, kein Root, kein echter Exploit). Einen funktionierenden Exploit, der die echte Schwachstelle in einer Live-Umgebung auslöst, finden Sie im internen Exploit-Repository.
⚠️ Nur für autorisierte Sicherheitsforschung in isolierten Laborumgebungen.
Eine Gast-VM kann einen virtio-net-Frame senden, dessen virtio_net_hdr
csum_start == 0 trägt — was auf den IPv4-Header statt auf den Transport-Header
zeigt. Während der GSO-Segmentierung auf dem Host berechnet skb_checksum_help()
die Prüfsumme über den Bereich ab csum_start neu und schreibt das Ergebnis
zurück nach csum_start + csum_offset.
Bei csum_start = 0 und csum_offset = 0 landet der Schreibvorgang auf dem IHL-Byte
(IP-Offset 0) und beschädigt es von 0x45 (IHL 5 → 20 Bytes) zu 0x4F
(IHL 15 → 60 Bytes). Das ip_do_fragment() des Kernels liest daraufhin 60 Bytes des IP-
Headers, obwohl nur 20 Bytes existieren — und zieht so ~32–64 Bytes angrenzenden
Host-Kernel-Heap-Speichers in jedes ausgehende Fragment.
Auswirkung: Kontinuierliche Offenlegung von Kernel-Heap-Speicher vom Gast zum Host.
struct virtio_net_hdr { // 10 bytes
uint8_t flags; // VIRTIO_NET_HDR_F_NEEDS_CSUM = 0x01
uint8_t gso_type; // VIRTIO_NET_HDR_GSO_NONE = 0x00
uint16_t hdr_len; // network layer header length
uint16_t gso_size; // GSO segment size
uint16_t csum_start; // offset to transport header start
uint16_t csum_offset; // offset to checksum field within transport header
};
| Einstellung | csum_start | csum_offset | Schreibziel | Ergebnis |
|---|---|---|---|---|
| Normal (UDP-Csum-Offload) | 34 (Eth+IP) | 6 (UDP-Cksum) | Byte 40 (UDP-Prüfsummenfeld) | ✅ Sicher |
| Exploit (IHL-Korruption) | 0 (IP-Header) | 0 (IHL-Byte) | Byte 0 (IHL-Byte) | 🔴 IHL korrumpiert |
| Exploit (FragOffset) | 0 (IP-Header) | 6 (Flags) | Byte 6 (Flags/FragOffset) | 🟡 Reassemblierung unterbrochen |
skb_checksum_help(skb, csum_start=0, csum_offset=0):
1. Read skb data at offset csum_start (0) = start of IP header
2. Compute one's complement sum over [0, csum_offset+2) = [0, 2) = first 2 bytes
3. Write 16-bit result to offset csum_start + csum_offset = byte 0
4. Result: IHL byte 0x45 → 0x4F (IHL 5→15)
5. ip_do_fragment() called with corrupted iph:
→ reads 60 bytes of "IP header" (iph + 40 bytes of HEAP DATA)
→ includes that heap data in each outbound fragment
┌──────────────────────────────────────────────────────────────────────────┐
│ ATTACK CHAIN OVERVIEW │
└──────────────────────────────────────────────────────────────────────────┘
Guest VM (attacker)
│
│ ① build_crafted_packet()
│ [virtio_net_hdr(csum_start=0)]
│ [Eth header]
│ [IPv4 header: 0x45 = IHL 5]
│ [UDP header]
│ [payload: "CVE-2026-99999-POC"]
│
▼
QEMU / vhost-user backend
│
│ ② Frame passes through virtio-net
│ virtio_net_hdr is stored in skb->data
│ csum_start=0 stored in skb->csum_start
│
▼
Host Linux Kernel — GSO Segmentation Path
│
│ ③ skb_checksum_help() called
│ Reads: csum_start=0 (IP header start)
│ Computes: checksum over first 2 bytes
│ Writes: result to byte 0 (IHL byte)
│ IHL: 0x45 → 0x4F (IHL 5 → 15)
│
│ ④ ip_do_fragment() called with corrupted header
│ Reads: 60 bytes of "IP header"
│ Actually reads: 20B real header + 40B HEAP DATA
│ Includes heap data in each fragment payload
│
▼
Outbound Network Frames
│
│ ⑤ Each fragment contains:
│ [Eth (14B)] [IP (60B — IHL says 60, only 20 exist)]
│ [Fragment payload]
│ [+ ~32-64 bytes of HOST KERNEL HEAP MEMORY]
│
▼
Evidence captured on host bridge
│
│ ⑥ tcpdump / receive_and_dump.py
│ Captures frames with IHL=0x4F
│ Frames larger than expected by ~32-64 bytes
│ Extra bytes = host kernel heap memory!
| Offset | Feld | Normalwert | csum_offset=0 beschädigt | csum_offset=6 beschädigt |
|---|---|---|---|---|
| 0 | Version(4) + IHL(4) | 0x45 | ✅ IHL → 0x4F | |
| 1 | TOS | 0x00 | ||
| 2–3 | Gesamtlänge | variiert | ||
| 4–5 | Identifikation | variiert | ||
| 6–7 | Flags + Fragment-Offset | 0x20.. | ✅ Flags/FragOffset lo | |
| 8 | TTL | 0x40 | ||
| 9 | Protokoll | 0x11 (UDP) | ||
| 10–11 | Header-Prüfsumme | berechnet | ||
| 12–15 | Quell-IP | variiert | ||
| 16–19 | Ziel-IP | variiert |
In einem normalen virtio-net-Paket mit UDP-Checksum-Offload:
Packet layout:
[Eth (14B)] [IP (20B)] [UDP (8B)] [payload]
virtio_net_hdr:
csum_start = 34 ← points at UDP header (Eth+IP = 14+20)
csum_offset = 6 ← UDP checksum field is 6 bytes into UDP header
skb_checksum_help():
Write target = 34 + 6 = 40 ← byte 40 is the UDP checksum field ✓ SAFE
Mit CVE-2026-99999 Exploit:
Packet layout:
[virtio_net_hdr (10B)] [Eth (14B)] [IP (20B)] [UDP (8B)] [payload]
virtio_net_hdr (MALICIOUS):
csum_start = 0 ← points at start of IP header!
csum_offset = 0 ← write lands on byte 0 = IHL byte!
skb_checksum_help():
Write target = 0 + 0 = 0 ← byte 0 is the IHL byte ← CORRUPTED!
IHL: 0x45 (0100 0101) → 0x4F (0100 1111)
IHL: 5 (5×4=20 bytes) → 15 (15×4=60 bytes)
ip_do_fragment():
Reads 60 bytes as "IP header"
Only 20 bytes exist → 40 bytes of ADJACENT HEAP MEMORY read!
Voraussetzungen: Nur Python 3.6+. Kein Netzwerk, kein Root, keine Abhängigkeiten.
# Clone
git clone https://github.com/01luyicheng/CVE-2026-99999-analysis.git
cd CVE-2026-99999-analysis/poc
# Run — IHL corruption / heap-leak simulation (CVSS 9.3 path, default)
python3 cve_2026_99999.py --simulate
# Flags/FragOffset corruption path (fragment reassembly disruption)
python3 cve_2026_99999.py --simulate -c 6