
Vérificateur Bash en lecture seule pour la vulnérabilité Copy Fail du noyau Linux (CVE-2026-31431)
Un petit script Bash sans dépendances qui vous indique si votre système Linux est exposé à la vulnérabilité locale d'élévation de privilèges Copy Fail (CVE-2026-31431).
Le script est en lecture seule : il n'exploite jamais la faille, ne charge aucun module kernel et ne modifie jamais le système.
Copy Fail est un bug de logique dans le modèle cryptographique AEAD authencesn du noyau Linux, accessible depuis l'espace utilisateur via l'interface de sockets AF_ALG (algif_aead).
| Champ | Valeur |
|---|---|
| CVE | CVE-2026-31431 |
| Divulguée | 2026-04-29 |
| CVSS v3.1 | 7,8 (Élevée) |
| Classe | Élévation de privilèges locale |
| Composant affecté | crypto/authencesn + crypto/algif_aead |
| Introduite en | 2017 (optimisation AEAD sur place dans algif_aead.c) |
| Correctif principal | commit a664bf3d603d, fusionné le 2026-04-01 |
Un utilisateur local sans privilèges peut déclencher une écriture déterministe et contrôlée de 4 octets dans le cache de pages de tout fichier qu'il peut lire. Une preuve de concept publique (732 octets de Python) utilise cette primitive pour écraser un binaire setuid et obtenir root sur pratiquement toutes les distributions grand public publiées depuis 2017.
Toute distribution Linux dotée d'un noyau compilé depuis 2017 avec algif_aead activé. Les familles confirmées comme affectées incluent :
# Télécharger le script
curl -fsSLO https://raw.githubusercontent.com/samanzamani/copy-fail-checker/main/check-copy-fail.sh
# Le rendre exécutable
chmod +x check-copy-fail.sh
# L'exécuter
./check-copy-fail.sh
Ou cloner le dépôt :
git clone https://github.com/samanzamani/copy-fail-checker.git
cd copy-fail-checker
./check-copy-fail.sh
Le script ne nécessite pas root. L'exécuter avec votre utilisateur normal donne la vue la plus réaliste de la surface d'attaque, car c'est exactement le contexte qu'aurait un attaquant.
Le script exécute trois vérifications indépendantes et les combine en un verdict unique.
Il lit /etc/os-release et uname -r, puis compare votre noyau en cours d'exécution à la version corrigée officielle publiée par l'équipe sécurité de votre distribution. Le tableau des versions couvre actuellement :
Si votre distribution n'est pas dans le tableau, le script se rabat sur les vérifications d'exécution ci-dessous.
algif_aeadLe script inspecte quatre éléments sans rien modifier :
lsmod)modinfo)/etc/modprobe.d, /usr/lib/modprobe.d ou /run/modprobe.d/boot/config-<uname> ou /proc/config.gzUn module blacklisté, non chargé et non intégré ferme la surface d'attaque même sur un noyau non corrigé.
AF_ALGLe signal le plus fiable est ce qu'un attaquant verrait réellement. Le script utilise une petite sonde Python (socket.socket(AF_ALG, SOCK_SEQPACKET, 0) suivie de bind() sur le modèle AEAD authencesn(hmac(sha256),cbc(aes))) pour déterminer si des sockets AF_ALG peuvent être créées et liées depuis un contexte non privilégié. La sonde crée, lie puis ferme immédiatement la socket sans laisser quoi que ce soit d'exploitable.
Si python3 n'est pas installé, la sonde est ignorée et le verdict repose sur les vérifications 1 et 2.
Pour les pipelines, la gestion de configuration ou l'analyse de parcs de machines, passez --json :
./check-copy-fail.sh --json
Exemple de sortie :
{
"verdict": "vulnerable",
"distro_id": "ubuntu",
"distro_version_id": "24.04",
"kernel": "6.8.0-31-generic",
"patched_version": "",
"kernel_status": "unknown",
"module_loaded": 0,
"module_builtin": 0,
"module_available": 1,
"module_blacklisted": 0,
"af_alg_status": "reachable"
}
C'est le seul correctif complet. Après la mise à jour, redémarrez pour que le nouveau noyau soit réellement en cours d'exécution.
# Debian / Ubuntu
sudo apt update && sudo apt full-upgrade && sudo reboot
# RHEL / AlmaLinux / Rocky / CentOS Stream
sudo dnf clean metadata && sudo dnf upgrade && sudo reboot
# openSUSE / SLES
sudo zypper refresh && sudo zypper update && sudo reboot
# Amazon Linux 2023
sudo dnf upgrade --releasever=latest && sudo reboot
algif_aeadSi vous ne pouvez pas redémarrer immédiatement avec un noyau corrigé, blacklistez le module vulnérable. Cela casse toute application qui utilise légitimement les chiffrements AEAD AF_ALG (rare sur la plupart des serveurs — vérifiez d'abord dans un environnement de préproduction).
# Rendre le blacklist persistant après redémarrage
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf
# Décharger le module du noyau en cours immédiatement
sudo rmmod algif_aead 2>/dev/null || true
Si le module est intégré au noyau, le blacklist ne fonctionnera pas, mais il est possible de désactiver l'initcall. Un redémarrage est nécessaire.
sudo grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
sudo reboot
Pour les charges de travail conteneurisées, bloquez également la famille de sockets AF_ALG dans votre profil seccomp afin qu'un conteneur compromis ne puisse pas atteindre la surface noyau.
== System information ==
[INFO] Distribution : Ubuntu 24.04.2 LTS (ubuntu 24.04)
[INFO] Kernel : 6.8.0-31-generic
== Check 1 / 3 — Kernel version ==
[WARN] No vendor-fixed kernel version is recorded for ubuntu 24.04.
[WARN] Falling back to runtime mitigation checks below.
== Check 2 / 3 — algif_aead kernel module ==
[WARN] algif_aead is not loaded but can be autoloaded on demand (no blacklist found).
== Check 3 / 3 — AF_ALG socket reachability ==
[VULN] AF_ALG sockets are reachable from this unprivileged context.
== Verdict ==
[VULN] This system appears to be VULNERABLE to CVE-2026-31431.
[VULN] Apply the vendor kernel update or blacklist algif_aead as a temporary mitigation.
uname -r. Si vous exécutez un noyau hors arbre ou recompilé, la comparaison de versions peut ne pas refléter si le correctif a réellement été rétroporté.blocked_permission pour AF_ALG simplement parce que seccomp est actif — le noyau hôte lui-même peut toujours être vulnérable.MIT — utilisez, modifiez et distribuez librement. Aucune garantie.
| Distribution | Noyau corrigé (≥) |
|---|
| AlmaLinux / RHEL / Rocky / CentOS 8 | 4.18.0-553.121.1.el8_10 |
| AlmaLinux / RHEL / Rocky / CentOS 9 | 5.14.0-611.49.2.el9_7 |
| AlmaLinux / RHEL / Rocky / CentOS 10 | 6.12.0-124.52.2.el10_1 |
| Ubuntu 26.04+ (« Resolute ») | non affecté |
| Ubuntu 18.04 – 25.10 | évolutif, voir apt |
| Debian (toutes les suites) | évolutif, voir DSA |
| Verdict | Code de sortie | Signification |
|---|
patched | 0 | Le noyau en cours d'exécution est au niveau ou au-dessus de la version corrigée par l'éditeur. |
mitigated | 0 | AF_ALG est bloqué et le module n'est pas chargé. |
likely_mitigated | 0 | Le module est blacklisté et non chargé ; aucune sonde en direct n'a été possible. |
vulnerable | 1 | Le noyau n'est pas corrigé et algif_aead / AF_ALG est accessible. |
unknown | 2 | Pas assez d'informations pour décider. À traiter comme potentiellement vulnérable. |
not_applicable | 3 | Le système ne tourne pas sous Linux. |