
Règles de détection, signatures YARA, règles auditd/Wazuh et modèles d'événements MISP pour la vulnérabilité LPE du noyau Linux CVE-2026-31431 (Copy Fail). Inclut des IoC, des étapes d'atténuation et une analyse de l'exploit.
Publié : 2026-04-30
CVSSv3 : 7.8 (Élevée)
Type : Élévation de Privilèges Locale (LPE)
Sous-système : Noyau Linux algif_aead / authencesn template cryptographique
Affecté : Noyaux Linux 4.14 – 6.18.21 (pratiquement toutes les distributions depuis 2017)
Références :
CVE-2026-31431 est un défaut logique introduit dans le noyau 4.14 (2017) à l'intersection de trois modifications indépendantes :
authencesn (ajouté en 2011 pour le support IPsec ESN) écrit 4 octets de données temporaires au-delà de la limite de son tampon de sortie.AF_ALG a obtenu le support AEAD en 2015, permettant à l'espace utilisateur de soumettre des données via splice() à partir de fichiers mis en cache en pages.algif_aead.c a été optimisé pour fonctionner en place (req->src == req->dst), plaçant des pages de cache en direct dans un scatterlist inscriptible.Résultat : un utilisateur non privilégié peut écrire exactement 4 octets contrôlés par l'attaquant dans la copie du cache de pages du noyau de tout fichier lisible — y compris les binaires setuid et /etc/passwd — sans toucher au fichier sur disque. Le PoC fonctionnel est un script Python de 732 octets. Pas de condition de concurrence. Pas de décalages par distribution. Fiable sur Ubuntu, RHEL, Amazon Linux et SUSE.
Attacker opens AF_ALG socket (family 38, type 5) └─ Binds to "authencesn(hmac(sha256),cbc(aes))" └─ Sets SOL_ALG (279) options including key and authsize └─ Accepts a connection socket
Attacker opens target file (e.g., /etc/passwd) read-only └─ Uses splice() to feed page-cache pages into the AEAD socket's RX buffer └─ Sends crafted AAD via sendmsg() — bytes 4–7 of AAD = attacker-controlled write value
authencesn performs in-place decryption: └─ scatterwalk_map_and_copy writes seqno_lo into the chained page-cache page └─ recvmsg() returns an error (HMAC fails — expected), but the write already happened
Page-cache now contains attacker-modified copy of the file └─ Kernel executes from page-cache, not disk └─ On-disk file is UNCHANGED — file integrity tools see nothing
Le PoC cible `/etc/passwd` : il trouve l'offset du champ UID de l'utilisateur en cours et le remplace par `0000`, puis invoque `su` pour obtenir un shell root.
---
## Limitations de la détection
> **Lisez cette section avant de déployer les règles ci-dessous.**
Cet exploit présente deux propriétés qui limitent considérablement la couverture de la détection :
**1. L'écriture va dans le cache de pages, pas dans le système de fichiers.**
Tout outil de détection qui surveille les événements du système de fichiers — `inotify`, `fanotify`, AIDE, Tripwire, les surveillances de chemins auditd — **ne** verra **pas** la modification. Le fichier sur disque n'est jamais écrit. Cela signifie que les indicateurs `-p w` (écriture) dans les surveillances de chemins auditd pour `/usr/bin/su` ou `/etc/passwd` ne captureront pas l'écriture réelle de l'exploitation.
**2. Le mécanisme utilise des interfaces noyau légitimes.**
Les sockets `AF_ALG`, `splice()` et `authencesn` ont tous des utilisations légitimes (IPsec, auto-tests du noyau, E/S de type sendfile). La détection doit se concentrer sur la *combinaison* de ces primitives plutôt que sur une seule isolément, et il faut s'attendre à des faux positifs sur les systèmes exécutant IPsec ou effectuant des tests cryptographiques du noyau.
**Ce que la détection PEUT attraper :**
- L'appel système `socket(AF_ALG, SOCK_SEQPACKET, 0)`
- L'appel système `splice()` corrélé avec ce qui précède, en particulier près de l'accès à un binaire setuid
- Le script PoC lui-même (via YARA)
- La chaîne d'algorithme spécifique `authencesn(hmac(sha256),cbc(aes))` dans la mémoire du processus ou les fichiers de script
**Ce que la détection NE PEUT PAS attraper :**
- L'écriture réelle dans le cache de pages (en mémoire, aucun événement du système de fichiers)
- L'utilisation post-exploitation de l'entrée du cache de pages modifiée (ressemble à un appel normal `su` ou `passwd`)
- Les variantes qui évitent Python ou la chaîne d'algorithme spécifique
---
## Atténuation immédiate
Avant de déployer des règles de détection, appliquez cette atténuation sur tout hôte non corrigé :```bash
# Disable algif_aead kernel module — blocks the exploit primitive entirely
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf
sudo rmmod algif_aead 2>/dev/null || true
Vérifiez que l'atténuation est active à l'aide du détecteur officiel :```bash
python3 test_cve_2026_31431.py
> **Note :** La commande `rmmod` échouera si le module n'est pas actuellement chargé ; c'est acceptable. La configuration `modprobe.d` empêche les chargements futurs. Cette atténuation n'a aucun impact sur les charges de travail standard TLS, SSH ou de chiffrement de système de fichiers — elle n'affecte que IPsec avec numéros de séquence étendus utilisant le modèle `authencesn`, ce qui est rare en dehors des passerelles VPN dédiées.
---
## Règle YARA
Enregistrer sous `cve_2026_31431.yar`
> **Périmètre d'analyse :** Cette règle est conçue pour analyser des fichiers de script Python sur disque ou extraits de vidages mémoire. Elle correspondra au PoC connu et à des variantes proches. Elle NE détectera PAS l'activité d'exploitation au niveau des appels système — utilisez les règles auditd/Wazuh pour cela.```yara
rule CVE_2026_31431_CopyFail_PoC_HighConfidence {
meta:
description = "High-confidence match: CVE-2026-31431 Copy Fail PoC or close variant"
author = "Detection Engineering"
reference = "https://xint.io/blog/copy-fail-linux-distributions"
cve = "CVE-2026-31431"
date = "2026-04-30"
severity = "High"
cvss = "7.8"
strings:
// Algorithm string unique to this exploit path — very high fidelity
$alg_full = "authencesn(hmac(sha256),cbc(aes))" ascii
// Specific socket call signature from PoC: AF_ALG=38, SOCK_SEQPACKET=5
$socket_call = "socket(38,5,0)" ascii
// SOL_ALG socket option (decimal 279)
$solalg = "setsockopt(279" ascii
// Hex key/iv payload written via setsockopt in PoC
$key_payload = "0800010000000010" ascii
// splice() usage in context of AEAD operations
$splice = "splice(" ascii
// Target indicators from PoC (page-cache corruption targets)
$target_passwd = "/etc/passwd" ascii
$target_su = "/usr/bin/su" ascii
// AF_ALG aead bind strings
$aead_bind = "\"aead\"" ascii