
eBPF-Mitigation (XDP/tc) für CVE-2026-98432 / RHSB-2026-016 – Entwurf
Eine eBPF-Implementierung der veröffentlichten Netzwerk-Gegenmaßnahme für CVE-2026-98432 ([RHSB-2026-016]): ein remote auslösbarer Use-after-free in der IPv4-TCP-Verbindungsanforderungsverarbeitung des Linux-Kernels. Red Hat stuft ihn als Critical ein.
[!WARNING] Frühzeitige Veröffentlichung: CI-getestet, noch nicht im Feld getestet. Jeder Push führt End-to-End-Tests auf Ubuntu 24.04, in AlmaLinux 8.10-, 9.8- und 10.2-VMs (RHEL-kompatible Kernel 4.18, 5.14 und 6.12) sowie auf einem 2-Knoten-Kubernetes- (kind-)Cluster mit Cilium durch, alle mit virtuellen Schnittstellen. Es wurde noch nicht auf physischen NICs, Bonds oder VLANs, auf OpenShift oder auf echtem RHEL getestet (siehe Getestete Plattformen). Probieren Sie es zuerst auf einem Nicht-Produktions-Host aus. Berichte über Ergebnisse, ob gut oder schlecht, sind sehr willkommen.
Das Programm verwirft eingehende IPv4-TCP-Pakete, die IP-Optionen tragen (IP- Header-Länge > 5 Wörter). Es ist derselbe Filter wie die nftables-Regel des Herstellers:
ip protocol tcp ip hdrlength > 5 counter drop
Er wendet dieselbe Prüfung auf das innere Paket von VXLAN (UDP 4789, 8472) und Geneve (UDP 6081) Overlays an. Auf diese Weise wird Kubernetes-Pod-zu-Pod-Verkehr zwischen Knoten auf der physischen Schnittstelle verworfen, bevor ein CNI-Plugin wie Cilium ihn an einen Pod ausliefern kann. Es läuft als XDP, wo der Treiber es unterstützt, und als tc ingress überall sonst.
Es gibt zwei Möglichkeiten, es auszuführen, mit demselben Filter und denselben Einstellungen:
cve-2026-98432-ebpf), der ip und tc
verwendet und von einem systemd-Dienst und -Timer gesteuert wird. Er ist am
einfachsten zu prüfen.cve-2026-98432-ebpfd), eine einzelne statische Binärdatei. Er
erfasst neue Schnittstellen sofort, läuft auf tc vor CNI-Programmen und
behält den Filter bei einem Absturz bei. Siehe Shell-Loader oder Go-
Daemon?[!IMPORTANT] Dies ist eine Übergangslösung, die die Exposition reduziert, aber den Fehler nicht behebt. Die einzige vollständige Behebung ist ein gepatchter Kernel. Entfernen Sie diese Mitigation, sobald jeder Host einen solchen ausführt (siehe Entfernung).
Dies ist ein unabhängiges Community-Projekt. Es ist nicht mit Red Hat oder einer Linux-Distribution verbunden oder von diesen unterstützt. Prüfen Sie das [Bulletin][RHSB-2026-016] für die aktuelle Anleitung.
Die nftables-Regel funktioniert, und wenn sie zu Ihrer Umgebung passt, verwenden Sie sie. Dieses Projekt ist für Umgebungen gedacht, in denen das nicht der Fall ist:
| nftables-Regel | dieses Projekt | |
|---|---|---|
| Wo Pakete verworfen werden | netfilter-input-Hook (nach skb-Allokation, IP-Defragmentierung und Routing) | XDP: im Treiber, bevor ein skb existiert. tc: vor netfilter |
| Abdeckung | Nur lokal adressierter Verkehr | Auch gerouteter und weitergeleiteter Verkehr, z. B. Pakete an Kubernetes-Pods, einschließlich innerhalb von VXLAN/Geneve-Overlays |
| Interaktion mit Firewall-Managern | Eine separate Tabelle, die persistiert werden muss und Tools überstehen muss, die das Ruleset neu schreiben | Berührt netfilter überhaupt nicht |
| Erfordert | nftables | iproute2, gebaut mit libbpf |
| Pro Schnittstelle | Nein (global) | Ja, und der Loader übernimmt das (siehe unten) |
Das neueste Release enthält:
-daemon-RPM (Go-Daemon) und
das Quell-RPMcve-2026-98432-ebpf-<version>.tar.gzSHA256SUMSDas RPM installiert den Loader, die BPF-Objekte, die Konfigurationsdatei und die systemd-
Units und zieht iproute-tc mit ein. Der Dienst wird nicht automatisch
aktiviert. Wählen Sie das RPM passend zu Ihrer Hauptversion (el8, el9 oder 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
Oder für den Go-Daemon (verwenden Sie eines von beiden, nicht beide; ihre Units stehen im Konflikt):
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
Auf Debian und Ubuntu verwenden Sie die .debs (nächster Abschnitt). Auf anderen Distributionen bauen und installieren Sie aus dem Quell-Tarball (siehe Schnellstart).
Ein Upgrade erfolgt mit dnf install eines neueren RPM. Der Dienst wird neu gestartet, damit die neuen
BPF-Objekte angehängt werden, und Ihre Änderungen an /etc/cve-2026-98432-ebpf.conf
bleiben erhalten.
Um das RPM selbst zu bauen, siehe den Kommentar am Anfang von packaging/rpm/build-rpm.sh. Bei jedem Push baut die CI die RPMs in AlmaLinux-Containern, installiert jedes einzelne in einer AlmaLinux-VM und testet es, einschließlich der systemd-Units.
Das Release enthält außerdem zwei amd64-.debs, die auf jeder unterstützten Version funktionieren: Die BPF-Objekte enthalten keinen Host-Code und der Daemon ist eine statische Binärdatei. Sie enthalten dieselben Dateien wie die RPMs und aktivieren ebenfalls nicht den Dienst:
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
Oder der Go-Daemon, ./cve-2026-98432-ebpf-daemon_0.1.1-1_amd64.deb, aktiviert
wie im RPM-Abschnitt. Debian und Ubuntu liefern tc im iproute2-Paket selbst,
gebaut mit libbpf.
Um sie selbst zu bauen, führe
packaging/deb/build-deb.sh aus. Bei jedem Push
baut die CI die .debs, installiert sie auf Ubuntu 24.04 und führt die End-to-End- und
systemd-Tests gegen die installierten Dateien aus. Sie installiert sie außerdem auf Debian
12 und 13 sowie Ubuntu 22.04 und 24.04 und führt dort check aus.
Verwende einen Git-Checkout oder das Quell-Tarball aus einem GitHub-Release.
Zum Bauen benötigst du clang, llvm, libbpf-devel / libbpf-dev und die
Kernel-UAPI-Header:
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 listet jede geschützte Schnittstelle und ihre Anbindung auf, sowie die
Anzahl der verworfenen Pakete (der Zähler benötigt bpftool):
eth0 XDP
wg0 tc
packets dropped: 3
Ohne systemd sudo cve-2026-98432-ebpf apply und remove direkt ausführen.
Um den Go-Daemon aus dem Quellcode zu bauen, benötigen Sie Go ≥ 1.22, clang und die libbpf-Header:
cd go && go generate ./... && CGO_ENABLED=0 go build -o cve-2026-98432-ebpfd .
sudo ./cve-2026-98432-ebpfd run --mode auto # SIGTERM detaches