
Programma XDP/eBPF che scarta i pacchetti IPv4 contenenti opzioni IP (IHL > 5) a livello di interfaccia per mitigare la use-after-free dell'handshake TCP della CVE-2026-98432.
Un piccolo programma XDP per mitigare CVE-2026-98432, un use-after-free nella gestione dell'handshake TCP del kernel per le opzioni IPv4. Sulla maggior parte degli host il bug può essere attivato solo da un SYN in ingresso che trasporta opzioni IP (vedi l'eccezione NetLabel/CIPSO qui sotto), quindi questo programma scarta i pacchetti IPv4 con opzioni prima che vengano passati allo stack di rete del kernel.
Un pacchetto ha opzioni IP quando il suo campo IHL (lunghezza dell'header) è maggiore di 5, il che significa che l'header IPv4 è più lungo di 20 byte.
[!WARNING] Questo potrebbe non proteggere gli host che utilizzano NetLabel/CIPSO (SELinux o Smack con una mappatura
CIPSOV4). Su quegli host il kernel può aggiungere da solo le opzioni IP, quindi il bug potrebbe essere raggiungibile con normali SYN. Un kernel aggiornato è la soluzione più affidabile in quei casi.netlabelctl map listpuò aiutare a capire se un host utilizza CIPSO: le voci di tipoCIPSOV4suggeriscono di sì.
| Pacchetto | Azione |
|---|---|
| IPv4 con opzioni (IHL > 5) | XDP_DROP |
| IPv4 senza opzioni | XDP_PASS |
| Qualsiasi altra cosa (IPv6, ARP, …) | XDP_PASS |
| Header troncato / malformato | XDP_PASS |
Vengono gestiti anche i frame con tag VLAN: il programma salta fino a due tag VLAN (802.1Q e 802.1ad/QinQ) prima di verificare la presenza di IPv4. I frame con più di due tag vengono lasciati passare.
Su un host Linux:
clang e llvmlibbpf-dev (per bpf/bpf_helpers.h)linux-headers-$(uname -r) o linux-libc-dev)iproute2 (per ip link), e facoltativamente 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
Questo produce drop_ipv4_opt.o.
Sostituisci eth0 con il nome della tua interfaccia (vedi ip link).
Modalità nativa (driver), che è la più veloce:
sudo ip link set dev eth0 xdpdrv obj drop_ipv4_opt.o sec xdp
Modalità generica (SKB), che funziona su qualsiasi interfaccia ma è più lenta:
sudo ip link set dev eth0 xdpgeneric obj drop_ipv4_opt.o sec xdp
Lascia che sia il kernel a scegliere la modalità (nativa se supportata, altrimenti generica):
sudo ip link set dev eth0 xdp obj drop_ipv4_opt.o sec xdp
ip link show dev eth0 # cerca "xdp" / "prog/xdp id N"
sudo bpftool net show dev eth0
sudo ip link set dev eth0 xdp off
Usa xdpdrv off o xdpgeneric off se lo hai collegato in quella modalità specifica.
Da un altro host, invia un pacchetto con un'opzione IP, ad esempio con l'opzione Record Route:
ping -R <target-ip>
Con il programma collegato, questi ping non ricevono risposta. Un normale ping <target-ip> funziona ancora.
MIT. Vedi LICENSE.