
Analyse complète de CVE-2026-31431, une élévation de privilèges locale (LPE) du noyau Linux, incluant la méthodologie d'exploitation, les scripts de détection, les règles YARA, les configurations auditd et Falco, ainsi que des recommandations de remédiation.
algif_aeadCISA KEV | CVSS 7.8 ÉLEVÉ | Affecte les noyaux Linux 4.14 – début 2026 (~9 ans)
CVE-2026-31431, surnommée « Copy Fail », est une vulnérabilité d'élévation de privilèges locale (LPE) de haute sévérité dans le sous-système cryptographique du noyau Linux. Un utilisateur local à faibles privilèges peut passer à root en quelques secondes sur tout système non corrigé.
| Attribut | Valeur |
|---|---|
| CVE | CVE-2026-31431 |
| Surnom | Copy Fail |
| CVSS v3.1 | 7.8 ÉLEVÉ |
| Vecteur d'attaque | Local |
| Privilèges requis | Faibles |
| Interaction utilisateur | Aucune |
| Composant | crypto/algif_aead.c — modèle authencesn |
| Introduit | 2017 (commit 72548b093ee3) |
| Divulgué | 2026 |
| Années silencieuses | ~9 ans |
| CISA KEV | Oui |
| PoC public | Oui (script Python autonome de 732 octets) |
detection/check_vulnerable.sh avant et après la remédiation.CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
| Métrique | Valeur | Justification |
|--------|-------|-----------|
| Vecteur d'attaque | **Local** | Nécessite un accès shell (SSH, exec de conteneur, physique) |
| Complexité de l'attaque | **Faible** | Fiable, entièrement automatisé — aucune condition de course requise |
| Privilèges requis | **Faibles** | N'importe quel compte utilisateur non privilégié |
| Interaction utilisateur | **Aucune** | Aucune interaction de la victime nécessaire |
| Confidentialité | **Élevée** | Compromission complète du système |
| Intégrité | **Élevée** | Compromission complète du système |
| Disponibilité | **Élevée** | Compromission complète du système |
### Paysage des menaces
| Facteur | Évaluation |
|--------|-----------|
| Disponibilité du PoC | Public, armé, Python autonome de 732 octets |
| Fiabilité de l'exploit | Élevée — fonctionne sur les distributions testées sans modification |
| Difficulté de détection | Élevée — aucune écriture sur disque, aucune page sale |
| Compétence requise de l'attaquant | Faible — script kiddie avec un PoC public |
| CISA KEV | Ajouté en 2026 — surveillé activement |
| Microsoft Defender | Signalé comme faisant l'objet d'une enquête active |
### Environnements concernés
| Environnement | Risque |
|-------------|------|
| Serveurs Linux sur métal nu | Critique |
| Machines virtuelles Linux (cloud ou sur site) | Critique |
| Nœuds Kubernetes | Critique (permet également l'évasion de conteneur) |
| Hôtes Docker | Critique |
| Hébergement mutualisé / multi-locataire | Critique |
| WSL2 / Linux sur Windows | À évaluer selon la version du noyau |
---
## 3. Plongée technique approfondie
### 3.1 Contexte : AF_ALG et AEAD
Le noyau Linux expose les opérations cryptographiques aux applications en espace utilisateur via les **sockets AF_ALG** (`AF_ALG = 38`). Cette interface (`algif_aead`) permet aux applications non privilégiées d'invoquer les accélérateurs matériels cryptographiques du noyau sans nécessiter de code en mode noyau.
**AEAD** (Authenticated Encryption with Associated Data) — les algorithmes comme AES-GCM et ChaCha20-Poly1305 sont largement utilisés pour TLS, le chiffrement de disque et les protocoles VPN. Le template vulnérable est `authencesn` — une composition AEAD utilisant `hmac(sha256)` + `cbc(aes)` avec prise en charge du numéro de séquence étendu (ESN), couramment utilisée dans IPsec.
### 3.2 Cause racine
En 2017, le commit `72548b093ee3` a introduit l'**opération AEAD en place** dans `algif_aead` comme optimisation de performance — permettant au moteur cryptographique de lire et d'écrire dans le même tampon. Cela était défectueux :```
The bug chain:
1. Caller binds AF_ALG socket to:
authencesn(hmac(sha256),cbc(aes))
2. Caller sends a decryption request via sendmsg() with specific flags
3. Caller uses splice() to feed PAGE CACHE PAGES from an open file
descriptor directly into the socket's scatterlist
4. The authencesn template, during ESN header processing, uses the
OUTPUT BUFFER as scratch space — writing 4 bytes past the
expected output boundary
5. Because the scatterlist contains page cache pages (not private
copies), this scratch write lands DIRECTLY IN THE PAGE CACHE
6. Page cache is shared kernel-wide — all processes reading the
same file now see the modified bytes
Key insight: splice() is zero-copy — it hands page cache references
to the socket. The in-place "optimization" then writes INTO those
pages. No dirty bit is set because the write goes through the crypto
engine, not the normal write path.
La vulnérabilité permet une écriture contrôlée de 4 octets dans le cache de pages de tout fichier que l'attaquant peut ouvrir en lecture :
| Propriété | Valeur |
|---|---|
| Taille d'écriture | 4 octets |
| Contrôle du décalage | Oui — contrôlé par l'attaquant via le décalage de splice |
| Cible | Cache de pages de tout fichier lisible |
| Marquage de page sale | Aucun |
| Modification sur disque | Aucune |
| Mise à jour de l'horodatage | Aucune |
| Entrée du journal noyau | Aucune (sauf si auditd est configuré) |
L'écriture est répétable — l'exploit boucle l'écriture de 4 octets pour corriger des séquences de code plus longues.
[1] Open /usr/bin/su (or any setuid-root binary) for reading ↓ [2] Map a copy to find target instruction bytes (e.g., UID check, execve path, security gate) ↓ [3] Compute exact page cache offset of target bytes ↓ [4] Set up AF_ALG socket → authencesn(hmac(sha256),cbc(aes)) ↓ [5] splice() the target binary's page cache into the socket ↓ [6] Trigger decryption → authencesn scratch write patches the target bytes in page cache (4 bytes per iteration) ↓ [7] Repeat for each 4-byte patch needed ↓ [8] Execute /usr/bin/su → runs root-owned setuid binary but now with attacker-controlled code in page cache ↓ [9] Root shell
### 3.5 Pourquoi les défenses standard échouent