
Script shell qui évalue l'état de correctif du noyau Ubuntu pour CVE-2026-98432 et applique une mesure palliative persistante via nftables ou iptables, en abandonnant les paquets TCP IPv4 transportant des options 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 refuse de modifier le jeu de règles lorsque CIPSO/NetLabel est détecté, car la règle supprime tout TCP transportant des options IP, y compris le trafic étiqueté. N'utilisez --ignore-cipso que si vous acceptez ce compromis. Les conteneurs ou hôtes sans systemd doivent utiliser --no-persist ; sinon enable se termine avec le code 4 lorsque la persistance au redémarrage ne peut pas être établie tout en conservant la règle active en place.
CVE-2026-98432 est un use-after-free dans la poignée de main TCP IPv4 de Linux. Il est atteignable lorsqu'un SYN entrant transporte des options IP. Le véritable correctif est un noyau patché ; ce script est une solution provisoire qui supprime les paquets TCP IPv4 entrants dont la longueur d'en-tête IP est supérieure à 5 (IHL 6-15), c'est-à-dire les paquets transportant des options IP, avant conntrack et le NAT Docker.
Il prend en charge deux backends équivalents :
table ip cve_2026_98432, priorité prerouting -310, TCP uniquement, compteur, drop.raw PREROUTING, correspondance u32 0>>24&0xf=6:15, TCP uniquement, compteur, drop.La forme nft utilise la famille ip et une priorité numérique afin de fonctionner aussi bien sur nft 0.5 d'Ubuntu 16.04 que sur nft 1.x actuel. La forme iptables fonctionne avec iptables 1.6 et ultérieur. Aucun paquet n'est installé sauf si --install-nft est passé.
Le script valide la règle attendue complète, et non des fragments. Pour nft, il exige que la chaîne pre porte le hook prerouting exactement à la priorité -310 (ou l'orthographe héritée raw - 10) et que le DROP attendu soit la première règle. Pour iptables, il exige que iptables -C réussisse et que la première règle complète raw PREROUTING corresponde après normalisation. enable répare une règle déplacée au lieu de refuser de la réappliquer.
Le script d'Akamai a apporté les idées d'évaluation et de sécurité ci-dessous. Sa forme d'application n'a pas été adoptée car la nôtre est plus stricte et compatible avec 16.04. Les constats intégrés les plus importants, par ordre de priorité :
assess résout le paquet image exact du noyau en cours d'exécution (linux-image-$KVER, puis linux-image-unsigned-$KVER, puis le propriétaire de /boot/vmlinuz-$KVER). Les métapaquets tels que linux-image-generic sont affichés uniquement à titre de contexte, jamais utilisés comme preuve de verdict. Une correspondance dans le changelog est une preuve forte mais faillible ; un changelog absent plus une version upstream propre concluante de manière indépendante, égale ou supérieure à la version corrigée, produit tout de même PATCHED ; un noyau de fournisseur sans preuve produit UNKNOWN.enable se termine avec le code 4 tout en conservant la règle active. status évalue la persistance indépendamment de l'état d'exécution du oneshot et rejette enabled-runtime comme non persistant.detected refuse par défaut, unknown avertit, not_detected poursuit. L'absence de netlabelctl ne prouve pas que CIPSO est absent.check distingue vérifié-utilisable, présent-non-vérifié, inutilisable et inconnu ; --backend nft évalue nft même lorsque iptables fonctionne.XDP_PASS entre toujours dans la pile du noyau.-x) lorsque possible, et une règle héritée filter/INPUT d'une version antérieure est signalée et supprimée après le chargement du remplacement raw.La correspondance des règles et le format du fichier d'état sont rétrocompatibles. Vous n'avez pas besoin de disable d'abord ; relancer enable avec cette version répare la règle sur place, installe l'unité de démarrage mise à jour et enregistre le nouveau champ de persistance. Si un ancien fichier d'état ne contient pas de ligne persist=, status déduit la persistance à partir de l'état de l'unité au lieu d'échouer sur le champ manquant.
Changements opérationnels à connaître :
enable se termine désormais avec le code 4 lorsque la règle est active mais que la persistance au redémarrage a échoué. Auparavant, il pouvait se terminer avec le code 0 dans ce cas.check renvoie désormais 0 uniquement pour un backend utilisable et vérifié, 1 pour aucun backend utilisable, 4 pour présent mais non vérifié, et 2 pour une erreur d'utilisation.assess est nouveau et renvoie 0/1/3/4 comme documenté ci-dessous.enable sauf si --ignore-cipso est passé.enable afin que le nouvel ordonnancement de l'unité et ExecStart soient appliqués.Préparé : 2026-10-30 (mis à jour le 2026-10-31)
Suivi Ubuntu vérifié : 2026-10-31 11:59 UTC (page mise à jour pour la dernière fois le 2026-10-30). Aucun noyau corrigé n'a encore été publié.
Périmètre : serveurs Linux, principalement Ubuntu 16.04 (xenial), 22.04 (jammy), 24.04 (noble) et 26.04 (resolute), y compris les hôtes Docker/BTCPay.
Livrable : cve-2026-98432-mitigate.sh dans ce répertoire.
Testé sur : Ubuntu 16.04, 22.04, 24.04 et 26.04.