
Detektor und Proof-of-Concept für eine Linux-Kernel-Schwachstelle im Page-Cache-Schreibvorgang (CVE-2026-31431) in algif_aead, einschließlich eines nicht-destruktiven Scanners und eines lokalen Privilege-Escalation-Exploits.
Dieses Repository enthält Detektor und PoC für die Linux-algif_aead-/authencesn-Seitencache-Scratch-Write-Schwachstelle
CVE-2026-31431.
Offenlegungsartikel: https://xint.io/blog/copy-fail-linux-distributions
Nur auf Hosts verwenden, die dir gehören oder für die du ausdrücklich autorisiert bist. Der Detektor ist zerstörungsfrei und arbeitet nur mit Sentinel-Dateien in temporären Verzeichnissen; PoC und LPE verändern den Seitencache-Zustand im Speicher und sind echte lokale Privilege-Escalation-Techniken – eine nicht autorisierte Ausführung ist in der Regel illegal.
algif_aead führt AEAD-Operationen in-place aus, d. h. req->src == req->dst. Wenn Eingabedaten über splice() aus einer regulären Datei eingespeist werden, enthält die Ziel-Scatterlist Referenzen auf die Seitencache-Seiten dieser Datei, sodass der Kernel in die Seitencache-Kopie der Datei schreiben kann.
authencesn(hmac(sha256),cbc(aes)) führt einen 4-Byte-Scratch-Write auf das seqno_lo-Feld in der AAD (Bytes 4 bis 7 der AAD) aus. In Kombination mit der oben genannten In-place-AEAD- und splice()-Pfad kann ein Angreifer diese 4 Bytes in eine Seitencache-Seite einer lesbaren Datei schreiben lassen.
Diese Änderung wird nicht auf die Festplatte zurückgeschrieben, sie betrifft nur den aktuellen Kernel-Seitencache. Der Dateiinhalt auf der Festplatte bleibt daher unverändert, aber Leser, die diesen Seitencache gemeinsam nutzen, sehen den manipulierten Inhalt. World-readable Dateien wie /etc/passwd und /usr/bin/su können Ziel sein.
Erfordert eine lokal installierte Rust-Toolchain und Cargo.
Alle Rust-Binaries kompilieren:
cargo build --release --bins
Nach der Kompilierung werden erzeugt:
target/release/cve_2026_31431_detector
target/release/cve_2026_31431_poc
Wenn vorkompilierte Dateien im Repository abgelegt werden sollen, bitte hier:
dist/linux-x86_64/cve_2026_31431_detector
dist/linux-x86_64/cve_2026_31431_poc
dist/linux-x86_64/SHA256SUMS
Das gesamte target/-Verzeichnis nicht einchecken; es enthält Cargo-Zwischenprodukte und lokale Caches.
Nur den zerstörungsfreien Detektor kompilieren:
cargo build --release --bin cve_2026_31431_detector
Nur die Rust-Version von poc.py kompilieren:
cargo build --release --bin cve_2026_31431_poc
Der Rust-zerstörungsfreie Detektor wird empfohlen:
./target/release/cve_2026_31431_detector
echo $?
Alternativ direkt über Cargo ausführen:
cargo run --release --bin cve_2026_31431_detector
echo $?
Python-Detektor-Verwendung:
python3 test_cve_2026_31431.py
echo $?
Bedeutung der Exit-Codes:
| Exit-Code | Bedeutung |
|---|---|
0 | Keine Schwachstelle erkannt, oder Voraussetzungen nicht erfüllt, z. B. AF_ALG / authencesn nicht verfügbar. |
Häufige Ausgaben zur Bewertung:
Vom Detektor ausgeführte Operationen:
AF_ALG und authencesn(hmac(sha256),cbc(aes)) verfügbar sind.sendmsg und setzt seqno_lo der AAD auf den Marker PWND.splice() die Seitencache-Seite der Sentinel-Datei in den AF_ALG-op-Socket ein.recv() auf, um die Algorithmusausführung anzustoßen.Der Detektor verändert /usr/bin/su, /etc/passwd oder andere Systemdateien nicht. Die temporäre Sentinel-Datei wird beim Beenden gelöscht.
Rust-Version von poc.py:
./target/release/cve_2026_31431_poc
oder:
cargo run --release --bin cve_2026_31431_poc
Hinweis: Dieser PoC öffnet gemäß der Logik von poc.py /usr/bin/su, verschmutzt über die Schwachstellen-Primitive dessen Seitencache-Kopie und führt dann su aus. Dies ist kein zerstörungsfreier Erkennungsablauf und sollte nur in autorisierten Testumgebungen ausgeführt werden.
python3 exploit_cve_2026_31431.py
python3 exploit_cve_2026_31431.py --shell
Dieses Skript sucht das UID-Feld des aktuellen Benutzers in /etc/passwd und versucht, die UID im Seitencache auf 0000 zu ändern. Die /etc/passwd-Datei auf der Festplatte wird nicht verändert, aber Systemprozesse können beim Lesen des Seitencaches den manipulierten Inhalt sehen.
Einschränkungen:
1000 bis 9999.nscd, sssd, systemd-userdbd können die Seitencache-Änderungen von /etc/passwd verschleiern./etc/passwd muss zwischen dem Patchen und dem Ausführen von su bestehen bleiben.Seitencache bereinigen:
python3 -c "import os; fd=os.open('/etc/passwd', os.O_RDONLY); os.posix_fadvise(fd, 0, 0, os.POSIX_FADV_DONTNEED); os.close(fd)"
Wenn bereits eine Root-Shell erlangt wurde, kann auch ausgeführt werden:
echo 3 > /proc/sys/vm/drop_caches
Ein Neustart löscht ebenfalls den Seitencache-Zustand.
Bis der Distributions-Kernel-Fix verfügbar ist, kann algif_aead deaktiviert werden:
sudo tee /etc/modprobe.d/disable-algif-aead.conf <<<'install algif_aead /bin/false'
sudo rmmod algif_aead 2>/dev/null
Nach Anwendung der Abhilfemaßnahme sollte der Detektor in der Regel 检测结论:未发现漏洞 ausgeben und angeben, dass die Trigger-Voraussetzungen nicht erfüllt sind, mit Exit-Code 0.
Der Upstream-Fix-Ansatz besteht darin, die AEAD-Operation von der In-place-Verarbeitung zurück auf die Nicht-In-place-Verarbeitung umzustellen, um zu vermeiden, dass Seitencache-Seiten in eine beschreibbare Destination-Scatterlist gelangen.
| Datei | Beschreibung |
|---|
test_cve_2026_31431.py | Python-zerstörungsfreier Detektor. Arbeitet nur mit temporären Sentinel-Dateien, berührt keine Systemdateien. |
src/main.rs | Rust-zerstörungsfreier Detektor. Erkennungslogik und Exit-Codes identisch mit dem Python-Detektor. |
src/bin/poc.rs | Rust-Version von poc.py. Verschmutzt den Seitencache von /usr/bin/su und führt su aus. |
poc.py | Python-PoC. |
exploit_cve_2026_31431.py | Python-LPE. Versucht über die Verschmutzung des /etc/passwd-Seitencaches eine Root-Shell zu erhalten. |
2 | Anfällig für CVE-2026-31431 erkannt. |
1 | Fehler während des Tests; das Ergebnis kann nicht als Grundlage für die Schwachstellenbewertung dienen. |
| Ausgabe | Schlussfolgerung |
|---|
检测结论:未发现漏洞 | Keine Schwachstelle erkannt, oder Trigger-Voraussetzungen nicht erfüllt. |
检测结论:存在 CVE-2026-31431 漏洞 | Marker PWND erfolgreich in die gesplicete Seitencache-Seite gelangt, Schwachstelle vorhanden. |
检测结论:存在疑似 CVE-2026-31431 漏洞 | Seitencache wurde verändert; auch wenn der Marker nicht an der erwarteten Position liegt, sollte dies als betroffen gelten. |
测试过程出错,无法判断是否存在漏洞 | Erkennung fehlgeschlagen, Exit-Code 1; nach Fehlermeldung prüfen und erneut ausführen. |