Share
## https://sploitus.com/exploit?id=ED8F5E26-1F6D-53EE-A4B6-63A6CC9E23DF
# đŽ CVE-2026-31431 â Copy Fail : RĂ©pertoire de PrĂ©vention
> **ĂlĂ©vation de privilĂšges locale** | Linux Kernel | Score CVSS : Critique
> Affecte Ubuntu, Amazon Linux, RHEL, SUSE â kernels depuis **2017**
---
## đ Sommaire
1. [Vue d'ensemble](#vue-densemble)
2. [Mécanisme de la faille](#mécanisme-de-la-faille)
3. [SystÚmes affectés](#systÚmes-affectés)
4. [Démonstration (environnement de test)](#démonstration-environnement-de-test)
5. [Indicateurs de compromission](#indicateurs-de-compromission)
6. [Remédiation et correctifs](#remédiation-et-correctifs)
7. [Atténuation temporaire](#atténuation-temporaire)
8. [Références](#références)
---
## Vue d'ensemble
**CVE-2026-31431**, surnommée *Copy Fail*, est une faille logique dans le sous-systÚme cryptographique du noyau Linux. Elle permet à **n'importe quel utilisateur non-privilégié** d'obtenir les droits `root` via une écriture contrÎlée de **4 octets dans le page cache** d'un fichier exécutable setuid.
### Pourquoi c'est critique
| Caractéristique | Détail |
|---|---|
| **Exploit** | 732 octets de Python, bibliothĂšque standard uniquement |
| **Conditions** | Aucun race condition, aucun timing précis requis |
| **DĂ©tection** | â ïž Invisible aux outils de vĂ©rification d'intĂ©gritĂ© sur disque |
| **Impact** | Root local + échappement de conteneur (Kubernetes) |
| **PortabilitĂ©** | MĂȘme script sur toutes les distributions testĂ©es |
> **Contexte historique** : Comparable Ă Dirty Cow (CVE-2016-5195) et Dirty Pipe (CVE-2022-0847), mais *sans* condition de course et avec un script minimaliste.
---
## Mécanisme de la faille
La vulnérabilité résulte de l'intersection de **trois modifications indépendantes** du noyau sur une décennie :
```
2011 â authencesn ajoutĂ© au kernel (support IPsec ESN)
2015 â AF_ALG acquiert le support AEAD + splice()
2017 â Optimisation "in-place" dans algif_aead.c â ROOT CAUSE
```
### 1. Composants impliqués
**`AF_ALG`** â Socket exposant le sous-systĂšme crypto au userspace (sans privilĂšge).
**`splice()`** â Transfert de donnĂ©es entre file descriptors *sans copie*, en passant des rĂ©fĂ©rences directes aux pages du page cache.
**`authencesn`** â Template AEAD pour IPsec ESN (Extended Sequence Numbers). Utilise le buffer de destination comme zone de travail temporaire pour rĂ©arranger les octets ESN.
### 2. Le bug
Lors de l'optimisation "in-place" de 2017, le noyau a commencé à chaßner les pages du page cache directement dans la scatterlist *destination* via `sg_chain()` :
```
Input SGL: AAD || Ciphertext || Tag (page cache pages)
â
Output SGL: AAD || Ciphertext --------+ (chaßné par référence)
â â
Buffer RX Buffer RX (mémoire utilisateur)
```
`authencesn` Ă©crit alors **4 octets de `seqno_lo`** Ă l'offset `assoclen + cryptlen` â soit directement dans les pages du page cache du fichier cible.
### 3. Primitives contrÎlées par l'attaquant
| Primitive | ContrĂŽle |
|---|---|
| **Quel fichier** | Tout fichier lisible par l'utilisateur courant |
| **Quel offset** | Déterminé par `assoclen`, offset et longueur du splice |
| **Quelle valeur** | Les octets 4â7 de l'AAD (champ `seqno_lo`) |
### 4. Impact sur la stealthiness
Le noyau ne marque **jamais** la page corrompue comme "dirty" pour le writeback. Le fichier sur disque reste intact. Seul le page cache (qui est ce qui est effectivement lu lors d'un `execve()`) est corrompu.
```
Fichier disque : [intact] â sha256sum, tripwire, AIDE â â
pas d'alerte
Page cache : [corrompu] â execve() lit ici â â ïž shellcode exĂ©cutĂ©
```
---
## SystÚmes affectés
### Distributions testées
| Distribution | Version kernel | Statut |
|---|---|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws | â
Vulnérable (testé) |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 | â
Vulnérable (testé) |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 | â
Vulnérable (testé) |
| SUSE 16 | 6.12.0-160000.9-default | â
Vulnérable (testé) |
### FenĂȘtre de vulnĂ©rabilitĂ©
Tout kernel intĂ©grant le commit `72548b093ee3` (2017) jusqu'au correctif `a664bf3d603d` (2026-04-01) est potentiellement vulnĂ©rable â soit **prĂšs d'une dĂ©cennie**.
---
## Démonstration (environnement de test)
> â ïž **Ă rĂ©aliser uniquement sur un systĂšme vous appartenant (VM isolĂ©e, lab dĂ©diĂ©). Toute utilisation sur des systĂšmes tiers est illĂ©gale.**
### Prérequis
```bash
# Ubuntu Server â vĂ©rifier la version du kernel
uname -r
# Vérifier la présence du module algif_aead
lsmod | grep algif_aead
# Python 3.10+ requis (pour os.splice)
python3 --version
```
### Cloner le PoC
```bash
git clone https://github.com/theori-io/copy-fail-CVE-2026-31431.git
cd copy-fail-CVE-2026-31431
```
### Lancer le test
```bash
# En tant qu'utilisateur non-privilégié
id # â uid=1001(user) gid=1001(user)
python3 copy_fail_exp.py
# Résultat attendu sur kernel vulnérable :
# uid=0(root) gid=0(root) groups=0(root)
```
### Ce que vous devriez observer
1. Le script crée un socket `AF_ALG` sur `authencesn(hmac(sha256),cbc(aes))`
2. Il splique `/usr/bin/su` dans un pipe puis dans le socket
3. Chaque appel `recv()` écrit 4 octets de shellcode dans le page cache de `su`
4. `execve("/usr/bin/su")` charge la version corrompue â shell root
### Vérification post-exploit
```bash
# Le fichier disque est INTACT
sha256sum /usr/bin/su # mĂȘme hash qu'avant
# Mais le page cache est corrompu
# (visible en vidant le cache et en observant le comportement)
echo 3 > /proc/sys/vm/drop_caches
# AprĂšs ce drop, /usr/bin/su redevient normal
```
---
## Indicateurs de compromission
Ătant donnĂ© la nature furtive de l'exploit (pas de modification disque), la dĂ©tection est difficile. Voici les signaux Ă surveiller :
### Logs systĂšme Ă surveiller
```bash
# Appels systĂšme suspects : AF_ALG + splice en combinaison
# Surveiller dans auditd :
auditctl -a always,exit -F arch=b64 -S socket -F a0=38 -k af_alg_socket
auditctl -a always,exit -F arch=b64 -S splice -k splice_call
# Escalades de privilĂšges inattendues
grep "uid=0" /var/log/auth.log | grep -v "sudo\|su\|login"
```
### Détection comportementale
```bash
# Process enfants de su avec UID 0 inattendus
ps aux | awk '$1 == "root" && $11 !~ /^(sshd|systemd|cron)/'
# Connexions réseau depuis des process root inattendus
ss -tlnp | grep LISTEN
```
### Outils de détection mémoire
```bash
# Comparer le hash du fichier sur disque vs en mémoire
# (méthode manuelle via /proc/PID/maps)
# Des EDR modernes peuvent détecter les divergences page cache / disque
```
---
## Remédiation et correctifs
### â
Solution définitive : mettre à jour le kernel
Le correctif officiel (`a664bf3d603d`) revient à une opération **out-of-place** dans `algif_aead.c`, séparant les scatterlists source et destination.
```bash
# Ubuntu / Debian
sudo apt update && sudo apt upgrade linux-image-$(uname -r)
sudo reboot
# RHEL / CentOS Stream
sudo dnf update kernel
sudo reboot
# Amazon Linux 2023
sudo dnf update kernel
sudo reboot
# SUSE
sudo zypper update kernel-default
sudo reboot
```
### Vérifier que le correctif est appliqué
```bash
# AprÚs reboot, vérifier la version du kernel
uname -r
# Le module algif_aead sur un kernel patché refusera l'opération in-place
```
---
## Atténuation temporaire
Si la mise à jour immédiate du kernel n'est pas possible :
### Option 1 : Désactiver le module `algif_aead`
```bash
# Blacklist permanent
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf
# Déchargement immédiat (si chargé)
sudo rmmod algif_aead 2>/dev/null
# Vérification
lsmod | grep algif_aead # â rien
```
> â ïž **Impact** : Les applications utilisant AF_ALG avec AEAD (rare en userspace) cesseront de fonctionner. L'usage principal d'`authencesn` est IPsec dans le kernel (xfrm), qui n'est pas affectĂ© par ce blacklist.
### Option 2 : Restriction via seccomp
Pour les environnements conteneurisés, restreindre la création de sockets `AF_ALG` (famille 38) via une politique seccomp.
```json
{
"defaultAction": "SCMP_ACT_ALLOW",
"syscalls": [
{
"names": ["socket"],
"action": "SCMP_ACT_ERRNO",
"args": [
{ "index": 0, "value": 38, "op": "SCMP_CMP_EQ" }
]
}
]
}
```
### Option 3 : Surveillance renforcée (non-préventif)
```bash
# Activer auditd sur les syscalls sensibles
sudo systemctl enable auditd
sudo auditctl -a always,exit -F arch=b64 -S socket -F a0=38 -k copy_fail_watch
```
---
## Références
| Ressource | Lien |
|---|---|
| PoC officiel | [theori-io/copy-fail-CVE-2026-31431](https://github.com/theori-io/copy-fail-CVE-2026-31431) |
| Writeup technique complet | [xint.io/blog/copy-fail-linux-distributions](https://xint.io/blog/copy-fail-linux-distributions) |
| Correctif kernel (commit) | [a664bf3d603d](https://github.com/torvalds/linux/commit/a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5) |
| Commit vulnérable original | [72548b093ee3](https://github.com/torvalds/linux/commit/72548b093ee3) (2017) |
| NVD | [nvd.nist.gov/vuln/detail/CVE-2026-31431](https://nvd.nist.gov/vuln/detail/CVE-2026-31431) |
### Timeline de disclosure coordonnée
| Date | ĂvĂ©nement |
|---|---|
| 2026-03-23 | Rapport à l'équipe sécurité du kernel Linux |
| 2026-03-24 | Accusé de réception |
| 2026-03-25 | Revue des patches |
| 2026-04-01 | Correctif intégré au kernel mainline |
| 2026-04-22 | CVE-2026-31431 assigné |
| 2026-04-29 | Disclosure publique |
---
## âïž Avertissement lĂ©gal
Ce dépÎt est à **but éducatif et de recherche en sécurité défensive uniquement**.
Toute exploitation de cette vulnĂ©rabilitĂ© sur des systĂšmes sans autorisation explicite est **illĂ©gale** (Code pĂ©nal français, article 323-1 et suivants ; CFAA aux Ătats-Unis).
Testez **uniquement** sur vos propres systÚmes ou dans un cadre de pentest autorisé.
---
*Maintenu par [@Maxime288](https://github.com/Maxime288)*