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)*