
# 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.
| 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 |
.
├── 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:
| 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 | — |
Ü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]:
| 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 |
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