
# Ansible-Playbook zur Erkennung und Behebung von CVE-2026-31431 (Copy Fail) – Lokale Privilegienausweitung im Linux-Kernel
Kopierfehler-Erkennung und Behebung
Eine Ansible-Rolle und Playbook-Suite zur Erkennung und Behebung von CVE-2026-31431 (Copy Fail), einer kritischen lokalen Privilegienausweitung-Schwachstelle im algif_aead-Modul des Linux-Kernels.
🔗 GitHub: https://github.com/parmstro/cfDr
Der Name cfDr ist ein Wortspiel mit „Copy Fail Doctor“ – Ihr vertrauenswürdiges Mittel gegen CVE-2026-31431.
CVE-2026-31431 (CVSS 7.8) ist ein Logikfehler in der AEAD-Socket-Schnittstelle (AF_ALG) des Linux-Kernels, der 2026 entdeckt wurde. Die Schwachstelle ermöglicht es jedem nicht privilegierten lokalen Benutzer, innerhalb von Sekunden Root-Rechte zu erlangen.
algif_aead-Kernelmodul (AF_ALG-Krypto-Schnittstelle)Kernel-Versionen: Linux-Kernel >= 4.10 (veröffentlicht 2017)
Betroffene Distributionen:
Hinweis: Jede Linux-Distribution mit Kernel 4.10 oder neuer ist potenziell verwundbar.
Diese Schwachstelle ist besonders gefährlich, weil:
Sobald ein Angreifer irgendeine Form von lokalem Zugriff hat (SSH, Web-Shell, Container-Escape usw.), kann er:
Während auf vom Hersteller bereitgestellte Kernel-Patches gewartet wird, stehen mehrere Abschwächungsstrategien zur Verfügung. cfDr implementiert alle davon, mit intelligenten Empfehlungen basierend auf Ihrer Systemkonfiguration.
Nicht alle Behebungen sind gleichwertig. Hier ist, was Sie wissen müssen:
| Methode | Kann Root umgehen? | Abdeckung | Enterprise-Linux-Unterstützung |
|---|---|---|---|
| Modul-Blacklist | ✅ Ja (über insmod) | Verhindert modprobe-Laden | Alle Versionen |
| SELinux-Richtlinie | ❌ NEIN (LSM-Ebene) | Nur konfigurierte Domänen | Alle Versionen (Standard) |
| systemd seccomp | ❌ NEIN (Syscall-Filter) | Nur konfigurierte Dienste | Alle Versionen |
| eBPF LSM | ❌ NEIN (LSM-Ebene) | Systemweit (falls konfiguriert) | RHEL 9+, Fedora 34+ |
cfDr's Standardempfehlung: Flag 3 (Modul-Blacklist + SELinux)
Dies bietet zwei unabhängige Schutzebenen:``` ┌─────────────────────────────────────────────────┐ │ Layer 1: Module Blacklist │ │ • Prevents modprobe algif_aead │ │ • Persists across reboots │ │ • CAN be bypassed by malicious root (insmod) │ ├─────────────────────────────────────────────────┤ │ Layer 2: SELinux Policy │ │ • Blocks AF_ALG socket() at syscall level │ │ • Works even if module is loaded │ │ • CANNOT be bypassed from userspace │ │ • Covers user_t, unconfined_t (majority cases) │ └─────────────────────────────────────────────────┘
Result: If either layer fails, the other still protects
### Warum eine Modul-Blacklist allein nicht ausreicht
Ein entschlossener Angreifer mit Root-Zugriff kann die Modul-Blacklist umgehen:```bash
# Module blacklist DOES NOT prevent:
insmod /lib/modules/$(uname -r)/kernel/crypto/algif_aead.ko.xz
Dies ist jedoch akzeptabel, weil:
Für vollständigen, nicht umgehbaren Schutz benötigen Sie:
Modul-Blacklist + mindestens eines von:
cfDr verwendet bitweise Flags, um mehrere Minderungen zu aktivieren:
| Flag-Wert | Aktivierte Minderungen | Anwendungsfall |
|---|---|---|
| 1 | Nur Modul-Blacklist | Minimaler Schutz, Systeme ohne SELinux |
| 2 | Nur SELinux | Nur-SELinux-Umgebungen |
| 3 | Modul-Blacklist + SELinux | EMPFOHLENE Standardeinstellung |
| 5 | Modul-Blacklist + seccomp | Nicht-SELinux mit Dienst-Härtung |
| 7 | Modul-Blacklist + SELinux + seccomp | Erweiterter Schutz |
| 15 | Alle Minderungen | Maximaler Schutz (nur RHEL 9+) |
Flags berechnen: 1 (Blacklist) + 2 (SELinux) + 4 (seccomp) + 8 (eBPF) = Summe
SELinux-Schutz:
user_t, unconfined_t, httpd_t, postgresql_t, mysqld_tuser_t und unconfined_t die überwiegende Mehrheit der Angriffsszenarien absystemd seccomp-Schutz:
httpd, nginx, postgresql, mariadb, redis, memcachedeBPF-LSM-Schutz:
cfDr führt eine umfassende Bewertung über mehrere Dimensionen hinweg durch:
uname -r
- Ermittelt, ob die Kernel-Version >= 4.10 ist (verwundbarer Bereich)
- Identifiziert Kernel-Release und Distribution
#### 2. Prüfung der Modulverfügbarkeit```bash
modinfo algif_aead
algif_aead im Kernel vorhanden istlsmod | grep algif_aead
- Ermittelt, ob das Modul derzeit geladen ist
- **Kritisch**: Geladenes Modul = aktiv ausnutzbar
#### 4. Aktive Socket-Erkennung```bash
lsof -U | grep AF_ALG