
Script shell pour détecter l’exposition à CVE-2026-31431 (Copy Fail) et les mesures d’atténuation sur les systèmes Linux : vérification du noyau, état des modules, paramètres de démarrage, accessibilité AF_ALG et statut des correctifs de la distribution.
Scripts shell pour détecter les vulnérabilités du noyau Linux, vérifier l'état des mesures d'atténuation et guider la remédiation — conçus pour s'exécuter localement ou sur des parcs de machines via SSH, Ansible ou pssh.
Copy Fail est une vulnérabilité d'élévation de privilèges locale (LPE) de haute sévérité dans le module cryptographique algif_aead du noyau Linux. Un défaut logique introduit en 2017 permet à tout utilisateur local non privilégié d'écrire 4 octets contrôlés dans le cache de pages de n'importe quel fichier lisible — suffisant pour écraser un binaire setuid et obtenir les droits root. Un proof-of-concept Python fonctionnel de 732 octets existe et est publiquement disponible.
| CVE | CVE-2026-31431 |
| CVSS | 7.8 (Élevé) |
| Divulgué | 29 avril 2026 |
| Affecté | Noyaux Linux 4.13 – 6.x (2017–2026) |
| Distributions | Ubuntu, RHEL, SUSE, Debian, Amazon Linux et la plupart des autres |
| Exploitable à distance | Non — accès local requis |
| Correctif disponible | Partiel — consultez les avis de votre distribution |
| Vérification | Nécessite root ? |
|---|---|
| Version du noyau — si vous êtes dans la plage affectée (≥ 4.13) | Non |
Module algif_aead — chargé, présent sur disque ou blacklisté | Non |
Paramètres de démarrage — présence de initcall_blacklist=algif_aead_init | Non |
| Accessibilité des sockets AF_ALG — si le chemin d'exploitation est ouvert | Non |
| Statut SELinux | Non |
| Statut AppArmor | Oui — sortie partielle uniquement sans root |
| Statut du correctif de la distribution — CVE listé dans le changelog du noyau | Non |
Root n'est pas requis pour exécuter le script — toutes les vérifications sauf le statut AppArmor fonctionnent en tant qu'utilisateur standard. L'exécution avec
sudoest recommandée pour des résultats complets, et constitue le choix le plus sûr lors d'un pipe depuiscurl.
Le script est conçu pour fonctionner sur toutes les principales distributions Linux :
| Famille de distributions | Vérification du gestionnaire de paquets | Chemin du module |
|---|---|---|
| Debian, Ubuntu | dpkg + changelog du noyau | /lib/modules/ |
| RHEL, CentOS, Amazon Linux | rpm (kernel, kernel-rt) | /lib/modules/ |
| SUSE, openSUSE | rpm (kernel-default) | /lib/modules/ |
| Arch Linux | pacman + lien d'avis | /usr/lib/modules/ |
| Fedora | rpm + repli /usr/lib/modules/ | /usr/lib/modules/ |
Nécessite
bash— le script utilise une syntaxe spécifique à bash et ne fonctionnera pas soussh,ashoudash. Sur Alpine Linux (qui utilise busybox ash par défaut), installez bash d'abord :apk add bash
Sans root — la plupart des vérifications fonctionnent :
curl -fsSL https://raw.githubusercontent.com/codesource/copyfail-check/main/check_copyfail.sh | bash
Avec root — résultats complets incluant le statut AppArmor :
curl -fsSL https://raw.githubusercontent.com/codesource/copyfail-check/main/check_copyfail.sh | sudo bash
Astuce : Épinglez un SHA de commit spécifique en production pour que le script ne puisse pas changer à votre insu :
curl -fsSL https://raw.githubusercontent.com/codesource/copyfail-check/COMMIT_SHA/check_copyfail.sh | sudo bash
curl -fsSL https://raw.githubusercontent.com/codesource/copyfail-check/main/check_copyfail.sh -o check_copyfail.sh
less check_copyfail.sh
bash check_copyfail.sh # sans root
sudo bash check_copyfail.sh # résultats complets
Boucle SSH
for HOST in server1 server2 server3; do
echo "=== $HOST ==="
ssh "$HOST" "curl -fsSL https://raw.githubusercontent.com/codesource/copyfail-check/main/check_copyfail.sh | sudo bash"
done
Ansible
- name: Vérifier la vulnérabilité Copy Fail
hosts: all
tasks:
- name: Exécuter le script de vérification
script: check_copyfail.sh
become: yes
SSH parallèle
pssh -h hosts.txt -i \
"curl -fsSL https://raw.githubusercontent.com/codesource/copyfail-check/main/check_copyfail.sh | sudo bash"
============================================================
Copy Fail CVE-2026-31431 – Vérification de vulnérabilité
============================================================
>>> Version du noyau
[INFO] Noyau en cours d'exécution : 5.15.0-107-generic
[WARN] Le noyau 5.15.0-107-generic est dans la plage affectée (4.13 – 6.x).
>>> Statut du module algif_aead
[WARN] Le module algif_aead est actuellement CHARGÉ — le système est exploitable.
[WARN] Fichier du module trouvé à : /lib/modules/5.15.0-107-generic/kernel/crypto/algif_aead.ko
[WARN] algif_aead n'est PAS blacklisté — il peut être chargé à la demande.
>>> Atténuation par paramètre de démarrage du noyau
[WARN] initcall_blacklist=algif_aead_init n'est PAS défini dans les paramètres de démarrage.
>>> Accessibilité des sockets AF_ALG
[WARN] Les sockets AF_ALG sont accessibles par cet utilisateur — le chemin d'exploitation est ouvert.
>>> Contrôle d'accès obligatoire (SELinux / AppArmor)
[WARN] Aucun outil SELinux ni AppArmor détecté — aucune couche MAC présente.
>>> Statut du correctif de la distribution
[WARN] Impossible de confirmer que CVE-2026-31431 est listé comme corrigé dans le changelog du noyau en cours d'exécution.
============================================================
RÉSUMÉ
============================================================
!! PROBABLEMENT VULNÉRABLE — Aucune atténuation confirmée détectée.
Actions recommandées (par ordre de préférence) :
1. Appliquez la mise à jour du noyau de votre distribution dès qu'elle est disponible.
2. Ajoutez à /etc/modprobe.d/copyfail.conf :
blacklist algif_aead
install algif_aead /bin/true
Puis exécutez : sudo depmod -a && sudo update-initramfs -u
3. Ajoutez aux paramètres de démarrage du noyau (grub) :
initcall_blacklist=algif_aead_init
4. Déchargez immédiatement le module s'il est chargé :
sudo rmmod algif_aead
============================================================
Appliquez-les par ordre de préférence :
1. Corrigez votre noyau (meilleure solution)
# Debian / Ubuntu
sudo apt update && sudo apt upgrade linux-image-$(uname -r)
# RHEL / CentOS / Amazon Linux
sudo yum update kernel
# SUSE
sudo zypper update kernel-default
2. Blacklistez le module (immédiat, persistant)
sudo tee /etc/modprobe.d/copyfail.conf << 'EOF'
blacklist algif_aead
install algif_aead /bin/true
EOF
sudo depmod -a
# Debian/Ubuntu
sudo update-initramfs -u
# RHEL/Fedora
sudo dracut -f
3. Déchargez le module maintenant (immédiat, non persistant après redémarrage)
sudo rmmod algif_aead
4. Paramètre de démarrage du noyau (alternative au blacklist)
Ajoutez initcall_blacklist=algif_aead_init à votre configuration GRUB et redémarrez.
MIT — utilisation libre, aucune garantie implicite. Examinez toujours les scripts avant de les exécuter en tant que root.