
Mehrsprachige pädagogische Exploit-Implementierungen für CVE-2026-31431, eine lokale Privilegieneskalation im Linux-Kernel über das algif_aead-Modul, mit einem sicheren Detektor und CTF-Nutzungsanleitung.
Lehr-Repository mit Implementierungen des Copy-Fail-Exploits in mehreren Sprachen.
Erstellt und gepflegt von @shotafry — denn das Lesen des CVE reicht nicht. Man muss es reproduzieren.
Copy Fail ist eine lokale Privilegieneskalations-Schwachstelle (LPE) im Linux-Kernel, katalogisiert als CVE-2026-31431. Sie betrifft das kryptografische Subsystem des Kernels, konkret das Modul algif_aead, das authentifizierte Verschlüsselungsoperationen (AEAD) über AF_ALG-Sockets verwaltet.
Der Fehler wurde 2017 in einer Optimierung des Moduls authencesn eingeführt und blieb fast 9 Jahre lang unentdeckt — vorhanden in praktisch allen modernen Linux-Distributionen.
Was Copy Fail im Vergleich zu anderen historischen LPEs besonders macht:
| Eigenschaft | Copy Fail | Typischer LPE |
|---|---|---|
| Benötigt Race Condition | ❌ Nein | ✅ Ja |
| Benötigt spezifischen Kernel-Offset | ❌ Nein | ✅ Ja |
| Funktioniert auf allen Distros | ✅ Ja | ❌ Normalerweise nicht |
| Zuverlässigkeit | 100 % deterministisch | Variabel |
| Modifiziert den Datenträger | ❌ Nein (nur RAM) | Kommt darauf an |
Die Schwachstelle wurde von Taeyang Lee vom Forschungsteam von Theori entdeckt. Die vollständige Exploit-Kette wurde vom Team Xint Code Research entwickelt, das den Prozess mithilfe von KI-gestützter Analyse des crypto/-Subsystems des Linux-Kernels dokumentierte.
Die öffentliche Offenlegung umfasst funktionalen PoC, vollständige technische Analyse und Dokumentation auf copy.fail.
CVE: CVE-2026-31431
CVSS: 7.8 — HOCH
Vektor: Lokal
Auswirkung: Vollständige Privilegieneskalation (root)
Distros: Alle Linux-Distributionen mit Kernel >= 2017 ohne Patch
Der CVSS-Wert beträgt 7.8 und erreicht nur deshalb nicht kritisch (9+), weil vorheriger lokaler Zugriff erforderlich ist — der Angreifer muss bereits eine Sitzung auf dem System haben. In Cloud-Umgebungen und mit Docker-Containern ist diese Anforderung erheblich einfacher zu erfüllen, als es scheint.
Der Linux-Kernel speichert kürzlich gelesene Dateien im RAM. Dies nennt man Page Cache. Wenn ein Prozess /etc/passwd liest, geht der Kernel nicht auf den Datenträger — er liefert die Kopie aus dem RAM. Das ist schneller, schafft aber eine Angriffsfläche: Wenn du diese Kopie im RAM ändern kannst, ohne den Datenträger zu berühren, sieht das System gefälschte Daten.
Das Modul algif_aead ermöglicht AEAD-Operationen aus dem Userspace über AF_ALG-Sockets. Der Bug liegt in der 2017 eingeführten Optimierung: Wenn splice() verwendet wird, um Seiten einer Datei an den Socket zu übergeben, landen diese Seiten des Page Cache in der Ziel-Scatterlist (beschreibbar) der kryptografischen Operation.
Ergebnis: Jeder Benutzer ohne Privilegien kann 4 kontrollierte Bytes in jede Datei schreiben, die er lesen kann, ohne den Datenträger zu berühren.
Benutzer ohne Privilegien
│
▼
Öffnet AF_ALG-Socket (authencesn)
│
▼
sendmsg() — AEAD-Parameter mit unseren 4 Bytes in seqno_lo
│
▼
splice() — Datei → Pipe → Socket op
[BUG] Der Page Cache der Datei landet in der Ziel-Scatterlist
│
▼
recv() löst die AEAD-Operation aus
Die Auth schlägt fehl (EBADMSG), aber der Scratch-Write ist bereits passiert
│
▼
/etc/passwd (Page Cache) sagt jetzt: Benutzer → UID 0
│
▼
su <benutzer> → PAM validiert echtes Passwort → setuid(0) → ROOT
Stell dir vor, der Kernel hat ein Schlossregister (/etc/passwd). Copy Fail ist, als würdest du entdecken, dass das Schlossregister versehentlich auf deinem Arbeitstisch liegen bleibt, wenn du die Magiewerkstatt des Schlosses in einer ganz bestimmten Reihenfolge öffnest — und du kannst deinen Rang von „einfacher Soldat" zu „König" mit einem Stift ändern. Der Archivar (PAM) prüft dein Passwort, prüft aber nicht das Originalregister, sondern nur die Kopie vor dir. Du bist König.

>= ~2017 ohne den Patch für CVE-2026-31431algif_aead verfügbar und ladbarDas kann man eigentlich überspringen und direkt einen der Exploits testen, aber es ist auch gültig, wenn wir kein Risiko eingehen wollen, sie hochzuladen oder zu erstellen, und nur sehen wollen, ob es funktioniert — aber die Exploits haben ihre eigene Funktion, um zu prüfen, ob das betreffende System verwundbar ist.
# Kernel-Version anzeigen
uname -a
# Prüfen, ob der Algorithmus verfügbar ist
grep -i authencesn /proc/crypto
# Prüfen, ob das Modul geladen ist
lsmod | grep alg
Wenn grep -i authencesn /proc/crypto authencesn(hmac(sha256),cbc(aes)) zurückgibt, ist das System verwundbar.
| Sprache | Anforderung am Ziel | Vorherige Kompilierung |
|---|---|---|
| C | Keine (statisches Binär) | gcc auf der Kompilierungsmaschine |
| Python | Python 3.10+ | Nein |
| Rust | Keine (statisches Binär) | rustc auf der Kompilierungsmaschine |
| Go | Keine (statisches Binär) | go auf der Kompilierungsmaschine |
| Ruby | Ruby + Gem fiddle (standardmäßig enthalten) | Nein |
| Perl | Perl 5 (praktisch auf jedem Linux enthalten) | Nein |
Dieses Repository enthält den Exploit in 6 Sprachen, alle funktional äquivalent, mit pädagogischen Kommentaren auf Spanisch.
copy_fail_exploit.c → C — statisches Binär, null Abhängigkeiten
copy_fail_exploit.py → Python — besser lesbar, ideal zum Lernen
copy_fail_exploit.rs → Rust — die Ironie: „sichere" Sprache explodiert Kernel
copy_fail_exploit.go → Go — statisches Binär, sehr portabel
copy_fail_exploit.rb → Ruby — allgegenwärtig auf Rails-Servern
copy_fail_exploit.pl → Perl — der leiseste, auf jedem Linux vorhanden
test_cve_2026_31431.py → Detektor — prüft Verwundbarkeit, ohne etwas zu explodieren