
Rust-Exploit für CVE-2026-31431, eine Linux-Kernel-Page-Cache-Schreibprimitive über AF_ALG-Splice, die eine Privilegieneskalation zu Root durch Patchen von /etc/passwd oder Shellcode-Ausführung ermöglicht.
Rust-Implementierung von CVE-2026-31431 (Copy Fail) — eine Linux-Kernel-Page-Cache-Schreibprimitive über AF_ALG splice.
Die algif_aead-Implementierung des Linux-Kernels erlaubt es einem unprivilegierten Benutzer, beliebige Daten über den splice()-Syscall in den Page-Cache einer beliebigen lesbaren Datei zu schreiben. Der AEAD-Algorithmus authencesn schreibt seqno_lo (benutzergesteuerte AAD-Bytes 4-7) bei Offset assoclen + cryptlen in die Ziel-Scatterlist, was — wenn über splice() mit Page-Cache-Seiten verkettet — zu einem beliebigen 4-Byte-Schreibzugriff führt. Der Inhalt auf der Festplatte bleibt unverändert, aber alle nachfolgenden Leser sehen beschädigte Page-Cache-Daten.
Betroffene Kernel: Linux < 6.12.23, < 6.13.11, < 6.14.2
1. --uid — Setzt das UID-Feld des aktuellen Benutzers über einen Page-Cache-Schreibzugriff in /etc/passwd auf 0000. Nach dem Patchen liefert su <benutzername> mit dem eigenen Passwort eine Root-Shell. Das Tool versucht, den Page-Cache nach der Authentifizierung und vor dem Start der Shell zu leeren, was die Wahrscheinlichkeit verringert, dass SSH das Konto weiterhin als UID 0 sieht. Keine Änderung des Root-Passworts erforderlich. Funktioniert für jede 4-stellige UID (1000-9999).
2. --escalate — Patcht die Root-Zeile in /etc/passwd über einen Page-Cache-Schreibzugriff: root:x:0:0:root:... → root::0:0:root :.... Das Kommentarfeld wird mit Leerzeichen aufgefüllt, um die Zeilenlänge identisch zu halten. Nach dem Patchen funktioniert su root ohne Passwort.
3. --set-password — Eskaliert zuerst (entfernt das Root-Passwort), liest dann das neue Passwort von stdin und wendet es mit chpasswd an.
4. Standardmodus (keine Flags) — Überschreibt den Page-Cache der su-Binärdatei mit architekturspezifischen Shellcode-Payloads (x86_64, x86, aarch64) und führt dann su aus, um eine Root-Shell zu erhalten.
cargo build
cargo build --release
cargo test
cargo clippy
./copyfail-rs --check
./copyfail-rs --uid
./copyfail-rs --escalate
printf '%s\n' 'meinpasswort' | ./copyfail-rs --set-password
./copyfail-rs --backup /tmp/su.bak
./copyfail-rs --exec /bin/bash
Page-Cache-Änderungen sind flüchtig — das Leeren des Caches stellt den ursprünglichen Inhalt auf der Festplatte wieder her:
echo 3 > /proc/sys/vm/drop_caches
Dieses Projekt dient ausschließlich autorisierten Sicherheitstests und Bildungszwecken.
| Flag | Beschreibung |
|---|
--check | Sicherer Preflight: untersucht das aufgelöste su-Ziel und beendet sich |
--escalate | Patcht /etc/passwd im Page-Cache, um das Root-Passwort zu entfernen, dann su root |
--set-password | Zuerst eskalieren, dann ein neues Root-Passwort von stdin lesen und über chpasswd anwenden |
--uid | Setzt die UID des aktuellen Benutzers in /etc/passwd auf 0, dann su <benutzername> |
--backup <pfad> | Sichert die su-Binärdatei vor dem Überschreiben |
--exec <pfad> | Führt nach dem Überschreiben einen bestimmten Befehl als Root aus |
| Betriebssystem | Kernel | Ergebnis |
|---|
| Ubuntu 22.04.2 LTS | 6.8.0-87-generic | --escalate bestanden, --set-password bestanden, --uid bestanden |
| Ubuntu 22.04.2 LTS | 6.8.0-107-generic | --escalate bestanden, --uid bestanden |
| Ubuntu 25.10 | 6.17.0-5-generic | splice EINVAL, Kernel gepatcht |
| Ubuntu 25.10 | 6.17.0-8-generic | --uid bestanden |
| Alpine Linux edge | 6.19.12 | Exploit läuft, Page-Cache-Schreibzugriff durch Kernel-Fix blockiert |