
CVE-2026-31431 (Copy Fail) neuartiger Exploit: Live-Code-Korruption über den Page Cache. Überschreibt den libc-exit()-Code durch MAP_PRIVATE-Seitenteilung – betrifft ALLE laufenden Prozesse.
Eine neuartige Exploitation-Technik für CVE-2026-31431 („Copy Fail"), die ausführbaren Code laufender Prozesse über den Page Cache des Linux-Kernels korrumpiert und so eine Root-Privilegieneskalation erreicht.
Alle veröffentlichten Exploits für diese CVE korrumpieren Datendateien — sie modifizieren /etc/passwd, um die UID von root zu ändern, oder patchen setuid-Binaries auf der Festplatte. Dieser Exploit tut etwas grundlegend anderes: Er korrumpiert lebenden ausführbaren Code im Speicher über den Page-Cache-Mechanismus des Kernels.
| Veröffentlichte Exploits | Dieser Exploit | |
|---|---|---|
| Ziel | Datendateien (/etc/passwd, /usr/bin/su) | Ausführbarer Code (libc .text-Sektion) |
| Mechanismus | Dateiinhalt, der von Programmen geparst wird | Codeseiten, die direkt von der CPU ausgeführt werden |
| Umfang | Einzelne Datei | ALLE Prozesse, die libc mappen |
| Änderung auf der Festplatte | Ja (Dateiinhalt modifiziert) | Nein (nur Page Cache im Speicher) |
| Erkennung | Dateiintegritätsüberwachung | Unsichtbar für Dateisystemprüfungen |
Wenn Linux eine gemeinsame Bibliothek mit MAP_PRIVATE mappt, kopiert es die Dateiseiten nicht sofort. Stattdessen zeigen die Seitentabelleneinträge des Prozesses direkt auf die Page-Cache-physischen Seiten. Die Kopie erfolgt erst beim Schreiben (Copy-on-Write). Für Codeseiten (.text) schreiben Prozesse nie darauf — sie bleiben also für immer mit dem Page Cache geteilt.
Process A (bash) Process B (su) Page Cache (libc)
┌──────┐ ┌──────┐ ┌──────────┐
│ PTE │───────────>│ │ │ exit(): │
│ │ │ PTE │───────────>│ endbr64 │
└──────┘ └──────┘ │ push rax │
MAP_PRIVATE MAP_PRIVATE │ ... │
(clean page) (clean page) └──────────┘
↑
Copy Fail schreibt hier!
CVE-2026-31431 gibt uns einen kontrollierten 4-Byte-Schreibzugriff auf den Page Cache jeder lesbaren Datei. Durch die Korrumpierung der Codeseiten von libc modifizieren wir die Instruktionen, die jeder Prozess ausführt.
on_exit()-Funktion im Page Cache von libc — 10 Schreibvorgänge à 4 Bytesexit() patchen, um zu unserem Shellcode zu springen — 1 Schreibvorgang von 4 Bytesexit() aufruft (praktisch jedes Programm), führt unseren Shellcode ausDer Shellcode führt setuid(0) → setgid(0) → execve("/bin/sh") aus und liefert so eine Root-Shell.
crypto/algif_aead.c — die In-Place-Optimierung von 2017 (72548b093ee3) erlaubt es splice(), Page-Cache-Seiten in die AEAD-Entschlüsselung einzuspeisen. Die ESN-Umordnung des authencesn-Algorithmus schreibt 4 Scratch-Bytes zurück in die Quell-Scatterlist und korrumpiert so den Page Cache der gespleißten Datei.# Kompilieren
gcc -o exploit exploit.c
# Als unprivilegierter Benutzer ausführen
./exploit /lib/x86_64-linux-gnu/libc-2.31.so
# Auslösen — beliebiges Programm ausführen (es ruft exit() auf)
su -c id
# uid=0(root) gid=0(root) groups=0(root)
process 'id' launched '/bin/sh'exploit.c — Vollständiger Exploit mit Shellcode-Injektioncopyfail_test.c — Primitive-Verifizierung (testet 4-Byte-Schreibzugriff)72548b093ee3)Dieses Tool wird ausschließlich für autorisierte Sicherheitsforschung und Bildungszwecke bereitgestellt. Verwenden Sie es nicht gegen Systeme, die Sie nicht besitzen oder für die Sie keine ausdrückliche Testgenehmigung haben.
Dirty Frag hat zwei weitere Page-Cache-Schreibvarianten in derselben Bug-Klasse offengelegt:
esp4/esp6): Dieselbe authencesn-Senke wie Copy Fail, erreichbar über IPsec-ESP-in-UDP. Erfordert Benutzer-Namespaces. 4-Byte-Schreibzugriff.rxrpc/rxkad): pcbc(fcrypt) In-Place-Entschlüsselung auf Splice-gepinnten Seiten. Keine Namespaces erforderlich. 8-Byte-Schreibzugriff.Die Live-Code-Korruptionstechnik in diesem Repository funktioniert mit jeder dieser Page-Cache-Schreibprimitive — ersetzen Sie einfach die write4()-Funktion durch den ESP- oder RxRPC-Auslöser. Die Technik ist primitiv-agnostisch.