
Exploit und Detektor für eine lokale Privilegieneskalation im Linux-Kernel (CVE-2026-31431), die den Page Cache korrumpiert, um Root-Rechte zu erlangen, mit Hinweisen zur Abschwächung.
Ein kritischer 9 Jahre alter Fehler im Linux-Kernel, der in Sekunden Root-Zugriff ermöglicht
| Attribut | Details |
|---|---|
| CVE | CVE-2026-31431 |
| Spitzname | Copy Fail |
| Typ | Lokale Privilegieneskalation (LPE) |
| CVSS | 7.8 (Hoch) |
| Entdeckt von | Theori (Xint Code) |
| Offenlegung | 29. April 2026 |
| Komponente | algif_aead-Subsystem des Linux-Kernels |
Fehler in der 2017 eingeführten Optimierung für "In-Place"-Operationen (Commit 72548b093ee3). Erlaubt einem lokalen Benutzer, einen kontrollierten 4-Byte-Schreibvorgang direkt in den Page Cache des Kernels durchzuführen.
AF_ALG-Schnittstelle, um auf kryptografische Algorithmen des Kernels zuzugreifen/usr/bin/su) oder sensiblen Dateien (/etc/passwd)Es ist ein logischer Designfehler, kein Speicherüberlauf. Es erforderte eine tiefgehende Analyse des kryptografischen Subsystems, um es zu entdecken.
# Ubuntu/Debian
sudo apt update
sudo apt upgrade
sudo reboot
# RHEL/AlmaLinux/Rocky
sudo dnf update kernel
sudo reboot
# Kernel-Version prüfen
uname -r
⚠️ Ein Neustart ist zwingend erforderlich, um den neuen Kernel zu aktivieren.
# Laden des verwundbaren Moduls deaktivieren
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/copyfail_mitigation.conf
# Modul entladen, falls bereits in Verwendung
sudo rmmod algif_aead
# Das Modul ist normalerweise in den Kernel integriert
# Boot-Parameter hinzufügen, um es zu deaktivieren
sudo grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
# Neustart, um Änderungen anzuwenden
sudo reboot
# Page Cache im laufenden Betrieb leeren
sudo sysctl -w vm.drop_caches=3
⚠️ Hinweis: Dies ersetzt den Patch nicht. Es ist nur eine ergänzende Maßnahme.
| Datum | Ereignis |
|---|---|
| 29. April | Öffentliche Offenlegung durch Theori |
| 1. Mai | Erste Versuche aktiver Ausnutzung erkannt |
# Kernel-Version abrufen
uname -r
# Verwundbar, wenn:
# - v4.14 bis v7.0-rc (veröffentlicht zwischen 2017 und April 2026)
# - Enthält Commit 72548b093ee3
# Prüfen, ob das Modul algif_aead geladen ist
lsmod | grep algif_aead
# Wenn es in der Liste erscheint, ist Ihr System verwundbar
Eine KI identifizierte diesen Fehler, der den Entwicklern 9 Jahre lang entgangen war. Dies markiert einen Wendepunkt:
# 1. Detect
python3 prueba.py
# exit 0 = not vulnerable, 2 = vulnerable, 1 = test error
# 2. Exploit (interactive — su will prompt for your own password)
python3 exploit.py --shell
python3 prueba.py
Was es tut:
Bestätigt, dass AF_ALG und der Algorithmus authencesn(hmac(sha256),cbc(aes))
von einem Prozess ohne Privilegien zugänglich sind.
Erstellt eine 4-KiB-Sentinel-Datei in einem temporären Verzeichnis und füllt den Page Cache.
Sendet 8 Bytes AAD inline über sendmsg+cmsg mit seqno_lo, gesetzt auf
die Markierung PWND, und kopiert dann 32 Bytes von der Page-Cache-Seite der Sentinel-Datei in den AF_ALG-Operations-Socket über os.splice().
Ruft recv() auf, um die Entschlüsselung zu starten. Die Authentifizierungsprüfung schlägt mit
EBADMSG fehl; der temporäre Schreibvorgang wird trotzdem ausgeführt.
Liest die Datei erneut (Page Cache, nicht Festplatte) und sucht nach der Markierung.
Ausgabeklassen:
Precondition not met: AF_ALG oder authencesn nicht verfügbar. Exit 0.VULNERABLE to CVE-2026-31431: Die Markierung PWND wurde in die modifizierte Seite eingefügt.Exit 2.
Page cache MODIFIED via in-place AEAD insertion path: Es wurde in die Seite geschrieben,
aber die Markierung wurde nicht an der erwarteten Position eingefügt.
Als verwundbar behandeln. Exit 2.Page cache intact: Gepatcht. Exit 0.Der Detektor modifiziert niemals /usr/bin/su, /etc/passwd oder andere Dateien außerhalb des temporären Verzeichnisses, das er erstellt, und diese Datei wird beim Beenden gelöscht.
Exit. ## LPE usage
python3 exploit_cve_2026_31431.py # Nur patchen, nächste Schritte ausgeben
python3 exploit_cve_2026_31431.py --shell # Patchen und `su <benutzer>` ausführen
Funktion:
/etc/passwd und findet denByte-Offset des 4-Zeichen-UID-Felds.
write4 auf diesen Offset aus und ersetzt die UID durch0000.
pwd.getpwnam(benutzer) auf, um zu bestätigen, dass libc nun UID 0 meldet.--shell führt es execvp("su", ["su", benutzer]) aus. Gib dein eigenes
Passwort ein. PAM validiert gegen /etc/shadow (unverändert), dannwird setuid(getpwnam(user).pw_uid) auf 0 gesetzt.
erfordern Multi-Shot-Schreibvorgänge; erweitern Sie write4 entsprechend.
Kein NSS-Cache-Daemon (nscd, sssd, systemd-userdbd) maskiert
die Lesevorgänge von /etc/passwd. Wenn getpwnam nach dem
Anwenden des Patches immer noch die echte UID zurückgibt, starten Sie neu oder ignorieren Sie den Cache, oder wählen Sie einen anderen Benutzer.
Die /etc/passwd-Seite muss zwischen dem Anwenden des Patches und der
Ausführung von su im Cache bleiben. In der Praxis ist dies auf jedem System mit normalem Speicherdruck zuverlässig.
Die Datei /etc/passwd auf der Festplatte bleibt unverändert.
Der Trockenlauf (exploit_cve_2026_31431.py ohne --shell) entfernt automatisch
die korrupte Seite beim Beenden über POSIX_FADV_DONTNEED, sodass UID → Name-Auflösungen
sofort wieder normal funktionieren.
Nach Verwendung von --shell** bleibt die Seite korrupt, bis sie gelöscht wird.
Solange sie korrupt ist, schlagen alle Operationen, die UID 1000 → Name auflösen (z. B. ls,
Dateimanager, scp/sftp-Eigentumsprüfungen), fehl oder zeigen numerische Kennungen. Zum Löschen:
# Ohne Privilegien: Entfernung der Page-Cache-Seite von /etc/passwd anfordern:
python3 -c "import os; fd=os.open('/etc/passwd', os.O_RDONLY); \
os.posix_fadvise(fd, 0, 0, os.POSIX_FADV_DONTNEED); os.close(fd)"
# Von der Root-Konsole:
echo 3 > /proc/sys/vm/drop_caches
Ein Neustart löscht es ebenfalls.
write4 funktioniertsendmsg([8 Bytes AAD], cmsg=[ALG_SET_OP=DECRYPT, ALG_SET_IV, ALG_SET_AEAD_ASSOCLEN=8],
flags=MSG_MORE)
splice(target_fd, pipe_w, 32, offset_src=file_offset)
splice(pipe_r, op_fd, 32)
recv(op_fd) # EBADMSG; der temporäre Schreibvorgang wurde bereits ausgeführt
Die 4 Bytes an den Positionen 4 bis 7 des AAD (seqno_lo) werden von
authencesn in die Ziel-Streuungsliste geschrieben, die in diesem Codepfad
die Page-Cache-Seite ist, die wir aus target_fd extrahiert haben. Der Lande-Offset
innerhalb der Seite entspricht dem offset_src, das wir an splice() übergeben haben.
Bis der gepatchte Kernel in Ihrer Distribution ankommt:
sudo tee /etc/modprobe.d/disable-algif-aead.conf <<<'install algif_aead /bin/false'
sudo rmmod algif_aead 2>/dev/null
Nach dem Anwenden des Patches sollte test_cve_2026_31431.py die Meldung «Precondition
not met» anzeigen und mit Exit-Code 0 beenden.
Die ursprüngliche Korrektur stellt In-Place-AEAD-Operationen auf Out-of-Place-Operationen um, wodurch Page-Cache-Seiten von modifizierbaren Streuungslisten ferngehalten werden.
algif_aead deaktivierenalgif_aeadLetzte Aktualisierung: 3. Mai 2026
Status: 🔴 KRITISCH - Sofortiges Handeln erforderlich
| 2. Mai | CISA ordnet US-Bundesbehörden an, vor dem 15. Mai zu patchen |
| 3. Mai | Patches verfügbar für Ubuntu, RHEL, AlmaLinux, Debian |
| Distribution | Status | Referenz |
|---|
| Ubuntu | ✅ Gepatcht | USN-8226-1 (20.04, 22.04, 24.04) |
| RHEL/AlmaLinux/Rocky | ✅ Verfügbar | Seit 1. Mai |
| Debian | ✅ In Sicherheits-Repositorien | Update verfügbar |
| Android | ⏳ In Kürze | Sicherheitsbulletin Juni 2026 |