
Wazuh 4.14.4 règles de détection pour CVE-2026-31431 (Copy Fail) - Élévation de privilèges locale Linux via l'écriture du cache de page authencesn
Ingénierie de détection pour l'élévation de privilèges locale (LPE) du noyau Copy Fail · Ubuntu / RHEL / SUSE / Amazon Linux 2023 / Kali
CVE-2026-31431 est un bug logique dans le modèle cryptographique authencesn du noyau Linux. Il permet à tout utilisateur local non privilégié d'effectuer une écriture déterministe et contrôlée de 4 octets dans le cache de pages de n'importe quel fichier lisible sur le système - sans nécessiter de conditions de course, d'offsets du noyau ou de privilèges élevés.
Un script Python 3.10+ de 732 octets utilisant uniquement des modules de la bibliothèque standard (os, socket, zlib) exploite la vulnérabilité pour obtenir les droits root sur toutes les principales distributions Linux publiées depuis 2017.
Le fichier sur disque reste inchangé, rendant la surveillance traditionnelle de l'intégrité des fichiers (FIM) complètement aveugle.
Découvert par Taeyang Lee (Theori / Xint) avec l'assistance de l'outil d'IA Xint Code.
L'écriture cible uniquement le cache de pages en mémoire. Le noyau ne marque jamais la page comme sale, donc le mécanisme d'écriture différée ne la persiste jamais sur disque. Le binaire sur disque reste identique octet par octet à l'original.
Approche FIM traditionnelle :
lire le fichier depuis le disque -> calculer le hachage -> comparer -> aucune anomalie signalée
Réalité de Copy Fail :
fichier sur disque = INCHANGÉ
cache de pages = CORROMPU
résultat FIM = AVEUGLE
La seule détection efficace est comportementale, via la surveillance des appels système. Ce dépôt fournit des règles Wazuh validées en production qui détectent la chaîne d'exploitation au niveau des appels système du noyau.
Étape 1 : socket(38, 5, 0) Socket AF_ALG - aucun privilège requis
Étape 2 : bind() Liaison à authencesn - active le code vulnérable
Étape 3 : sendmsg() Construire la charge utile AAD - octets 4-7 = valeur à écrire
Étape 4 : splice() [!] DÉCLENCHEUR - les pages du cache de pages entrent dans le SGL inscriptible
Étape 5 : recv() authencesn écrit seqno_lo dans le cache de pages
Étape 6 : execve(/usr/bin/su) Le binaire setuid corrompu exécute le shellcode en tant que UID 0
splice() est l'étape critique. Elle livre les pages du cache de pages dans la scatterlist inscriptible du socket AF_ALG sans copie - une optimisation sur place de 2017 dans algif_aead.c qui rendait les pages du tampon du pipe réutilisables dans le SGL de destination. Lorsque authencesn.decrypt() s'exécute, il écrit dans ces pages, qui se trouvent être le cache de pages de votre fichier cible.
Toutes les distributions Linux fournissant des noyaux depuis le commit 72548b093ee3 (2017) sont affectées.
Évasion de conteneur : Copy Fail est également un vecteur d'évasion de conteneur. Le cache de pages est partagé entre tous les processus de l'hôte, y compris à travers les frontières des conteneurs. La partie 2 de Xint couvre l'exploitation de Kubernetes.
COPY-FAIL-Detection-with-Wazuh-4.14.4/
│
├── rules/
│ └── local_rules.xml # 8 règles de détection Wazuh (199600-199607)
│
├── auditd/
│ └── cve-2026-31431.rules # Règles du capteur d'appels système auditd
│
├── sca/
│ └── cve_2026_31431.yml # Politique SCA - indépendante de la version du noyau
│
└── docs/
├── pentlab_uid.png # Exécution du PoC - root obtenu sur Kali
├── Rule-199604-TRIGs.png # Règle 199604 - 80 hits sur pentlab
├── Rule_199604_Wazuh_Server_only.png # Règle 199604 - première validation
├── Splice_-_Non-root_process.png # Règles 199600/199601/199604 déclenchées
├── Modprobe_-_Possible_Algif_aed_load_attempt.png # Règle 199603
├── Pentlab-PoC.png # Règle 199603 sur l'agent pentlab
├── exploit_chain_timeline.svg # Chaîne d'exploitation
└── SCA_CVE-2026-31431.png # Score de la politique SCA 75%
Deux couches indépendantes - aucune ne dépend de la version du noyau.
Le filtre uid!=0 couvre les utilisateurs au-delà des comptes interactifs : comptes de service (www-data, postgres, jenkins), conteneurs et shells web sans session de connexion.
Règles du capteur auditd (auditd/cve-2026-31431.rules) :
-a always,exit -F arch=b64 -S socket -F a0=0x26 -F uid!=0 -k copy_fail_af_alg
-a always,exit -F arch=b32 -S socket -F a0=0x26 -F uid!=0 -k copy_fail_af_alg
-a always,exit -F arch=b64 -S splice -F uid!=0 -k copy_fail_splice
-w /usr/bin/su -p x -k copy_fail_execve_su
-w /usr/bin/kmod -p x -k copy_fail_modload
Vérifications de configuration automatisées toutes les 12 heures via sca/cve_2026_31431.yml. Aucune version du noyau requise.
Note d'ingénierie : Les règles 199600 et 199601 doivent être des enfants de la règle 92600 (processus Python, profondeur 1), et non de 80700. Le moteur de règles Wazuh suit un seul chemin de chaîne par événement. Placer les règles de détection à la profondeur 2 sous 92600 garantit qu'elles gagnent l'évaluation de chaîne face aux règles sœurs (par exemple 92603-92606 dans 0850-audit_rules.xml qui correspondent également à
if_group=audit + exe=python).
# Ubuntu / Debian / Kali
apt install auditd audispd-plugins -y
systemctl enable --now auditd
auditctl -s | grep enabled
# RHEL / Amazon Linux
yum install audit -y
systemctl enable --now auditd
# SUSE
zypper install audit -y
systemctl enable --now auditd
cp auditd/cve-2026-31431.rules /etc/audit/rules.d/
augenrules --load
auditctl -l | grep copy_fail
Sortie attendue :
-a always,exit -F arch=b64 -S socket -F a0=0x26 -F uid!=0 -F key=copy_fail_af_alg
-a always,exit -F arch=b32 -S socket -F a0=0x26 -F uid!=0 -F key=copy_fail_af_alg
-a always,exit -F arch=b64 -S splice -F uid!=0 -F key=copy_fail_splice
-w /usr/bin/su -p x -k copy_fail_execve_su
-w /usr/bin/kmod -p x -k copy_fail_modload
Les règles sont fournies dans rules/local_rules.xml. Vous pouvez soit fusionner le contenu dans votre /var/ossec/etc/rules/local_rules.xml existant, soit le déployer comme fichier autonome :
# Option A - fichier autonome
cp rules/local_rules.xml /var/ossec/etc/rules/cve-2026-31431_rules.xml
# Option B - ajout à local_rules.xml
cat rules/local_rules.xml >> /var/ossec/etc/rules/local_rules.xml
# Valider la syntaxe - doit se terminer avec 0 et zéro avertissement
/var/ossec/bin/wazuh-analysisd -t 2>&1 | tail -5
# Redémarrer le gestionnaire
systemctl restart wazuh-manager
cp sca/cve_2026_31431.yml /var/ossec/etc/shared/default/
Ajouter à ossec.conf dans le bloc <sca> :
<policies>
<policy>/var/ossec/etc/shared/default/cve_2026_31431.yml</policy>
</policies>
systemctl restart wazuh-manager
Assurez-vous que Wazuh ingère le journal auditd :
<!-- Ajouter dans <ossec_config> -->
<localfile>
<log_format>audit</log_format>
<location>/var/log/audit/audit.log</location>
</localfile>
# Créer un utilisateur de test si nécessaire
useradd -m testuser 2>/dev/null || true
# Générer le SIGNAL 1 - socket AF_ALG
su - testuser -c "python3 -c \"import socket; socket.socket(38, 5, 0); print('AF_ALG OK')\""
# Générer le SIGNAL 3 - exécution de /usr/bin/su
su - testuser -c "/usr/bin/su --help 2>/dev/null || true"
# Vérifier que auditd a capturé les événements
ausearch -k copy_fail_af_alg -ts recent 2>/dev/null | grep "key=\|exe=\|uid=" | head -5
# Vérifier que Wazuh a généré des alertes
grep -E "199600|199602" /var/ossec/logs/alerts/alerts.log | tail -10
grep -E "31431|cve_2026" /var/ossec/logs/alerts/alerts.log | tail -10
Score SCA attendu (système non atténué) : 75% (3 réussis / 1 échoué - algif_aead non mis sur liste noire)
testuser (uid=1001) a exécuté le PoC de 732 octets et obtenu un shell root :

Socket AF_ALG + splice() depuis le même processus Python - pid=46784 - ENQUÊTE IMMÉDIATE REQUISE :






Résultats Wazuh Dashboard Discover (agent=pentlab, Aujourd'hui) :
wazuh-analysisd -t : sortie 0 - zéro avertissement - les 8 règles chargées.
rmmod algif_aead 2>/dev/null || true
echo 'install algif_aead /bin/false' > /etc/modprobe.d/disable-algif-aead.conf
Cela n'affecte pas dm-crypt/LUKS, kTLS, IPsec, OpenSSL, GnuTLS ou SSH.
Appliquez le commit du noyau a664bf3d603d via la mise à jour du noyau de votre distribution. Il annule l'optimisation sur place de 2017 dans algif_aead.c, séparant req->src (SGL TX, où splice livre les pages) de req->dst (SGL RX, tampon utilisateur). Toutes les principales distributions fournissent le correctif.
# Ubuntu / Debian
apt update && apt upgrade linux-generic
# RHEL / Amazon Linux
dnf update kernel
# SUSE
zypper update kernel-default
Kislley Rodrigues (m0us3r) Ambassadeur Wazuh | Ingénierie de détection | Équipe bleue
Règles de détection, configuration du capteur auditd et politique SCA validées sur Wazuh 4.14.4, Ubuntu 24.04.2 LTS (noyau 6.8.0-106-generic) et Kali GNU/Linux 2026.1 (noyau 6.18.12+kali-amd64).
| Source | Lien |
|---|---|
| CISA ajoute le bug d'accès root Linux activement exploité CVE-2026-31431 au KEV | https://thehackernews.com/2026/05/cisa-adds-actively-exploited-linux-root.html |
Ce projet a été développé dans le cadre du Programme d'ambassadeurs Wazuh.
Wazuh est une plateforme de sécurité open source gratuite qui fournit une protection unifiée XDR et SIEM. En savoir plus sur wazuh.com.
| Ressource | Lien |
|---|
| Site officiel du CVE | https://copy.fail/ |
| Article technique - Xint Research | https://xint.io/blog/copy-fail-linux-distributions |
| PoC - copy_fail_exp.py | https://github.com/theori-io/copy-fail-CVE-2026-31431/blob/main/copy_fail_exp.py |
| Correctif du noyau - a664bf3d603d | https://github.com/torvalds/linux/commit/a664bf3d603d |
| Commit vulnérable - 72548b093ee3 | https://github.com/torvalds/linux/commit/72548b093ee3 |
| MITRE ATT&CK T1068 | https://attack.mitre.org/techniques/T1068/ |
| Distribution | Noyau | Statut |
|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws | ROOT CONFIRMÉ |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 | ROOT CONFIRMÉ |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 | ROOT CONFIRMÉ |
| SUSE 16 | 6.12.0-160000.9-default | ROOT CONFIRMÉ |
| Kali GNU/Linux 2026.1 | 6.18.12+kali-amd64 | ROOT CONFIRMÉ |
| Règle | Parent | Signal | Profondeur | Niveau |
|---|
| 80700 | decoded_as=auditd | Ancre auditd (intégrée à Wazuh) | 0 | 0 |
| 92600 | 80700 | Exécution de processus Python (intégrée à Wazuh) | 1 | 0 |
| 199600 | 92600 | Socket AF_ALG - chaîne Python | 2 | 10 |
| 199601 | 92600 | Appel système splice() - chaîne Python | 2 | 10 |
| 199604 | 199601 + if_matched=199600 | CHAÎNE D'EXPLOITATION - Python (même pid/120s) | 3 | 15 |
| 199602 | 80700 | Exécution de /usr/bin/su | 1 | 6 |
| 199603 | 80700 | Exécution de modprobe/kmod | 1 | 12 |
| 199605 | 80700 | Socket AF_ALG - non-Python | 1 | 10 |
| 199606 | 80700 | Appel système splice() - non-Python | 1 | 10 |
| 199607 | 199606 + if_matched=199605 | CHAÎNE D'EXPLOITATION - non-Python (même pid/120s) | 2 | 15 |
| Règle | Hits | Description |
|---|
| 199604 | 80 | CHAÎNE D'EXPLOITATION DÉTECTÉE - pid=46784 exe=/usr/bin/python3.13 |
| 199600 | 40 | Socket AF_ALG créé par un processus non root |
| 199603 | 28 | Exécution de modprobe détectée |
| 199602 | 12 | /usr/bin/su exécuté |
| Date | Événement |
|---|
| 2026-03-23 | Vulnérabilité signalée à l'équipe de sécurité du noyau Linux |
| 2026-03-24 | Confirmation initiale reçue |
| 2026-03-25 | Correctifs proposés et examinés |
| 2026-04-01 | Correctif validé dans le noyau principal (a664bf3d603d) |
| 2026-04-22 | CVE-2026-31431 attribué |
| 2026-04-29 | Divulgation publique - article Xint + PoC publiés |
| Dirty Cow (2016-5195) | Dirty Pipe (2022-0847) | Copy Fail (2026-31431) |
|---|
| Condition de course | Oui - tentatives multiples | Non | Non - logique déterministe |
| Peut faire planter le système | Oui | Non | Non |
| Portabilité | Limitée | Spécifique à la version | Toutes les distributions 2017+ |
| Taille de l'exploit | Kilooctets (C) | Centaines d'octets | 732 octets (stdlib Python) |
| Détection FIM | Possible | Possible | Impossible |
| Vérification | Titre | Risque |
|---|
| 31431001 | algif_aead non chargé en mémoire | CRITIQUE |
| 31431002 | algif_aead désactivé via modprobe.d | ÉLEVÉ |
| 31431003 | auditd actif et en cours d'exécution | ÉLEVÉ |
| 31431004 | Règles du capteur CVE-2026-31431 déployées | ÉLEVÉ |
| Catalogue des vulnérabilités connues exploitées | https://www.cisa.gov/known-exploited-vulnerabilities-catalog |
| CVE-2026-31431 - crypto : algif_aead - Retour au fonctionnement hors place | https://www.cve.org/CVERecord?id=CVE-2026-31431 |