
nftables-Ingress-Regelsätze, die IPv4-TCP-SYNs mit IP-Optionen verwerfen, um die Use-after-free-Schwachstelle CVE-2026-98432 zu entschärfen, mit Zählern und Protokollierung pro Quelle.
nftables-Mitigation für CVE-2026-98432: verwirft IPv4-TCP-SYNs, die IP-Optionen tragen, so früh wie nftables es kann.
Die CVE ist eine Use-after-free-Schwachstelle im IPv4-TCP-Request-Socket-Pfad (ireq->ireq_opt / inet_opt, gelesen in ip_options_build()). Die richtige Lösung ist ein Kernel-Update; dies reduziert lediglich die Angriffsfläche, bis ein solches verfügbar ist.
ireq->ireq_opt wird an genau einer Stelle gesetzt, in tcp_v4_init_req(), aus den Optionen des SYN, das den Request-Socket öffnet; das konkurrierende erneut übertragene SYN liest nur, was dort gespeichert wurde, und im CVE-Szenario sendet der Angreifer ein SYN mit Record-Route- oder Timestamp-Optionen. Ein SYN mit Optionen ist also das entscheidende Paket. Die Migration des Request-Sockets verwendet dasselbe gespeicherte ireq_opt weiter. Dies stützt sich auf den Kernel-Quellcode und den CVE-Text, nicht auf eine Aussage der CVE-Autoren, dass SYN-only ausreichend ist; entferne den Abgleich tcp flags & (syn | ack) == syn aus den Regeln für die konservative Variante.
Setze IFACES auf die NICs, die externen Datenverkehr empfangen, und führe dann sudo nft -f simple.nft aus. Das Ruleset lautet:
define IFACES = { eth0 }
table netdev cve_2026_98432 {
chain ingress {
type filter hook ingress devices = $IFACES priority -500; policy accept;
ip protocol tcp ip hdrlength > 5 tcp flags & (syn | ack) == syn limit rate 5/second burst 10 packets log prefix "CVE-2026-98432 drop: " level warn
ip protocol tcp ip hdrlength > 5 tcp flags & (syn | ack) == syn counter drop
}
}
netdev ingress mit Priorität -500 ist der erste netfilter-Hook, vor prerouting, conntrack und Routing. XDP läuft weiterhin davor.ip hdrlength > 5 ist die IPv4-IHL in 32-Bit-Wörtern; ein Wert über 5 bedeutet Optionen.tcp flags & (syn | ack) == syn ist ein SYN ohne ACK.counter an der Drop-Regel ist die Gesamtsumme.Beobachten: sudo nft list chain netdev cve_2026_98432 ingress und journalctl -k -g 'CVE-2026-98432'.
fancy.nftfancy.nft ist derselbe Drop plus ein benannter Gesamtzähler und Zähler pro Adresse, gehalten in zwei dynamischen Sets. Es zählt und protokolliert außerdem jedes andere TCP-Paket mit IP-Optionen (durchgelassen, nicht verworfen), mit den Optionsbytes in der Logzeile (flags ip options, Präfix CVE-2026-98432 ip-options: ):
| Zähler | Wo | Was er anzeigt |
|---|---|---|
| total | benannter Zähler dropped_total | SYNs mit IP-Optionen, verworfen |
| other | benannter Zähler options_other | andere TCP-Pakete mit IP-Optionen, durchgelassen |
| pro Quell-IP | Set by_src | Pakete und Bytes pro verworfener Quelladresse |
| pro Quelle . Ziel | Set by_pair | dasselbe pro (Quelle, Ziel)-Paar |
| jede IP mit Optionen | Set options_by_src | Pakete und Bytes pro Quelladresse für jedes IPv4-Paket mit Optionen, jedes Protokoll (TCP, UDP, ICMP...), einschließlich der verworfenen SYNs |
sudo nft -f fancy.nft
sudo ./cve-log.sh # counters, then follow the kernel log
sudo ./cve-log.sh -c # counters only
sudo ./cve-log.sh -r # reset the total and the per-IP sets
Oder direkt:
sudo nft list counter netdev cve_2026_98432 dropped_total
sudo nft list counter netdev cve_2026_98432 options_other
sudo nft list set netdev cve_2026_98432 by_src
sudo nft list set netdev cve_2026_98432 by_pair
sudo nft list set netdev cve_2026_98432 options_by_src
Jedes Element hat seinen eigenen Paket- und Byte-Zähler und läuft 1h nach seinem letzten Treffer ab. Jedes Set fasst höchstens 65535 Einträge; ist eines voll, werden neue Adressen nicht mehr erfasst, das Paket wird aber weiterhin verworfen. Quelladressen können gefälscht werden, daher zeigen die Zähler pro IP, was die Pakete behauptet haben, nicht wer sie gesendet hat.
sudo nft delete table netdev cve_2026_98432.
Keine der beiden bleibt über einen Neustart hinweg erhalten; binden Sie die Datei aus /etc/nftables.conf ein.
fancy.nft fügt die Tabelle hinzu und baut nur die Regeln neu auf, sodass ein erneutes Laden die
Zähler beibehält; führen Sie zuerst nft delete table netdev cve_2026_98432 aus, um sie zurückzusetzen oder
ein Set zu ändern. Zähler liegen im Kernel-Speicher und überstehen keinen Neustart.