
Detector + PoC für Linux-Page-Cache-Write-Sicherheitslücken: Copy Fail (CVE-2026-31431) und Dirty Frag (CVE-2026-43284/43500). Nur für autorisierte Sicherheitsforschung.
Ein vereinter Detektor und PoC-Harnisch für die Copy Fail und Dirty Frag Linux-Page-Cache-Schreibschwachstellenfamilien.``` ██████╗ ██╗██████╗ ████████╗██╗ ██╗███████╗ █████╗ ██╗██╗ ██╔══██╗██║██╔══██╗╚══██╔══╝╚██╗ ██╔╝██╔════╝██╔══██╗██║██║ ██║ ██║██║██████╔╝ ██║ ╚████╔╝ █████╗ ███████║██║██║ ██║ ██║██║██╔══██╗ ██║ ╚██╔╝ ██╔══╝ ██╔══██║██║██║ ██████╔╝██║██║ ██║ ██║ ██║ ██║ ██║ ██║██║███████╗ ╚═════╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝╚══════╝
DIRTYFAIL ist ein kleines, gut dokumentiertes C-Werkzeug für Sicherheitsforscher.
Es erkennt, ob ein Linux-Host anfällig für die drei CVEs dieser Familie ist,
und führt — mit expliziter, getippter Bestätigung — einen echten
Proof-of-Concept aus, der den Aufrufer auf einem anfälligen System in eine Root-Shell bringt.
| CVE / Variante | Name | DIRTYFAIL-Abdeckung |
|---|---|---|
| **CVE-2026-31431** | Copy Fail (algif_aead `authencesn` page-cache write) | Erkennung + vollständiger PoC |
| **CVE-2026-43284 v4** | Dirty Frag — IPv4 xfrm-ESP page-cache write | Erkennung + vollständiger PoC |
| **CVE-2026-43284 v6** | Dirty Frag — IPv6 xfrm-ESP page-cache write (`esp6`) | Erkennung + vollständiger PoC |
| **CVE-2026-43500** | Dirty Frag — RxRPC page-cache write | Erkennung + vollständiger PoC |
| Copy Fail GCM variant | xfrm-ESP `rfc4106(gcm(aes))` page-cache write | Erkennung + vollständiger PoC |
**Bonus-Modi:**
- **`--scan --active`** — sentinel-STORE aktive Sonden. Standardmäßig meldet `--scan`
die Vorbedingungen pro CVE (Kernel, Module, LSM-Status) sowie eine aktive Sonde
der Copy-Fail-Primitive. Durch Hinzufügen von `--active` wird die
Sentineldaten-STORE-Sonde auf alle vier anderen Primitive (ESP v4,
ESP v6, RxRPC, GCM) erweitert: jede feuert den Kernel-Trigger gegen eine `/tmp`-Sentinel
und meldet VULNERABLE nur, wenn die Markierungsbytes tatsächlich landen.
Dies ist die einzige Möglichkeit, einen zurückportierten, gepatchten Kernel
(Vorbedingungen sagen anfällig, aber Sonde sagt intakt) von einem
ungepatchten zu unterscheiden, ohne den vollständigen Exploit auszuführen. `/etc/passwd` wird
nie berührt. Kalibriert den V6-STORE-Shift automatisch pro Kernel-Build.
- **`--exploit-backdoor`** — persistenter uid-0-Hintertür: längenangepasstes
Überschreiben einer `nologin`/`false`/`sync`-Zeile in `/etc/passwd` mit
`dirtyfail::0:0:<pad>:/:/bin/bash`. Überlebt Shell-Exit, bis die Seite
ausgelagert wird. Zustand wird in `/var/tmp/.dirtyfail.state` für
`--cleanup-backdoor` gespeichert. Der Benutzername `dirtyfail` ist bewusst auf
dieses Projekt abgestimmt, sodass er in jedem Audit sofort identifizierbar ist —
ändern Sie `NEW_USER` in `src/backdoor.c`, falls Sie für einen autorisierten
Red-Team-Einsatz einen anderen Bezeichner benötigen.
- **AppArmor-Bypass** — besiegt Ubuntus
`apparmor_restrict_unprivileged_userns=1`-Richtlinie über einen einstufigen
`change_onexec("crun")`-Neuaufruf in ein uneingeschränktes Profil, das
userns-Fähigkeiten behält. Jeder Exploit-Modus behandelt dies
intern über einen Fork: Elternprozess bleibt im Init-Namespace, Kindprozess
führt den Bypass-Tanz aus, Elternprozess liest den globalen Page-Cache und führt `su` für
echte Init-Ns-Root aus. Das Legacy-Flag `--aa-bypass` existiert noch für das
Debuggen der Bypass-Mechanik in Isolation. Siehe [§8.5 Architektur](#85-architecture-outerinner-fork-based-bypass).
## Verifiziert auf folgenden Systemen
DIRTYFAIL wurde **empirisch Ende-zu-Ende validiert** auf mehreren
Distributionen und Kernel-Versionen. Die Matrix unten zeigt pro Modus die
Testergebnisse aus der Ausführung jedes `--exploit-*`-Modus gegen eine Neuinstallation
jeder Distribution.
| Distribution | Kernel | LSM | Copy Fail | xfrm-ESP v4 | xfrm-ESP v6 | RxRPC | GCM | Backdoor | SU-Shellcode |
|---|---|---|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| Ubuntu 24.04 LTS | `6.8.0-111-generic` | AppArmor | 🛡² | ✅ | ✅ | ✅ | ✅¹ | ✅¹ | (nicht getestet) |
| Debian 13.4 | `6.12.86+deb13` | none | 🛡 | 🛡 | 🛡 | 🛡 | 🛡 | 🛡 | 🛡⁵ |
| AlmaLinux 10.1 | `6.12.0-124.8.1.el10_1` | SELinux | ✅ | ✅ | ✅ | ⏭³ | ✅ | ✅ | ✅ |
| Fedora 44 (Server) | `6.19.10-300.fc44` | SELinux | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Ubuntu 26.04 LTS | `7.0.0-15-generic` | AppArmor (gehärtet) | 🛡 | 🛡⁴ | 🛡⁴ | 🛡⁴ | 🛡⁴ | 🛡⁴ | 🛡⁵ |
**Legende:** ✅ Exploit landete und erzeugte echte init-ns root · 🛡 gemildert — Exploit kann Kernel-Fehler nicht erreichen (Kernel gepatcht ODER LSM blockiert unprivilegierten Pfad) · ⏭ nicht zutreffend (Vorbedingung fehlt)
### Validierung der aktiven Sonden (`--scan --active`)
Das Flag `--active` fügt während der Erkennung eine Sentineldaten-STORE-Sonde pro CVE
hinzu. Wir haben die Sondenergebnisse gegen dieselben 4 Distributionen oben validiert
(Debian, Fedora, AlmaLinux, Ubuntu 26.04) — die Matrix unten zeigt
das Sondenurteil pro Modus und stimmt mit der Ground-Truth des vollständigen Exploits eins-zu-eins überein:
| Distribution | Copy-Fail-Sonde | ESP-v4-Sonde | ESP-v6-Sonde | RxRPC-Sonde | GCM-Sonde |
|---|:-:|:-:|:-:|:-:|:-:|
| Debian 13.4 | intakt 🛡 | intakt 🛡 | intakt 🛡 | intakt 🛡 | intakt 🛡 |
| Fedora 44 | Marker @0 ✅ | STORE @0 ✅ | STORE @8 ✅ | Byte-Änderung ✅ | sentinel[0] 0x41→0x27 ✅ |
| AlmaLinux 10.1 | Marker @0 ✅ | STORE @0 ✅ | STORE @8 ✅ | Vorbedingungen ⏭ | Sentinel geändert ✅ |
| Ubuntu 26.04 | intakt 🛡 | LSM-blockiert 🛡 | LSM-blockiert 🛡 | LSM-blockiert 🛡 | LSM-blockiert 🛡 |
Der STORE-Landeoffset der V6-Sonde (8 auf Fedora und Alma) entspricht dem empirischen
`V6_STORE_SHIFT`, das `calibrate_v6_shift()` zur Laufzeit ermittelt — was bestätigt,
dass die automatische Kalibrierung die zuvor hartcodierte Konstante korrekt über
Kernel-Builds hinweg ersetzt.
¹ GCM und Backdoor erfordern, dass `algif_aead` ladbar ist. Ubuntu 24.04
liefert `/etc/modprobe.d/disable-algif_aead.conf` mit, das es als
Copy-Fail-Mitigation blacklistet. Wenn die Blacklist entfernt wird (z. B. auf einem
Kernel, der vor der Mitigation liegt), funktionieren beide Modi Ende-zu-Ende.
² Der algif_aead-Pfad von Copy Fail wird durch die modprobe-Blacklist gemildert;
die zugrunde liegende CVE-Primitive im Kernel ist dieselbe, ob `authencesn`
erreichbar ist oder nicht. xfrm-ESP, RxRPC und die GCM-Variante landen alle
auf demselben Kernel, da sie nicht über algif_aead gehen.
³ Das Paket `kernel-modules-extra` von AlmaLinux 10 wird bei einer
Minimalinstallation nicht standardmäßig installiert, daher fehlt `rxrpc.ko`
auf der Festplatte. Die Installation von `kernel-modules-extra-$(uname -r)` aus
EPEL oder dem AlmaLinux-Extras-Repo bringt das Modul zurück; bei einer reinen
Minimalinstallation ist RxRPC nicht erreichbar.
⁴ **Ubuntu 26.04 LTS blockiert umfassend die unprivilegierte Ausnutzung.**
Der ausgelieferte Kernel `7.0.0-15.15` (veröffentlicht am 22.04.2026)
**stammt aus der Zeit vor dem Hauptlinien-Patch `f4c50a4034e6` (zusammengeführt am
07.05.2026) um ~2 Wochen** — der Fehler ist also noch im Kernel vorhanden. Ubuntus
Verteidigung ist **Verteidigung in der Tiefe durch AppArmor-Härtung**, nicht ein
Kernel-Patch: