
Détecter et atténuer CVE-2026-31431 (Copy Fail) sur les systèmes Linux.
Un CLI Python sans dépendance qui vérifie si un hôte Linux semble exposé à CVE-2026-31431 (« Copy Fail ») sans exécuter d'exploit. Il peut également appliquer une atténuation temporaire conservative lorsque le composant affecté est chargeable en tant que module noyau. Prend en charge Debian/Ubuntu, RHEL/Rocky/AlmaLinux, Fedora et SUSE.
pip install copyfail-guard
copyfail-guard
CVE-2026-31431 est un bug logique dans l'interface noyau algif_aead (socket AF_ALG AEAD)
qui permet à un utilisateur local non privilégié d'effectuer une écriture contrôlée de 4 octets
dans le cache de pages de tout fichier lisible, conduisant à une élévation de privilèges root.
CVSS 7.8, présent depuis le noyau 4.14, corrigé dans les versions stables à partir d'avril 2026.
Un exploit public existe et la vulnérabilité est répertoriée dans le CISA KEV.
Certaines vérifications de vulnérabilité reviennent à « exécuter l'exploit et voir si ça marche ». Ce n'est pas une bonne chose à faire sur des hôtes de production. copyfail-guard adopte une approche sans exploit. Il ne tente pas de déclencher le bug, de modifier les binaires setuid ou de prouver l'exploitabilité. Au lieu de cela, il inspecte l'état de l'hôte (version du noyau, état de chargement du module, configuration modprobe) et indique si la machine semble exposée.
| Sous-commande | Action |
|---|---|
detect | Combine cinq signaux (version du noyau, /proc/modules, modules.builtin, modules.dep, configuration modprobe) en un verdict parmi six |
fix | Écrit atomiquement une règle modprobe install algif_aead /bin/false et tente de décharger algif_aead |
reset | Supprime la règle modprobe installée par fix (à exécuter après la mise à niveau vers un noyau corrigé) |
fix est volontairement minimal — il n'appelle pas votre gestionnaire de paquets.
La remédiation permanente nécessite une mise à niveau du noyau via le mécanisme de mise à jour
normal de votre distribution.
pip install copyfail-guard
Ou exécutez directement depuis un dépôt cloné sans installation :
PYTHONPATH=src python3 -m copyfail_guard detect
copyfail-guard [--json] [--dry-run] [--quiet] [detect | fix | reset]
$ copyfail-guard
[copyfail-guard] CVE-2026-31431 (Copy Fail) — VULNÉRABLE
Distribution : Ubuntu 24.04.1 LTS (famille debian)
Noyau : 6.8.0-50-generic (branche 6.12, corrigé à 6.12.85)
Module : algif_aead — chargé en tant que .ko
Atténuation : aucune
Actions recommandées :
1. Appliquer l'atténuation maintenant :
sudo copyfail-guard fix
2. Mettre à jour le noyau pour un correctif permanent :
Mettez à jour le noyau de ce système vers 6.12.85 ou ultérieur (ce que votre
distribution fournit une fois qu'elle a intégré le correctif CVE-2026-31431), puis redémarrez.
Prévisualisez toujours avec --dry-run avant d'appliquer :
$ sudo copyfail-guard --dry-run fix
[copyfail-guard] fix (dry-run) — OK
[ ok ] Vérifications préalables (Linux, hôte, root)
[skip] Écrirait la liste noire modprobe [/etc/modprobe.d/cve-2026-31431-copyfail-guard.conf]
[skip] Tenterait de décharger algif_aead (non chargé actuellement) [algif_aead]
[skip] Ajouterait un enregistrement d'audit [/var/log/copyfail-guard.log]
$ sudo copyfail-guard fix
[copyfail-guard] fix — OK
[ ok ] Vérifications préalables (Linux, hôte, root)
[ ok ] Liste noire modprobe écrite [/etc/modprobe.d/cve-2026-31431-copyfail-guard.conf]
[ ok ] algif_aead déchargé [algif_aead]
[ ok ] Enregistrement d'audit ajouté [/var/log/copyfail-guard.log]
Prochaine étape pour un correctif permanent :
Mettez à jour le noyau vers une version corrigée de CVE-2026-31431 en utilisant le
mécanisme de mise à jour normal de votre distribution, puis redémarrez.
Si le module est actuellement utilisé, l'étape de déchargement peut échouer. Dans ce cas, la règle modprobe persistante peut toujours être installée avec succès, et copyfail-guard signalera l'échec du déchargement comme un enregistrement d'action de type avertissement plutôt que de prétendre que le module a été supprimé.
--json émet un document structuré sur stdout, adapté aux pipelines jq, Ansible ou SOAR :
$ copyfail-guard --json | jq .verdict
"vulnerable"
$ copyfail-guard --json | jq '{verdict, kernel: .kernel.patched_threshold}'
{
"verdict": "vulnerable",
"kernel": "6.12.85"
}
| Code | Signification |
|---|---|
0 | Sûr — le verdict est patched, mitigated ou not_applicable ; ou l'étape de correctif persistant a réussi |
1 | Vulnérable — le verdict est vulnerable ou unmitigable_builtin |
2 | Erreur — l'état n'a pas pu être déterminé, une condition préalable a été refusée, ou l'étape de correctif persistant a échoué |
| Verdict | Description |
|---|---|
patched | Le noyau en cours d'exécution est à ou au-delà de la version corrigée |
mitigated | Le noyau est vulnérable mais algif_aead est bloqué par la configuration modprobe |
not_applicable | Le noyau est vulnérable mais algif_aead n'est pas présent sur ce système |
vulnerable | Le noyau est vulnérable, le module est chargeable, aucune atténuation en place |
unmitigable_builtin | algif_aead est compilé dans l'image du noyau — l'atténuation modprobe n'a aucun effet ; une mise à niveau du noyau est requise |
unknown | La version du noyau n'a pas pu être analysée ou est hors de la plage évaluée |
Après la mise à niveau vers un noyau corrigé, utilisez la sous-commande reset pour supprimer la
règle modprobe installée par fix :
$ sudo copyfail-guard --dry-run reset
[copyfail-guard] reset (dry-run) — OK
[skip] Supprimerait /etc/modprobe.d/cve-2026-31431-copyfail-guard.conf
$ sudo copyfail-guard reset
[copyfail-guard] reset — OK
[ ok ] /etc/modprobe.d/cve-2026-31431-copyfail-guard.conf supprimé
Redémarrez pour permettre à algif_aead de se charger à nouveau si nécessaire.
reset est idempotent — si le fichier est déjà absent, il se termine avec le code 0 et un
message « rien à faire ». Puis redémarrez.
Conteneurs. fix refuse de s'exécuter dans un conteneur car /proc/modules
reflète le noyau de l'hôte mais le conteneur n'a pas l'autorité de charger ou décharger
des modules. Exécutez copyfail-guard directement sur l'hôte.
algif_aead intégré. Certains noyaux compilent algif_aead directement dans
l'image (CONFIG_CRYPTO_USER_API_AEAD=y). L'atténuation modprobe n'a aucun effet dans
cette configuration ; la seule remédiation est une mise à niveau du noyau. detect signale
unmitigable_builtin dans ce cas. Exécuter fix installera toujours la règle modprobe
(qui empêche toute copie chargeable coexistante de se charger) mais l'instance intégrée
n'est pas affectée — la mise à niveau du noyau et le redémarrage sont le seul véritable remède.
blacklist vs install … /bin/false. Les deux directives bloquent le chargement
automatique ordinaire, mais install algif_aead /bin/false est plus forte car elle bloque
également les invocations explicites ordinaires de modprobe algif_aead. Un administrateur
suffisamment privilégié peut toujours contourner la politique modprobe, par exemple en utilisant
des outils de chargement de modules de bas niveau ou des drapeaux modprobe spéciaux. copyfail-guard
installe toujours la forme la plus forte. Si votre système possède déjà une directive blacklist
simple, l'outil signale mitigated mais émet une note recommandant la mise à niveau.
SELinux/AppArmor. Les écritures dans /etc/modprobe.d/ sur RHEL héritent normalement
de system_u:object_r:modules_conf_t:s0 du répertoire parent, donc aucun re-étiquetage manuel
ne devrait généralement être nécessaire pour le fichier écrit par copyfail-guard.
initramfs. algif_aead n'est normalement pas inclus dans l'image de démarrage sur les
principales distributions, donc copyfail-guard n'exécute pas update-initramfs -u ni
dracut -f après l'installation de la règle modprobe. Si votre distribution ou votre build
local inclut algif_aead dans initramfs, suivez les recommandations noyau/module de votre
distribution.
Apache 2.0 — voir LICENSE.