
Détecteur + PoC pour les vulnérabilités d'écriture du cache de pages Linux : Copy Fail (CVE-2026-31431) et Dirty Frag (CVE-2026-43284/43500). Recherche en sécurité autorisée uniquement.
Un détecteur unifié et un harnais de preuve de concept (PoC) pour les familles de vulnérabilités d'écriture du cache de pages Linux Copy Fail et Dirty Frag.``` ██████╗ ██╗██████╗ ████████╗██╗ ██╗███████╗ █████╗ ██╗██╗ ██╔══██╗██║██╔══██╗╚══██╔══╝╚██╗ ██╔╝██╔════╝██╔══██╗██║██║ ██║ ██║██║██████╔╝ ██║ ╚████╔╝ █████╗ ███████║██║██║ ██║ ██║██║██╔══██╗ ██║ ╚██╔╝ ██╔══╝ ██╔══██║██║██║ ██████╔╝██║██║ ██║ ██║ ██║ ██║ ██║ ██║██║███████╗ ╚═════╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝╚══════╝
DIRTYFAIL est un outil C petit et bien documenté destiné aux chercheurs en sécurité.
Il détecte si un hôte Linux est vulnérable aux trois CVE de cette
famille, et — avec une confirmation explicite tapée — exécute une
preuve de concept réelle qui place l'appelant dans un shell root sur un
système vulnérable.
| CVE / variante | Nom | Couverture DIRTYFAIL |
|---|---|---|
| **CVE-2026-31431** | Copy Fail (algif_aead `authencesn` écriture cache de pages) | Détection + PoC complet |
| **CVE-2026-43284 v4** | Dirty Frag — IPv4 xfrm-ESP écriture cache de pages | Détection + PoC complet |
| **CVE-2026-43284 v6** | Dirty Frag — IPv6 xfrm-ESP écriture cache de pages (`esp6`) | Détection + PoC complet |
| **CVE-2026-43500** | Dirty Frag — RxRPC écriture cache de pages | Détection + PoC complet |
| Variante Copy Fail GCM | xfrm-ESP `rfc4106(gcm(aes))` écriture cache de pages | Détection + PoC complet |
**Modes bonus :**
- **`--scan --active`** — sondes actives sentinel-STORE. Par défaut `--scan`
rapporte les préconditions par CVE (noyau, modules, état LSM) ainsi qu'une
sonde active de la primitive Copy Fail. L'ajout de `--active` étend
la sonde STORE du fichier sentinelle aux quatre autres primitives (ESP v4,
ESP v6, RxRPC, GCM) : chacune déclenche le déclencheur noyau contre une
sentinelle dans `/tmp` et ne signale VULNÉRABLE que si les octets marqueurs
atterrissent réellement. C'est le seul moyen de distinguer un noyau avec
un correctif rétroporté (les préconditions disent vulnérable mais la sonde
dit intact) d'un noyau non corrigé sans exécuter l'exploit complet.
`/etc/passwd` n'est jamais touché. Auto-calibrage du décalage STORE V6 par
version de noyau.
- **`--exploit-backdoor`** — porte dérobée persistante uid-0 : remplacement
à longueur identique d'une ligne `nologin`/`false`/`sync` dans `/etc/passwd`
par `dirtyfail::0:0:<pad>:/:/bin/bash`. Survit à la sortie du shell jusqu'à
ce que la page soit évincée. État stocké dans `/var/tmp/.dirtyfail.state`
pour `--cleanup-backdoor`. Le nom d'utilisateur `dirtyfail` est délibérément
choisi pour correspondre à ce projet afin qu'il soit immédiatement
identifiable dans tout audit — changez `NEW_USER` dans `src/backdoor.c` si
vous avez besoin d'un identifiant différent pour un engagement d'équipe
rouge autorisé.
- **Contournement AppArmor** — bat la politique
`apparmor_restrict_unprivileged_userns=1` d'Ubuntu via une ré-exécution
`change_onexec("crun")` en un saut dans un profil non confiné qui conserve
les capacités userns. Chaque mode d'exploitation gère cela en interne via
un fork : le parent reste dans l'espace de nommage init, l'enfant effectue
la danse de contournement, le parent lit le cache de pages global et
exécute `su` pour un vrai root de l'espace de nommage init. L'option
héritée `--aa-bypass` existe encore pour déboguer les mécanismes de
contournement en isolation. Voir [§8.5 Architecture](#85-architecture-outerinner-fork-based-bypass).
## Fonctionnement vérifié sur
DIRTYFAIL a été **validé empiriquement de bout en bout** sur plusieurs
distributions et versions de noyau. La matrice ci-dessous reflète les
résultats de test par mode lors de l'exécution de chaque mode `--exploit-*`
contre une installation fraîche de chaque distribution.
| Distribution | Noyau | LSM | Copy Fail | xfrm-ESP v4 | xfrm-ESP v6 | RxRPC | GCM | Porte dérobée | Shellcode SU |
|---|---|---|---|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| Ubuntu 24.04 LTS | `6.8.0-111-generic` | AppArmor | 🛡² | ✅ | ✅ | ✅ | ✅¹ | ✅¹ | (non testé) |
| Debian 13.4 | `6.12.86+deb13` | aucun | 🛡 | 🛡 | 🛡 | 🛡 | 🛡 | 🛡 | 🛡⁵ |
| AlmaLinux 10.1 | `6.12.0-124.8.1.el10_1` | SELinux | ✅ | ✅ | ✅ | ⏭³ | ✅ | ✅ | ✅ |
| Fedora 44 (Serveur) | `6.19.10-300.fc44` | SELinux | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Ubuntu 26.04 LTS | `7.0.0-15-generic` | AppArmor (renforcé) | 🛡 | 🛡⁴ | 🛡⁴ | 🛡⁴ | 🛡⁴ | 🛡⁴ | 🛡⁵ |
**Légende :** ✅ exploit atterri et a produit un vrai root de l'espace de nommage init · 🛡 atténué — l'exploit ne peut pas atteindre le bogue noyau (noyau patché OU LSM bloque le chemin non privilégié) · ⏭ non applicable (précondition manquante)
### Validation des sondes actives (`--scan --active`)
Le flag `--active` ajoute une sonde STORE de fichier sentinelle par CVE lors
de la détection. Nous avons validé les sorties des sondes contre les mêmes 4
distributions ci-dessus (Debian, Fedora, AlmaLinux, Ubuntu 26.04) — la
matrice ci-dessous montre le verdict de la sonde par mode et correspond
un-à-un à la vérité terrain de l'exploit complet :
| Distribution | Sonde Copy Fail | Sonde ESP v4 | Sonde ESP v6 | Sonde RxRPC | Sonde GCM |
|---|---|:-:|:-:|:-:|:-:|:-:|
| Debian 13.4 | intacte 🛡 | intacte 🛡 | intacte 🛡 | intacte 🛡 | intacte 🛡 |
| Fedora 44 | marqueur @0 ✅ | STORE @0 ✅ | STORE @8 ✅ | changement d'octet ✅ | sentinelle[0] 0x41→0x27 ✅ |
| AlmaLinux 10.1 | marqueur @0 ✅ | STORE @0 ✅ | STORE @8 ✅ | préconditions ⏭ | sentinelle modifiée ✅ |
| Ubuntu 26.04 | intacte 🛡 | bloquée par LSM 🛡 | bloquée par LSM 🛡 | bloquée par LSM 🛡 | bloquée par LSM 🛡 |
Le décalage d'atterrissage STORE de la sonde V6 (8 sur Fedora et Alma)
correspond au `V6_STORE_SHIFT` empirique que `calibrate_v6_shift()` découvre
à l'exécution — confirmant que l'auto-calibrage remplace correctement la
constante précédemment codée en dur entre les versions de noyau.
¹ GCM et la porte dérobée nécessitent que `algif_aead` soit chargeable.
Ubuntu 24.04 fournit `/etc/modprobe.d/disable-algif_aead.conf` qui le
met sur liste noire comme mesure d'atténuation de Copy Fail. Une fois la
liste noire supprimée (par exemple sur un noyau antérieur à la mesure
d'atténuation), les deux modes fonctionnent de bout en bout.
² Le chemin algif_aead de Copy Fail est atténué par la liste noire de
modprobe ; la primitive CVE sous-jacente dans le noyau est la même que
`authencesn` soit atteignable ou non. xfrm-ESP, RxRPC et la variante GCM
atterrissent tous sur le même noyau car ils ne passent pas par algif_aead.
³ Le paquet `kernel-modules-extra` d'AlmaLinux 10 n'est pas installé par
défaut sur une installation minimale, donc `rxrpc.ko` est manquant sur le
disque. L'installation de `kernel-modules-extra-$(uname -r)` depuis EPEL ou
le dépôt extras AlmaLinux ramène le module ; sur une installation minimale
standard, RxRPC est inaccessible.
⁴ **Ubuntu 26.04 LTS bloque de manière exhaustive l'exploitation non
privilégiée.** Le noyau livré `7.0.0-15.15` (publié le 2026-04-22) **est
antérieur d'environ 2 semaines au patch principal `f4c50a4034e6` (fusionné
le 2026-05-07)** — donc le bogue EST toujours présent dans le noyau. La
défense d'Ubuntu est une **défense en profondeur via le renforcement
d'AppArmor**, pas un patch noyau :