
Forschungs- und Erkennungs-Toolkit für Linux-Kernel-LPE CVE-2026-31431, einschließlich Exploit-Analyse, YARA-Regeln, auditd/Falco-Erkennung, Patch-Anleitung und Laborumgebung.
algif_aeadCISA KEV | CVSS 7.8 HOCH | Betrifft Linux-Kernel 4.14 – Anfang 2026 (~9 Jahre)
CVE-2026-31431, mit dem Spitznamen „Copy Fail“, ist eine Schwachstelle mit hohem Schweregrad zur lokalen Rechteausweitung (LPE) im kryptografischen Subsystem des Linux-Kernels. Ein lokaler Benutzer mit niedrigen Privilegien kann auf jedem ungepatchten System in Sekunden Root-Rechte erlangen.
| Attribut | Wert |
|---|---|
| CVE | CVE-2026-31431 |
| Spitzname | Copy Fail |
| CVSS v3.1 | 7.8 HOCH |
| Angriffsvektor | Lokal |
| Erforderliche Privilegien | Niedrig |
| Benutzerinteraktion | Keine |
| Komponente | crypto/algif_aead.c — authencesn-Vorlage |
| Eingeführt | 2017 (Commit 72548b093ee3) |
| Offengelegt | 2026 |
| Jahre unentdeckt | ~9 Jahre |
| CISA KEV | Ja |
| Öffentlicher PoC | Ja (732-Byte eigenständiges Python-Skript) |
detection/check_vulnerable.sh vor und nach der Behebung aus.CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
| Metrik | Wert | Begründung |
|--------|-------|-----------|
| Angriffsvektor | **Lokal** | Erfordert Shell-Zugriff (SSH, Container-Exec, physisch) |
| Angriffskomplexität | **Niedrig** | Zuverlässig, vollständig automatisiert — kein Race Condition erforderlich |
| Erforderliche Privilegien | **Niedrig** | Jedes unprivilegierte Benutzerkonto |
| Benutzerinteraktion | **Keine** | Keine Interaktion mit dem Opfer erforderlich |
| Vertraulichkeit | **Hoch** | Vollständige Systemkompromittierung |
| Integrität | **Hoch** | Vollständige Systemkompromittierung |
| Verfügbarkeit | **Hoch** | Vollständige Systemkompromittierung |
### Bedrohungslage
| Faktor | Bewertung |
|--------|-----------|
| PoC-Verfügbarkeit | Öffentlich, weaponized, 732 Byte eigenständiges Python |
| Exploit-Zuverlässigkeit | Hoch — funktioniert auf getesteten Distributionen ohne Modifikation |
| Erkennungsschwierigkeit | Hoch — keine Schreibvorgänge auf der Festplatte, keine Dirty Pages |
| Erforderliche Angreiferfähigkeiten | Niedrig — Script Kiddie mit öffentlichem PoC |
| CISA KEV | Hinzugefügt 2026 — aktiv überwacht |
| Microsoft Defender | Als unter aktiver Untersuchung markiert |
### Betroffene Umgebungen
| Umgebung | Risiko |
|-------------|------|
| Bare-Metal-Linux-Server | Kritisch |
| Linux-VMs (Cloud oder On-Premises) | Kritisch |
| Kubernetes-Knoten | Kritisch (ermöglicht auch Container-Escape) |
| Docker-Hosts | Kritisch |
| Shared Hosting / Multi-Tenant | Kritisch |
| WSL2 / Linux auf Windows | Je nach Kernel-Version bewerten |
---
## 3. Technischer Deep Dive
### 3.1 Hintergrund: AF_ALG und AEAD
Der Linux-Kernel stellt kryptografische Operationen über **AF_ALG-Sockets** (`AF_ALG = 38`) für Userspace-Anwendungen bereit. Diese Schnittstelle (`algif_aead`) erlaubt unprivilegierten Anwendungen, Kernel-Krypto-Hardwarebeschleuniger aufzurufen, ohne Kernel-Mode-Code zu benötigen.
**AEAD**-Algorithmen (Authenticated Encryption with Associated Data) wie AES-GCM und ChaCha20-Poly1305 werden häufig für TLS, Festplattenverschlüsselung und VPN-Protokolle verwendet. Die verwundbare Vorlage ist `authencesn` — eine AEAD-Komposition mit `hmac(sha256)` + `cbc(aes)` und Unterstützung für Extended Sequence Number (ESN), die üblicherweise in IPsec verwendet wird.
### 3.2 Grundursache
Im Jahr 2017 führte Commit `72548b093ee3` **In-Place-AEAD-Operationen** in `algif_aead` als Leistungsoptimierung ein — wodurch die Crypto-Engine denselben Puffer lesen und beschreiben konnte. Dies war fehlerhaft:```
The bug chain:
1. Caller binds AF_ALG socket to:
authencesn(hmac(sha256),cbc(aes))
2. Caller sends a decryption request via sendmsg() with specific flags
3. Caller uses splice() to feed PAGE CACHE PAGES from an open file
descriptor directly into the socket's scatterlist
4. The authencesn template, during ESN header processing, uses the
OUTPUT BUFFER as scratch space — writing 4 bytes past the
expected output boundary
5. Because the scatterlist contains page cache pages (not private
copies), this scratch write lands DIRECTLY IN THE PAGE CACHE
6. Page cache is shared kernel-wide — all processes reading the
same file now see the modified bytes
Key insight: splice() is zero-copy — it hands page cache references
to the socket. The in-place "optimization" then writes INTO those
pages. No dirty bit is set because the write goes through the crypto
engine, not the normal write path.
Die Schwachstelle ermöglicht einen kontrollierten 4-Byte-Schreibzugriff in den Page Cache jeder Datei, die der Angreifer zum Lesen öffnen kann:
| Eigenschaft | Wert |
|---|---|
| Schreibgröße | 4 Bytes |
| Offset-Kontrolle | Ja — vom Angreifer kontrollierbar über den splice-Offset |
| Ziel | Page Cache jeder lesbaren Datei |
| Markierung als „dirty" | Keine |
| Änderung auf der Festplatte | Keine |
| Zeitstempel-Aktualisierung | Keine |
| Kernel-Log-Eintrag | Keiner (sofern auditd nicht konfiguriert ist) |
Der Schreibzugriff ist wiederholbar — der Exploit schleift den 4-Byte-Schreibzugriff, um größere Codesequenzen zu patchen.
[1] Open /usr/bin/su (or any setuid-root binary) for reading ↓ [2] Map a copy to find target instruction bytes (e.g., UID check, execve path, security gate) ↓ [3] Compute exact page cache offset of target bytes ↓ [4] Set up AF_ALG socket → authencesn(hmac(sha256),cbc(aes)) ↓ [5] splice() the target binary's page cache into the socket ↓ [6] Trigger decryption → authencesn scratch write patches the target bytes in page cache (4 bytes per iteration) ↓ [7] Repeat for each 4-byte patch needed ↓ [8] Execute /usr/bin/su → runs root-owned setuid binary but now with attacker-controlled code in page cache ↓ [9] Root shell
### 3.5 Warum Standard-Abwehrmaßnahmen versagen