
Programme XDP/eBPF qui supprime les paquets IPv4 portant des options IP (IHL > 5) au niveau de l'interface afin d'atténuer la faille use-after-free de la poignée de main TCP CVE-2026-98432.
Un petit programme XDP pour atténuer CVE-2026-98432, un use-after-free dans la gestion de la poignée de main TCP du noyau pour les options IPv4. Sur la plupart des hôtes, le bug ne peut être déclenché que par un SYN entrant portant des options IP (voir l'exception NetLabel/CIPSO ci-dessous), donc ce programme supprime les paquets IPv4 avec options avant qu'ils ne soient transmis à la pile réseau du noyau.
Un paquet possède des options IP lorsque son champ IHL (longueur d'en-tête) est supérieur à 5, ce qui signifie que l'en-tête IPv4 est plus long que 20 octets.
[!WARNING] Cela peut ne pas protéger les hôtes utilisant NetLabel/CIPSO (SELinux ou Smack avec un mappage
CIPSOV4). Sur ces hôtes, le noyau peut attacher lui-même des options IP, donc le bug peut être atteignable avec des SYN ordinaires. Un noyau corrigé est la solution plus fiable dans ce cas.netlabelctl map listpeut aider à déterminer si un hôte utilise CIPSO : des entrées de typeCIPSOV4suggèrent que c'est le cas.
| Paquet | Action |
|---|---|
| IPv4 avec options (IHL > 5) | XDP_DROP |
| IPv4 sans options | XDP_PASS |
| Tout le reste (IPv6, ARP, …) | XDP_PASS |
| En-tête tronqué / malformé | XDP_PASS |
Les trames étiquetées VLAN sont également gérées : le programme saute jusqu'à deux étiquettes VLAN (802.1Q et 802.1ad/QinQ) avant de vérifier la présence d'IPv4. Les trames comportant plus de deux étiquettes sont transmises.
Sur un hôte Linux :
clang et llvmlibbpf-dev (pour bpf/bpf_helpers.h)linux-headers-$(uname -r) ou linux-libc-dev)iproute2 (pour ip link), et éventuellement 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
Cela produit drop_ipv4_opt.o.
Remplacez eth0 par le nom de votre interface (voir ip link).
Mode natif (pilote), qui est le plus rapide :
sudo ip link set dev eth0 xdpdrv obj drop_ipv4_opt.o sec xdp
Mode générique (SKB), qui fonctionne sur n'importe quelle interface mais est plus lent :
sudo ip link set dev eth0 xdpgeneric obj drop_ipv4_opt.o sec xdp
Laisser le noyau choisir le mode (natif si pris en charge, sinon générique) :
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
Utilisez xdpdrv off ou xdpgeneric off si vous l'avez attaché dans ce mode spécifique.
Depuis un autre hôte, envoyez un paquet avec une option IP, par exemple avec l'option Record Route :
ping -R <target-ip>
Avec le programme attaché, ces pings ne reçoivent aucune réponse. Un ping <target-ip> normal fonctionne toujours.
MIT. Voir LICENSE.