
Script shell che valuta lo stato delle patch del kernel Ubuntu per CVE-2026-98432 e applica una soluzione tampone persistente con nftables o iptables che scarta i pacchetti TCP IPv4 contenenti opzioni IP.
# 1. Inspect the host; no changes.
sudo ./cve-2026-98432-mitigate.sh check
# 2. Get a patch-state verdict for the exact running kernel package.
sudo ./cve-2026-98432-mitigate.sh assess
# 3. Apply the stopgap filter and make it survive reboot.
sudo ./cve-2026-98432-mitigate.sh enable
# 4. Prove that normal TCP still works and IP-option TCP is dropped.
sudo ./cve-2026-98432-mitigate.sh verify
# 5. Monitor. Exit 0 = healthy, 1 = mismatch/persistence failure, 2 = no state.
sudo ./cve-2026-98432-mitigate.sh status
# 6. After booting a kernel that Ubuntu marks as fixed.
sudo ./cve-2026-98432-mitigate.sh disable
enable rifiuta di modificare il ruleset quando viene rilevato CIPSO/NetLabel, perché la regola scarta tutto il traffico TCP che trasporta opzioni IP, incluso il traffico etichettato. Usa --ignore-cipso solo se accetti questo compromesso. I container o gli host senza systemd dovrebbero usare --no-persist; altrimenti enable esce con codice 4 quando non è possibile stabilire la persistenza al riavvio, mantenendo comunque attiva la regola.
CVE-2026-98432 è una use-after-free nell'handshake TCP IPv4 di Linux. È raggiungibile quando un SYN in ingresso trasporta opzioni IP. La correzione reale è un kernel con patch; questo script è una soluzione tampone che scarta i pacchetti TCP IPv4 in ingresso la cui lunghezza dell'header IP è maggiore di 5 (IHL 6-15), ovvero i pacchetti che trasportano opzioni IP, prima di conntrack e del NAT di Docker.
Supporta due backend equivalenti:
table ip cve_2026_98432, priorità prerouting -310, solo TCP, counter, drop.raw PREROUTING, match u32 0>>24&0xf=6:15, solo TCP, counter, drop.La forma nft usa la famiglia ip e una priorità numerica, così funziona sia su nft 0.5 di Ubuntu 16.04 sia su nft 1.x attuale. La forma iptables funziona con iptables 1.6 e successivi. Nessun pacchetto viene installato a meno che non venga passato --install-nft.
Lo script convalida la regola attesa completa, non frammenti. Per nft richiede che la catena pre abbia l'hook prerouting esattamente alla priorità -310 (o alla grafia legacy raw - 10) e che il DROP atteso sia la prima regola. Per iptables richiede che iptables -C abbia successo e che la prima regola completa raw PREROUTING corrisponda dopo la normalizzazione. enable ripara una regola spostata invece di rifiutarsi di riapplicarla.
Lo script di Akamai ha contribuito alle idee di valutazione e sicurezza riportate di seguito. La sua forma di applicazione non è stata adottata perché la nostra è più rigorosa e compatibile con 16.04. I risultati incorporati più importanti, in ordine di priorità:
assess risolve il pacchetto immagine esatto del kernel in esecuzione (linux-image-$KVER, poi linux-image-unsigned-$KVER, poi il proprietario di /boot/vmlinuz-$KVER). I metapacchetti come linux-image-generic sono mostrati solo come contesto, mai usati come evidenza per il verdetto. Una corrispondenza nel changelog è un'evidenza forte ma fallibile; un changelog mancante insieme a una versione upstream pulita e autonomamente conclusiva pari o superiore alla release corretta produce comunque PATCHED; un kernel del fornitore senza evidenze produce UNKNOWN.enable con codice 4 mantenendo attiva la regola. status valuta la persistenza indipendentemente dallo stato di runtime del oneshot e rifiuta enabled-runtime come non persistente.detected rifiuta per impostazione predefinita, unknown avvisa, not_detected procede. L'assenza di netlabelctl non dimostra che CIPSO sia assente.check distingue verificato-utilizzabile, presente-non verificato, non utilizzabile e sconosciuto; --backend nft valuta nft anche quando iptables funziona.XDP_PASS entra comunque nello stack del kernel.-x) dove possibile, e una regola legacy filter/INPUT di una versione precedente viene segnalata e rimossa dopo il caricamento della sostituzione raw.Il match della regola e il formato del file di stato sono retrocompatibili. Non è necessario eseguire prima disable; rieseguire enable con questa versione ripara la regola sul posto, installa l'unità di avvio aggiornata e registra il nuovo campo di persistenza. Se un vecchio file di stato non contiene una riga persist=, status deduce la persistenza dallo stato dell'unità invece di fallire a causa del campo mancante.
Modifiche operative da conoscere:
enable ora esce con codice 4 quando la regola è attiva ma la persistenza al riavvio non è riuscita. In precedenza poteva uscire con 0 in quel caso.check ora restituisce 0 solo per un backend utilizzabile e verificato, 1 per nessun backend utilizzabile, 4 per presente ma non verificato e 2 per errore d'uso.assess è nuovo e restituisce 0/1/3/4 come documentato di seguito.enable a meno che non venga passato --ignore-cipso.enable affinché vengano applicati il nuovo ordinamento dell'unità e ExecStart.Preparato: 2026-10-30 (aggiornato 2026-10-31)
Tracker Ubuntu verificato: 2026-10-31 11:59 UTC (pagina aggiornata l'ultima volta il 2026-10-30). Non è ancora stato rilasciato alcun kernel corretto.
Ambito: server Linux, principalmente Ubuntu 16.04 (xenial), 22.04 (jammy), 24.04 (noble) e 26.04 (resolute), inclusi host Docker/BTCPay.
Deliverable: cve-2026-98432-mitigate.sh in questa directory.
Testato su: Ubuntu 16.04, 22.04, 24.04 e 26.04.