
Mitigazione eBPF (XDP/tc) per CVE-2026-98432 / RHSB-2026-016 - bozza
Un'implementazione eBPF della mitigazione di rete pubblicata per CVE-2026-98432 ([RHSB-2026-016]): una use-after-free attivabile da remoto nella gestione delle richieste di connessione TCP IPv4 del kernel Linux. Red Hat la classifica come Critica.
[!WARNING] Rilascio anticipato: testato in CI, non ancora testato sul campo. Ogni push esegue test end-to-end su Ubuntu 24.04, in VM AlmaLinux 8.10, 9.8 e 10.2 (kernel compatibili RHEL 4.18, 5.14 e 6.12), e su un cluster Kubernetes (kind) a 2 nodi con Cilium, tutti con interfacce virtuali. Non è ancora stato testato su NIC fisiche, bond o VLAN, su OpenShift, né su RHEL reale (vedi Piattaforme testate). Provalo prima su un host non di produzione. I resoconti dei risultati, positivi o negativi, sono molto benvenuti.
Il programma scarta i pacchetti TCP IPv4 in ingresso che trasportano opzioni IP (lunghezza dell'header IP > 5 word). È lo stesso filtro della regola nftables del vendor:
ip protocol tcp ip hdrlength > 5 counter drop
Applica lo stesso controllo al pacchetto interno degli overlay VXLAN (UDP 4789, 8472) e Geneve (UDP 6081). In questo modo, il traffico pod-to-pod di Kubernetes tra i nodi viene scartato sull'interfaccia fisica, prima che un plugin CNI come Cilium possa consegnarlo a un pod. Viene eseguito come XDP dove il driver lo supporta, e come tc ingress ovunque altrove.
Ci sono due modi per eseguirlo, con lo stesso filtro e le stesse impostazioni:
cve-2026-98432-ebpf), che utilizza ip e tc ed è gestito da un servizio e un timer systemd. È il più semplice da verificare.cve-2026-98432-ebpfd), un singolo binario statico. Copre immediatamente le nuove interfacce, viene eseguito prima dei programmi CNI su tc e mantiene il filtro collegato in caso di crash. Vedi Loader shell o daemon Go?[!IMPORTANT] Questa è una soluzione tampone che riduce l'esposizione, non corregge il bug. L'unica correzione completa è un kernel aggiornato. Rimuovi questa mitigazione una volta che ogni host ne esegue uno (vedi Rimozione).
Questo è un progetto comunitario indipendente. Non è affiliato né approvato da Red Hat o da qualsiasi distributore Linux. Consulta il [bollettino][RHSB-2026-016] per le indicazioni aggiornate.
La regola nftables funziona, e se si adatta al tuo ambiente, usala. Questo progetto è pensato per gli ambienti in cui non funziona:
| regola nftables | questo progetto | |
|---|---|---|
| Dove vengono scartati i pacchetti | hook input di netfilter (dopo l'allocazione dello skb, la deframmentazione IP e il routing) | XDP: nel driver, prima che esista uno skb. tc: prima di netfilter |
| Copertura | Solo traffico indirizzato localmente | Anche traffico instradato e inoltrato, ad es. pacchetti verso i pod Kubernetes, inclusi all'interno degli overlay VXLAN/Geneve |
| Interazione con i gestori di firewall | Una tabella separata che deve essere resa persistente e sopravvivere agli strumenti che riscrivono il ruleset | Non tocca affatto netfilter |
| Richiede | nftables | iproute2 compilato con libbpf |
| Per interfaccia | No (globale) | Sì, e il loader se ne occupa (vedi sotto) |
L'ultima release contiene:
-daemon (daemon Go) e l'RPM sorgentecve-2026-98432-ebpf-<version>.tar.gzSHA256SUMSL'RPM installa il loader, gli oggetti BPF, il file di configurazione e le unit systemd, e include iproute-tc. Il servizio non viene abilitato automaticamente. Scegli l'RPM corrispondente alla tua versione principale (el8, el9 o el10):
sha256sum -c SHA256SUMS --ignore-missing # verify what you downloaded
sudo dnf install ./cve-2026-98432-ebpf-0.1.1-1.el9.x86_64.rpm
sudo systemctl enable --now cve-2026-98432-ebpf.service cve-2026-98432-ebpf-reconcile.timer
sudo cve-2026-98432-ebpf status
Oppure, per il demone Go (usare uno o l'altro, non entrambi; le loro unità sono in conflitto):
sudo dnf install ./cve-2026-98432-ebpf-daemon-0.1.1-1.el9.x86_64.rpm
sudo systemctl enable --now cve-2026-98432-ebpfd.service
sudo cve-2026-98432-ebpfd status
Su Debian e Ubuntu, usare i .deb (sezione successiva). Su altre distribuzioni, compilare e installare dal tarball dei sorgenti (vedere Avvio rapido).
L'aggiornamento consiste in un dnf install di un RPM più recente. Il servizio si riavvia così i nuovi
oggetti BPF vengono collegati, e le modifiche a /etc/cve-2026-98432-ebpf.conf
vengono mantenute.
Per compilare l'RPM autonomamente, vedere il commento all'inizio di packaging/rpm/build-rpm.sh. A ogni push, la CI compila gli RPM in container AlmaLinux, installa ciascuno in una VM AlmaLinux e lo testa, incluse le unit systemd.
La release include anche due .deb amd64, che funzionano su ogni release supportata: gli oggetti BPF non contengono codice host e il daemon è un binario statico. Contengono gli stessi file degli RPM, e anch'essi non abilitano il servizio:
sha256sum -c SHA256SUMS --ignore-missing
sudo apt install ./cve-2026-98432-ebpf_0.1.1-1_amd64.deb
sudo systemctl enable --now cve-2026-98432-ebpf.service cve-2026-98432-ebpf-reconcile.timer
sudo cve-2026-98432-ebpf status
Oppure il daemon Go, ./cve-2026-98432-ebpf-daemon_0.1.1-1_amd64.deb, abilitato
come nella sezione RPM. Debian e Ubuntu includono tc in iproute2 stesso,
compilato con libbpf.
Per compilarli autonomamente, esegui
packaging/deb/build-deb.sh. A ogni push, la CI
compila i .deb, li installa su Ubuntu 24.04 ed esegue i test end-to-end e
systemd sui file installati. Li installa inoltre su Debian
12 e 13 e Ubuntu 22.04 e 24.04 ed esegue check lì.
Usa un checkout git o il tarball dei sorgenti da una release GitHub.
Per compilare, sono necessari clang, llvm, libbpf-devel / libbpf-dev e gli
header UAPI del kernel:
make
sudo make install
sudo cve-2026-98432-ebpf check # verify prerequisites
sudo systemctl enable --now cve-2026-98432-ebpf.service cve-2026-98432-ebpf-reconcile.timer
sudo cve-2026-98432-ebpf status
status elenca ogni interfaccia protetta e come è collegata, oltre al
numero di pacchetti scartati (il contatore richiede bpftool):
eth0 XDP
wg0 tc
packets dropped: 3
Senza systemd, esegui direttamente sudo cve-2026-98432-ebpf apply e remove.
Per compilare il daemon Go dai sorgenti, sono necessari Go ≥ 1.22, clang e gli header di libbpf:
cd go && go generate ./... && CGO_ENABLED=0 go build -o cve-2026-98432-ebpfd .
sudo ./cve-2026-98432-ebpfd run --mode auto # SIGTERM detaches
ip -V deve menzionare libbpf. check
lo verifica. Verificato in CI su AlmaLinux 8.10, 9.8 e 10.2 (iproute2 6.2
fino a 6.17) e Ubuntu 24.04.tc: su RHEL, AlmaLinux, Rocky e Fedora viene distribuito separatamente, nel
pacchetto iproute-tc (dnf install iproute-tc).CAP_NET_ADMIN + CAP_BPF/CAP_SYS_ADMIN).