
# Lokaler Privilege-Escalation-Exploit für CVE-2026-31431 Lokaler Privilege-Escalation-Exploit für CVE-2026-31431, eine Linux-Kernel-AF_ALG- + splice-page-cache-Überschreibung. Enthält PoC, BPFtrace-Erkennungsskript und QEMU-Testumgebung für autorisierte Sicherheitsforschung.
Linux-Kernel-Lokale-Privilegieneskalation via AF_ALG + splice Page-Cache-Überschreibung
Nur für autorisierte Sicherheitsforschung, Penetrationstests und Bildungszwecke. Verwenden Sie dies nicht gegen Systeme, die Sie nicht besitzen oder für die Sie keine ausdrückliche schriftliche Genehmigung zum Testen haben.
CVE-2026-31431 ist eine lokale Privilegieneskalations-Schwachstelle (LPE) im Linux-Kernel. Ein
nicht privilegierter lokaler Benutzer kann Root-Zugriff erlangen, indem er die AF_ALG-Socket-Schnittstelle mit
splice() kombiniert, um einen authentifizierten Schreibvorgang direkt in eine Page-Cache-Seite durchzuführen, die zu einer
setuid-Binärdatei gehört.
Der Exploit überschreibt die su-Binärdatei im Page-Cache, ohne den On-Disk-Inode zu verändern,
wodurch Integritätsmechanismen umgangen werden, die sich ausschließlich auf Dateimetadaten oder Block-Level-Prüfsummen verlassen.
.
├── exploit.py # PoC — Page-Cache-Überschreibung und Privilegieneskalation
├── detect.bt # BPFtrace-Skript für Echtzeiterkennung
├── run-vm.sh # QEMU-Testumgebungsautomatisierung (optional)
├── PAYLOAD.md # Payload-Kodierungsanalyse (hex → zlib → ELF → shellcode)
└── LICENSE
Führen Sie exploit.py als nicht privilegierter lokaler Benutzer auf einem beliebigen verwundbaren System aus — kein sudo erforderlich:
python3 exploit.py
Das Skript führt die folgenden Schritte aus:
AF_ALG (algif_aead) und lokalisiert die su-Binärdatei.su-Binärdatei als rohen Dateideskriptor und überschreibt deren Page-Cache-Seiten via
AF_ALG + sendfile.Unterstützte Architekturen:
Überwachen Sie Exploit-Versuche in Echtzeit mit detect.bt. Erfordert Root-Rechte:
sudo bpftrace detect.bt
# oder
doas bpftrace detect.bt
Das Skript verfolgt drei Indikatoren pro PID mithilfe einer Bitmaske in @suspect[pid]:
Ein Alarm wird ausgelöst, wenn alle drei Bits gesetzt sind (@suspect[pid] == 0x7) auf derselben PID.
exploit.pyAF_ALG/algif_aead-Moduldetect.btbpftrace ≥ 0.12# Ubuntu/Debian
sudo apt install bpftrace
# RHEL/CentOS/Fedora
sudo dnf install bpftrace
# Amazon Linux
sudo yum install bpftrace
# SUSE
sudo zypper install bpftrace
# Alpine
sudo apk add bpftrace
Aktualisieren Sie das Kernel-Paket Ihrer Distribution auf eine Version, die den Mainline-Commit
a664bf3d603d enthält,
der die In-Place-Optimierung von algif_aead aus dem Jahr 2017 zurücknimmt, sodass Page-Cache-Seiten nicht mehr
in der beschreibbaren Ziel-Scatterlist landen können. Die meisten großen Distributionen liefern den Fix inzwischen aus.
algif_aead deaktivieren (während auf einen Patch gewartet wird)blacklist kann mit einem expliziten modprobe algif_aead umgangen werden. Die Direktive install .../bin/false
überschreibt den Installationsbefehl vollständig, sodass jeder Ladeversuch fehlschlägt:
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf
sudo rmmod algif_aead 2>/dev/null || true
Die Subsysteme in der Zeile „Nein" verwenden die In-Kernel-Krypto-API direkt — sie laufen nie über
AF_ALG. Die Leistung fällt auf normale Userspace-Kryptobibliotheken zurück, was ohnehin fast alles andere bereits verwendet.
Um zu prüfen, ob auf Ihrem System vor der Deaktivierung etwas AF_ALG aktiv nutzt:
lsof | grep AF_ALG
ss -xa | grep alg
Verweigern Sie die Erstellung von socket(AF_ALG, ...) für nicht vertrauenswürdige Workloads unabhängig vom Patch-Status. Fügen Sie
AF_ALG (Familie 38) zu Ihrer seccomp-Deny-Liste hinzu oder verwenden Sie eine AppArmor/SELinux-Richtlinie, die
socket-Aufrufe für nicht privilegierte Prozesse einschränkt.
detect.btStellen Sie das enthaltene Erkennungsskript auf jedem Host bereit, der nicht sofort gepatcht oder abgesichert werden kann. Es alarmiert bei jedem Prozess, der die vollständige dreistufige Exploit-Primitive ausführt.
run-vm.sh automatisiert die Erstellung einer Ubuntu-24.04-QEMU-VM für Tests in einer kontrollierten
Umgebung. exploit.py und detect.bt laufen direkt auf jedem verwundbaren Host — QEMU ist
nicht erforderlich.
| Abhängigkeit | Hinweise |
|---|---|
qemu-system-x86_64 + KVM | Siehe Installationsbefehle unten |
wget oder curl | Cloud-Image-Download |
cloud-image-utils | Seed-Image-Generierung (Docker kann auf Nicht-Debian-Hosts ersetzen) |
# Ubuntu/Debian
sudo apt install qemu-system-x86 cloud-image-utils wget
# Fedora/RHEL
sudo dnf install qemu-system-x86 wget
# Arch
sudo pacman -Sy qemu
# Alpine
sudo apk add qemu-system-x86 qemu-ui-gtk wget
sh run-vm.sh
1. VM starten/erstellen
2. Per SSH verbinden
3. Dateien in die VM hochladen (exploit.py, detect.bt)
4. Exploit in der VM ausführen
5. detect.bt in der VM ausführen
6. VM-Status prüfen
7. VM stoppen
8. VM-Dateien bereinigen
0. Beenden
| Feld | Wert |
|---|---|
| Benutzer | ubuntu |
| Passwort | cve123 |
| SSH-Port | 2222 |
crypto/af_alg.c — Kernel-Quellcodemm/splice.c — Kernel-QuellcodeDieses Projekt ist unter der GNU General Public License v3.0 oder später lizenziert. Siehe LICENSE für den vollständigen Text.
Haftungsausschluss: Dieses Repository wird nur für autorisierte Sicherheitsforschung, Penetrationstests und Bildungszwecke bereitgestellt. Die Autoren übernehmen keine Haftung für Missbrauch oder Schäden, die durch diese Software verursacht werden.
| Feld | Wert |
|---|
| CVE-ID | CVE-2026-31431 |
| Typ | Lokale Privilegieneskalation (LPE) |
| CVSS-v3.1-Score | 7.8 Hoch — AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H (Quelle: kernel.org) |
| Kernel-Subsysteme | crypto/af_alg.c, mm/splice.c |
| Angriffsvektor | Lokal — nicht privilegiertes Benutzerkonto erforderlich |
| Grundursache | algif_aead akzeptiert sendfile() über einen AEAD-Socket, ohne Copy-on-Write-Semantik auf der zugeordneten Page-Cache-Seite vor Abschluss der Übertragung durch splice() durchzusetzen |
| Distribution | Kernel-Version | Arch |
|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws | x86_64 |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 | x86_64 |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 | x86_64 |
| SUSE 16 | 6.12.0-160000.9-default | x86_64 |
| Raspberry Pi OS (Pi 5) | 6.12.75+rpt-rpi-2712 | aarch64 |
| Architektur | Varianten |
|---|
| x86_64 | — |
| aarch64 | — |
| riscv64 | — |
| ppc64le | — |
| arm | armv5l, armv6l, armv7l |
| x86 32-Bit | i386, i486, i586, i686 |
| MIPS 64-Bit | mips64, mips64el |
| LoongArch | loong64, loongarch64 |
| s390x | — |
| Bit | Syscall | Indikator |
|---|
0x1 | socket(AF_ALG, SOCK_SEQPACKET) | AF_ALG-Socket erstellt |
0x2 | setsockopt(SOL_ALG, ...) | Krypto-Operation konfiguriert |
0x4 | sendmsg(MSG_MORE) + splice() | Page-Cache-Überschreibung versucht |
| Betroffen? | Subsystem/Anwendungsfall |
|---|
| Nein | dm-crypt/LUKS, kTLS, IPsec/XFRM, In-Kernel-TLS |
| Nein | OpenSSL, GnuTLS, NSS-Standardbuilds |
| Nein | SSH, Kernel-Keyring-Krypto |
| Vielleicht | OpenSSL mit explizit aktivierter afalg-Engine |
| Vielleicht | Eingebettete Krypto-Offload-Pfade oder Apps, die aead/skcipher/hash-Sockets direkt binden |