
Script shell idempotent qui installe une règle iptables persistante supprimant les paquets TCP IPv4 comportant des options IP afin d'atténuer CVE-2026-98432 sur Ubuntu et Debian jusqu'à la disponibilité d'un noyau corrigé.
Un script idempotent unique qui supprime les paquets TCP IPv4 entrants transportant des options IP, conserve la règle à travers les redémarrages et vérifie qu'elle fonctionne. Il est destiné aux serveurs Ubuntu (18.04 – 24.04) et Debian (11 – 13) qui ne peuvent pas encore obtenir un noyau corrigé.
Il s'agit d'une solution provisoire, pas d'un correctif. Le seul véritable correctif est un noyau corrigé accompagné d'un redémarrage. Supprimez cette atténuation une fois que le serveur exécute un noyau corrigé.
curl -fsSL https://raw.githubusercontent.com/Mervent/cve-2026-98432/master/install.sh | sudo sh
Vous pouvez l'exécuter autant de fois que vous le souhaitez : les fichiers sont écrasés et la règle n'est jamais dupliquée. À la fin, le script valide le résultat et se termine avec un code non nul en cas d'échec :
--- validation ---
OK helper installed: /usr/local/sbin/cve-2026-98432-mitigation
OK cron entry: /etc/cron.d/cve-2026-98432
OK cron service enabled
OK iptables rule active (raw/PREROUTING)
OK exactly one rule (no duplicates)
plain SYN: connected, SYN with IP options: timeout
OK drop test: packets with IP options are dropped
--- rule counters ---
pkts bytes target prot opt in out source destination
3 204 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 u32 "0x0>>0x18&0xf=0x6:0xf" /* cve-2026-98432 */
| Chemin | Objectif |
|---|---|
/usr/local/sbin/cve-2026-98432-mitigation | Assistant qui détient la règle. Sans argument, il ajoute la règle si elle est absente. --check renvoie 0 si la règle est active. --remove la supprime. |
/etc/cron.d/cve-2026-98432 | Entrée @reboot qui réapplique la règle après chaque démarrage |
La règle elle-même :
iptables -t raw -I PREROUTING -p tcp -m u32 --u32 "0>>24&0xF=6:15" \
-m comment --comment cve-2026-98432 -j DROP
sudo /usr/local/sbin/cve-2026-98432-mitigation --check && echo active
sudo iptables -t raw -L PREROUTING -v -n | grep cve-2026-98432
sudo /usr/local/sbin/cve-2026-98432-mitigation --remove
sudo rm /usr/local/sbin/cve-2026-98432-mitigation /etc/cron.d/cve-2026-98432
Pour savoir si votre distribution a publié un correctif, consultez
Ubuntu ou Debian
(pour Debian 9 – 11, le tracker Freexian ELTS).
Une fois que votre version affiche « Fixed », exécutez apt update && apt full-upgrade, redémarrez, puis supprimez l'atténuation.
Depuis le 1er novembre 2026, Debian 12 (linux 6.1.190-1, DLA-4841-1) et Debian 13 (linux 6.12.113-1,
DSA-6568-1) disposent déjà de noyaux corrigés ; sur ces versions, effectuez donc une mise à niveau au lieu d'utiliser ce script.
Le correctif de Debian 11 (linux 5.10.272-1, ELA-1846-1) n'est disponible que dans le dépôt ELTS de Freexian : commercial,
mais gratuit sur demande pour les particuliers et les petites organisations à but non lucratif.
CVE-2026-98432 (« ipv4: free inet_opt and ireq_opt after an RCU grace period ») est un use-after-free dans la poignée de main TCP IPv4. Elle affecte Linux 4.4 et les versions ultérieures et est notée CVSS 9.8.
Si un SYN transporte des options IPv4, le noyau les enregistre sur le socket de requête afin de pouvoir les renvoyer
dans le SYN-ACK. tcp_v4_syn_recv_sock() transmet ensuite ce tampon au socket enfant sans le copier.
Lorsque le socket enfant meurt, le tampon est libéré par un simple kfree(), alors qu'un autre CPU peut encore
être en train de le lire pour construire un SYN-ACK en réponse à un SYN retransmis.
Tout cela se produit dans le noyau avant qu'une quelconque application ne voie la connexion. N'importe quel port TCP IPv4 en écoute est joignable de cette manière (SSH, HTTP, PostgreSQL, etc.), et aucun identifiant n'est nécessaire. Anthropic a signalé un exploit distant en tant que root fonctionnel contre des hôtes disposant d'un listener multipath TCP (MPTCP). La Go Security Team note que le bogue n'est pas spécifique à MPTCP.
La mémoire libérée trop tôt n'existe que lorsque le SYN entrant transporte des options IPv4. Sans options, il n'y a pas de tampon enregistré, donc le use-after-free n'a rien sur quoi agir. Le trafic TCP légitime ne transporte pratiquement jamais d'options IPv4, donc supprimer ces paquets ne coûte rien en pratique. Red Hat (RHSB-2026-016) et AlmaLinux publient une règle nftables équivalente.
u32 "0>>24&0xF=6:15" lit le champ IHL, la longueur de l'en-tête IPv4 en mots de 32 bits. Une valeur de 5 correspond
à l'en-tête nu de 20 octets. Les valeurs de 6 à 15 signifient que des options sont présentes.
Red Hat indique qu'une telle règle « réduit l'exposition à cette vulnérabilité mais ne peut pas la prévenir entièrement ». Considérez-la comme une réduction du risque jusqu'à ce que le noyau soit corrigé.
raw / PREROUTINGPREROUTING voit chaque paquet entrant, à la fois le trafic destiné à l'hôte et le trafic transféré vers les conteneurs Docker
sur les ports publiés. Une règle dans INPUT, qui est l'endroit où ufw place ses règles, manquerait
le trafic transféré.raw s'exécute avant le suivi de connexion, donc les paquets supprimés ne créent jamais d'entrées conntrack.raw/PREROUTING, donc la règle survit à leurs redémarrages.iptables est présent sur toutes les versions cibles d'Ubuntu. Sur Ubuntu 18.04 et 20.04, il utilise le backend
legacy ; à partir d'Ubuntu 22.04 et sur Debian 11+, c'est iptables-nft. Le binaire nft n'est pas installé
par défaut partout. Sur Debian, iptables lui-même peut être absent ; le script vous demande alors d'exécuter
apt install iptables.iptables-nft, ufw/Docker et cette règle partagent le backend nf_tables, donc une seule règle couvre les deux.u32 nécessite le module noyau xt_u32. S'il est absent, le script échoue et vous indique
de vérifier modinfo xt_u32.@rebootnftables.service. Sur Ubuntu, /etc/nftables.conf commence par flush ruleset, et le
service exécute nft flush ruleset à l'arrêt. L'un ou l'autre efface les règles ufw et Docker.iptables-persistent. netfilter-persistent save vide toutes les règles actuelles, y compris
celles de Docker, et restaurer cet instantané au démarrage entre en conflit avec les règles que Docker crée lui-même.before.rules. Cela ne fonctionne que lorsque ufw est activé, et ses chaînes ne voient pas le trafic
transféré vers les conteneurs./etc/cron.d est idempotent par
écrasement, et le supprimer se fait avec un simple rm. Le compromis est une fenêtre de quelques secondes après le démarrage pendant laquelle
le réseau est opérationnel mais cron n'a pas encore appliqué la règle. C'est acceptable pour une atténuation qui
n'a besoin de durer que jusqu'à la prochaine mise à jour du noyau.net.mptcp.enabled=0Désactiver MPTCP supprime la condition préalable du seul exploit publié, pas la faille. Les écouteurs TCP
simples passent toujours par le même code vulnérable. Sur un serveur sans écouteurs MPTCP
(ss -Mlnp n'affiche rien), le sysctl ne change absolument rien. C'est un ajout inoffensif, pas un
substitut à cette règle.