
XDP/eBPF-Programm, das IPv4-Pakete mit IP-Optionen (IHL > 5) an der Schnittstelle verwirft, um die TCP-Handshake-Use-after-free-Schwachstelle CVE-2026-98432 zu entschärfen.
Ein kleines XDP-Programm zur Abmilderung von CVE-2026-98432, einem Use-after-free in der Behandlung von IPv4-Optionen im TCP-Handshake des Kernels. Auf den meisten Hosts kann der Fehler nur durch ein eingehendes SYN ausgelöst werden, das IP-Optionen trägt (siehe die NetLabel/CIPSO-Ausnahme unten), daher verwirft dieses Programm IPv4-Pakete mit Optionen, bevor sie an den Netzwerk-Stack des Kernels weitergegeben werden.
Ein Paket hat IP-Optionen, wenn sein IHL-Feld (Header Length) größer als 5 ist, was bedeutet, dass der IPv4-Header länger als 20 Bytes ist.
[!WARNING] Dies schützt möglicherweise keine Hosts, die NetLabel/CIPSO verwenden (SELinux oder Smack mit einer
CIPSOV4-Zuordnung). Auf solchen Hosts kann der Kernel selbst IP-Optionen anhängen, sodass der Fehler möglicherweise auch mit gewöhnlichen SYNs erreichbar ist. Ein gepatchter Kernel ist dort die zuverlässigere Lösung.netlabelctl map listkann helfen festzustellen, ob ein Host CIPSO verwendet: Einträge vom TypCIPSOV4deuten darauf hin.
| Paket | Aktion |
|---|---|
| IPv4 mit Optionen (IHL > 5) | XDP_DROP |
| IPv4 ohne Optionen | XDP_PASS |
| Alles andere (IPv6, ARP, …) | XDP_PASS |
| Abgeschnittener / fehlerhafter Header | XDP_PASS |
VLAN-getaggte Frames werden ebenfalls behandelt: Das Programm überspringt bis zu zwei VLAN-Tags (802.1Q und 802.1ad/QinQ), bevor es auf IPv4 prüft. Frames mit mehr als zwei Tags werden durchgelassen.
Auf einem Linux-Host:
clang und llvmlibbpf-dev (für bpf/bpf_helpers.h)linux-headers-$(uname -r) oder linux-libc-dev)iproute2 (für ip link) und optional bpftoolDebian / Ubuntu:
sudo apt install clang llvm libbpf-dev linux-libc-dev iproute2 bpftool
Fedora:
sudo dnf install clang llvm libbpf-devel kernel-headers iproute bpftool
make
Dies erzeugt drop_ipv4_opt.o.
Ersetze eth0 durch den Namen deiner Schnittstelle (siehe ip link).
Nativer (Treiber-)Modus, der schnellste:
sudo ip link set dev eth0 xdpdrv obj drop_ipv4_opt.o sec xdp
Generischer (SKB-)Modus, der auf jeder Schnittstelle funktioniert, aber langsamer ist:
sudo ip link set dev eth0 xdpgeneric obj drop_ipv4_opt.o sec xdp
Den Modus vom Kernel wählen lassen (nativ, falls unterstützt, sonst generisch):
sudo ip link set dev eth0 xdp obj drop_ipv4_opt.o sec xdp
ip link show dev eth0 # look for "xdp" / "prog/xdp id N"
sudo bpftool net show dev eth0
sudo ip link set dev eth0 xdp off
Verwende xdpdrv off oder xdpgeneric off, wenn du es in diesem spezifischen Modus angehängt hast.
Sende von einem anderen Host ein Paket mit einer IP-Option, z. B. mit der Record-Route-Option:
ping -R <target-ip>
Mit angehängtem Programm erhalten diese Pings keine Antwort. Ein normales ping <target-ip> funktioniert weiterhin.
MIT. Siehe LICENSE.