
Exploit für CVE-2026-31431, eine Linux-Kernel-Authencesn-Schwachstelle, die eine lokale Privilegieneskalation zu Root über Page-Cache-Manipulation ermöglicht.
„Copy Fail“ ist eine kritische Logikschwachstelle im kryptografischen Template authencesn des Linux-Kernels. Sie ermöglicht es einem nicht privilegierten lokalen Benutzer, einen deterministischen, kontrollierten 4-Byte-Schreibvorgang in den Page Cache einer beliebigen lesbaren Datei auf dem System auszulösen. Durch das gezielte Angreifen von setuid-Binaries (wie /usr/bin/su) kann ein Angreifer den In-Memory-Ausführungscache manipulieren, um Privilegien auf Root (UID 0) zu erweitern.
Im Gegensatz zu älteren Schwachstellen wie „Dirty Cow“ oder „Dirty Pipe“ ist Copy Fail ein geradliniger Logikfehler, der ohne Race Conditions, Wiederholungsversuche oder absturzanfällige Timing-Fenster ausgelöst wird. Er ist hochgradig portabel und heimlich, da er nur den In-Memory-Page-Cache verändert, während die Datei auf der Festplatte vollständig unverändert bleibt, wodurch standardmäßige Dateiintegritätsüberwachungstools umgangen werden.
Die Schwachstelle existiert an der Schnittstelle von drei verschiedenen Kernel-Komponenten:
splice()-Systemaufruf: Der splice()-Syscall überträgt Daten zwischen Dateideskriptoren und Pipes ohne Kopieren, indem Page-Cache-Seiten per Referenz übergeben werden. Wenn ein Benutzer eine Datei (wie /usr/bin/su) in einen AF_ALG-Socket spliced, enthält die Eingabe-Scatterlist des Sockets direkte Referenzen auf die gecachten Seiten dieser Datei im Kernel.authencesn-Scratch-Schreibvorgang: Der authencesn-Algorithmus (verwendet für IPsec Extended Sequence Numbers) erfordert das Neuordnen von Bytes. Dazu schreibt er vorübergehend 4 Bytes Sequenznummern als „Scratch-Space“ in den Ausgabepuffer. Er schreibt jedoch über die legitime Ausgabegrenze hinaus.Aufgrund der In-Place-Optimierung von 2017 enthält die Ausgabe-Scatterlist die schreibgeschützten Page-Cache-Seiten, die durch splice() übergeben wurden. Wenn authencesn über die Ausgabegrenze hinaus schreibt, überschreibt es direkt 4 Bytes im gecachten Kernel-Speicher der Zieldatei.
Ein Angreifer kann dies durch die folgenden Schritte ausnutzen:
AF_ALG-Sockets und Binden an authencesn(hmac(sha256),cbc(aes)).sendmsg() mit einer Associated Authenticated Data (AAD)-Nutzlast, die die 4 Bytes enthält, die geschrieben werden sollen.splice(), um die Zieldatei (/usr/bin/su) in den Socket zu pipen. Der Offset und die Länge definieren genau wo im Page Cache die 4 Bytes geschrieben werden.recv() löst die Entschlüsselungsoperation aus und führt den Out-of-Bounds-Scratch-Schreibvorgang direkt in den Page Cache der Zieldatei aus.execve("/usr/bin/su")). Der Kernel führt die manipulierte Page-Cache-Version aus, die den injizierten bösartigen Shellcode enthält, und gewährt so Root-Zugriff.Wenn ein Patchen oder Neustarten des Kernels nicht sofort möglich ist, können Sie diese Schwachstelle abschwächen, indem Sie alle zugehörigen af_alg-Module auf die Blacklist setzen und aus dem Speicher entladen.
Um diese Module zu blockieren, führen Sie die folgenden Befehle aus:
# 1. Entladen Sie die Module aus dem Speicher, falls sie derzeit geladen sind
sudo modprobe -r algif_hash algif_skcipher algif_aead algif_rng af_alg
# 2. Fügen Sie die Module zur Blacklist hinzu
echo -e "blacklist af_alg\nblacklist algif_hash\nblacklist algif_skcipher\nblacklist algif_aead\nblacklist algif_rng" | sudo tee /etc/modprobe.d/stop-exploit.conf
# 3. Verhindern Sie, dass das af_alg-Modul vollständig geladen wird
echo "install af_alg /bin/true" | sudo tee -a /etc/modprobe.d/stop-exploit.conf
# 4. Starten Sie das System neu, um sicherzustellen, dass die Änderungen vollständig wirksam werden
sudo reboot
Das Linux-Kernel-Sicherheitsteam hat diese Schwachstelle gepatcht (Commit: a664bf3d603d). Der Patch stellt die AF_ALG-AEAD-Operationen auf ein Out-of-Place-Modell zurück und trennt die Quell- und Ziel-Scatterlists. Dadurch wird verhindert, dass die Page-Cache-Seiten der schreibbaren Ziel-Scatterlist ausgesetzt werden.
Erforderliche Maßnahme: Aktualisieren Sie den Kernel Ihrer Distribution auf die neueste Version Ihres Anbieters (Ubuntu, Amazon Linux, RHEL, SUSE usw.) und starten Sie Ihr System neu.