
Wazuh 4.14.4-Erkennungsregeln für CVE-2026-31431 (Copy Fail) – Lokale Privilegienausweitung unter Linux über den authencesn-Seitencache-Schreibvorgang
Detection Engineering für die Copy Fail Kernel-LPE · Ubuntu / RHEL / SUSE / Amazon Linux 2023 / Kali
CVE-2026-31431 ist ein Logikfehler in der authencesn-Krypto-Vorlage des Linux-Kernels. Er ermöglicht jedem unprivilegierten lokalen Benutzer einen deterministischen, kontrollierten 4-Byte-Schreibzugriff in den Page Cache jeder lesbaren Datei auf dem System - ohne Race Conditions, Kernel-Offsets oder erhöhte Privilegien.
Ein 732-Byte-Python-3.10+-Skript, das nur Standardbibliotheksmodule (os, socket, zlib) verwendet, nutzt die Schwachstelle aus, um auf allen großen Linux-Distributionen, die seit 2017 ausgeliefert werden, Root-Rechte zu erlangen.
Die Datei auf der Festplatte bleibt unverändert, wodurch herkömmliche Datei-Integritätsüberwachung (FIM) völlig blind ist.
Entdeckt von Taeyang Lee (Theori / Xint) mit Unterstützung des KI-Tools Xint Code.
Der Schreibzugriff zielt nur auf den In-Memory-Page-Cache. Der Kernel markiert die Seite nie als "dirty", sodass der Writeback-Mechanismus sie nie auf die Festplatte schreibt. Die Binärdatei auf der Festplatte bleibt byte-für-byte identisch mit dem Original.
Traditioneller FIM-Ansatz:
Datei von Festplatte lesen -> Hash berechnen -> vergleichen -> keine Anomalie gemeldet
Copy-Fail-Realität:
Datei auf Festplatte = UNVERÄNDERT
Page Cache = BESCHÄDIGT
FIM-Ergebnis = BLIND
Die einzige wirksame Erkennung ist verhaltensbasiert, über Syscall-Überwachung. Dieses Repository stellt produktionsvalidierte Wazuh-Regeln bereit, die die Exploit-Kette auf Kernel-Syscall-Ebene erkennen.
Schritt 1: socket(38, 5, 0) AF_ALG-Socket - keine Privilegien erforderlich
Schritt 2: bind() An authencesn binden - aktiviert verwundbaren Code
Schritt 3: sendmsg() AAD-Payload erstellen - Bytes 4-7 = zu schreibender Wert
Schritt 4: splice() [!] AUSLÖSER - Page-Cache-Seiten gelangen in beschreibbaren SGL
Schritt 5: recv() authencesn schreibt seqno_lo in den Page Cache
Schritt 6: execve(/usr/bin/su) Beschädigte setuid-Binärdatei führt Shellcode als UID 0 aus
splice() ist der kritische Schritt. Es liefert Page-Cache-Seiten in den beschreibbaren Scatterlist des AF_ALG-Sockets, ohne sie zu kopieren - eine In-Place-Optimierung aus dem Jahr 2017 in algif_aead.c, die Seiten aus dem Pipe-Puffer im Ziel-SGL wiederverwendbar machte. Wenn authencesn.decrypt() ausgeführt wird, schreibt es in diese Seiten, die zufällig der Page Cache Ihrer Zieldatei sind.
Alle Linux-Distributionen, die Kernel seit Commit 72548b093ee3 (2017) ausliefern, sind betroffen.
Container-Escape: Copy Fail ist auch ein Container-Escape-Vektor. Der Page Cache wird von allen Prozessen auf dem Host gemeinsam genutzt, auch über Container-Grenzen hinweg. Teil 2 von Xint behandelt die Kubernetes-Ausnutzung.
COPY-FAIL-Detection-with-Wazuh-4.14.4/
│
├── rules/
│ └── local_rules.xml # 8 Wazuh-Erkennungsregeln (199600-199607)
│
├── auditd/
│ └── cve-2026-31431.rules # auditd-Syscall-Sensorregeln
│
├── sca/
│ └── cve_2026_31431.yml # SCA-Richtlinie - kernelversionsunabhängig
│
└── docs/
├── pentlab_uid.png # PoC-Ausführung - Root auf Kali erlangt
├── Rule-199604-TRIGs.png # Regel 199604 - 80 Treffer auf pentlab
├── Rule_199604_Wazuh_Server_only.png # Regel 199604 - erste Validierung
├── Splice_-_Non-root_process.png # Regeln 199600/199601/199604 ausgelöst
├── Modprobe_-_Possible_Algif_aed_load_attempt.png # Regel 199603
├── Pentlab-PoC.png # Regel 199603 auf pentlab-Agent
├── exploit_chain_timeline.svg # Exploit-Kette
└── SCA_CVE-2026-31431.png # SCA-Richtlinien-Score 75%
Zwei unabhängige Ebenen - keine hängt von der Kernelversion ab.
Der Filter uid!=0 deckt Benutzer über interaktive Konten hinaus ab: Dienstkonten (www-data, postgres, jenkins), Container und Web-Shells ohne Login-Sitzung.
Auditd-Sensorregeln (auditd/cve-2026-31431.rules):
-a always,exit -F arch=b64 -S socket -F a0=0x26 -F uid!=0 -k copy_fail_af_alg
-a always,exit -F arch=b32 -S socket -F a0=0x26 -F uid!=0 -k copy_fail_af_alg
-a always,exit -F arch=b64 -S splice -F uid!=0 -k copy_fail_splice
-w /usr/bin/su -p x -k copy_fail_execve_su
-w /usr/bin/kmod -p x -k copy_fail_modload
Automatisierte Konfigurationsprüfungen alle 12 Stunden über sca/cve_2026_31431.yml. Keine Kernelversion erforderlich.
Technischer Hinweis: Die Regeln 199600 und 199601 müssen Kinder von Regel 92600 (Python-Prozess, Tiefe 1) sein, nicht von 80700. Die Wazuh-Regelengine folgt einem Kettenpfad pro Ereignis. Die Platzierung der Erkennungsregeln auf Tiefe 2 unter 92600 stellt sicher, dass sie die Kettenauswertung gegenüber Geschwisterregeln gewinnen (z. B. 92603-92606 in 0850-audit_rules.xml, die ebenfalls
if_group=audit + exe=pythonabgleichen).
# Ubuntu / Debian / Kali
apt install auditd audispd-plugins -y
systemctl enable --now auditd
auditctl -s | grep enabled
# RHEL / Amazon Linux
yum install audit -y
systemctl enable --now auditd
# SUSE
zypper install audit -y
systemctl enable --now auditd
cp auditd/cve-2026-31431.rules /etc/audit/rules.d/
augenrules --load
auditctl -l | grep copy_fail
Erwartete Ausgabe:
-a always,exit -F arch=b64 -S socket -F a0=0x26 -F uid!=0 -F key=copy_fail_af_alg
-a always,exit -F arch=b32 -S socket -F a0=0x26 -F uid!=0 -F key=copy_fail_af_alg
-a always,exit -F arch=b64 -S splice -F uid!=0 -F key=copy_fail_splice
-w /usr/bin/su -p x -k copy_fail_execve_su
-w /usr/bin/kmod -p x -k copy_fail_modload
Die Regeln sind in rules/local_rules.xml enthalten. Sie können den Inhalt entweder in Ihre bestehende /var/ossec/etc/rules/local_rules.xml einfügen oder als eigenständige Datei bereitstellen:
# Option A - eigenständige Datei
cp rules/local_rules.xml /var/ossec/etc/rules/cve-2026-31431_rules.xml
# Option B - an local_rules.xml anhängen
cat rules/local_rules.xml >> /var/ossec/etc/rules/local_rules.xml
# Syntax validieren - muss mit 0 und ohne Warnungen beendet werden
/var/ossec/bin/wazuh-analysisd -t 2>&1 | tail -5
# Manager neu starten
systemctl restart wazuh-manager
cp sca/cve_2026_31431.yml /var/ossec/etc/shared/default/
Fügen Sie in ossec.conf innerhalb des <sca>-Blocks hinzu:
<policies>
<policy>/var/ossec/etc/shared/default/cve_2026_31431.yml</policy>
</policies>
systemctl restart wazuh-manager
Stellen Sie sicher, dass Wazuh das auditd-Protokoll aufnimmt:
<!-- Innerhalb von <ossec_config> hinzufügen -->
<localfile>
<log_format>audit</log_format>
<location>/var/log/audit/audit.log</location>
</localfile>
# Bei Bedarf Testbenutzer erstellen
useradd -m testuser 2>/dev/null || true
# SIGNAL 1 erzeugen - AF_ALG-Socket
su - testuser -c "python3 -c \"import socket; socket.socket(38, 5, 0); print('AF_ALG OK')\""
# SIGNAL 3 erzeugen - /usr/bin/su-Ausführung
su - testuser -c "/usr/bin/su --help 2>/dev/null || true"
# Prüfen, ob auditd Ereignisse erfasst hat
ausearch -k copy_fail_af_alg -ts recent 2>/dev/null | grep "key=\|exe=\|uid=" | head -5
# Prüfen, ob Wazuh Alerts erzeugt hat
grep -E "199600|199602" /var/ossec/logs/alerts/alerts.log | tail -10
grep -E "31431|cve_2026" /var/ossec/logs/alerts/alerts.log | tail -10
Erwarteter SCA-Score (System ohne Mitigation): 75% (3 bestanden / 1 fehlgeschlagen - algif_aead nicht auf Blacklist)
testuser (uid=1001) führte den 732-Byte-PoC aus und erlangte eine Root-Shell:

AF_ALG-Socket + splice() aus demselben Python-Prozess - pid=46784 - SOFORTIGE UNTERSUCHUNG ERFORDERLICH:






Wazuh-Dashboard-Discover-Ergebnisse (Agent=pentlab, Heute):
wazuh-analysisd -t: Exit 0 - keine Warnungen - alle 8 Regeln geladen.
rmmod algif_aead 2>/dev/null || true
echo 'install algif_aead /bin/false' > /etc/modprobe.d/disable-algif-aead.conf
Dies betrifft nicht dm-crypt/LUKS, kTLS, IPsec, OpenSSL, GnuTLS oder SSH.
Wenden Sie Kernel-Commit a664bf3d603d über das Kernel-Update Ihrer Distribution an. Es macht die In-Place-Optimierung von 2017 in algif_aead.c rückgängig und trennt req->src (TX-SGL, wo splice Seiten zustellt) von req->dst (RX-SGL, Benutzerpuffer). Alle großen Distributionen liefern den Fix aus.
# Ubuntu / Debian
apt update && apt upgrade linux-generic
# RHEL / Amazon Linux
dnf update kernel
# SUSE
zypper update kernel-default
Kislley Rodrigues (m0us3r) Wazuh Ambassador | Detection Engineering | Blue Team
Erkennungsregeln, auditd-Sensorkonfiguration und SCA-Richtlinie validiert auf Wazuh 4.14.4, Ubuntu 24.04.2 LTS (Kernel 6.8.0-106-generic) und Kali GNU/Linux 2026.1 (Kernel 6.18.12+kali-amd64).
| Quelle | Link |
|---|---|
| CISA nimmt aktiv ausgenutzten Linux-Root-Zugriffsfehler CVE-2026-31431 in KEV auf | https://thehackernews.com/2026/05/cisa-adds-actively-exploited-linux-root.html |
Dieses Projekt wurde im Rahmen des Wazuh Ambassador Program entwickelt.
Wazuh ist eine kostenlose Open-Source-Sicherheitsplattform, die vereinheitlichten XDR- und SIEM-Schutz bietet. Erfahren Sie mehr unter wazuh.com.
| Ressource | Link |
|---|
| Offizielle CVE-Website | https://copy.fail/ |
| Technischer Bericht - Xint Research | https://xint.io/blog/copy-fail-linux-distributions |
| PoC - copy_fail_exp.py | https://github.com/theori-io/copy-fail-CVE-2026-31431/blob/main/copy_fail_exp.py |
| Kernel-Fix - a664bf3d603d | https://github.com/torvalds/linux/commit/a664bf3d603d |
| Verwundbarer Commit - 72548b093ee3 | https://github.com/torvalds/linux/commit/72548b093ee3 |
| MITRE ATT&CK T1068 | https://attack.mitre.org/techniques/T1068/ |
| Distribution | Kernel | Status |
|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws | ROOT BESTÄTIGT |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 | ROOT BESTÄTIGT |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 | ROOT BESTÄTIGT |
| SUSE 16 | 6.12.0-160000.9-default | ROOT BESTÄTIGT |
| Kali GNU/Linux 2026.1 | 6.18.12+kali-amd64 | ROOT BESTÄTIGT |
| Regel | Elternregel | Signal | Tiefe | Level |
|---|
| 80700 | decoded_as=auditd | auditd-Anker (Wazuh integriert) | 0 | 0 |
| 92600 | 80700 | Python-Prozessausführung (Wazuh integriert) | 1 | 0 |
| 199600 | 92600 | AF_ALG-Socket - Python-Kette | 2 | 10 |
| 199601 | 92600 | splice()-Syscall - Python-Kette | 2 | 10 |
| 199604 | 199601 + if_matched=199600 | EXPLOIT-KETTE - Python (gleiche pid/120s) | 3 | 15 |
| 199602 | 80700 | /usr/bin/su-Ausführung | 1 | 6 |
| 199603 | 80700 | modprobe/kmod-Ausführung | 1 | 12 |
| 199605 | 80700 | AF_ALG-Socket - Nicht-Python | 1 | 10 |
| 199606 | 80700 | splice()-Syscall - Nicht-Python | 1 | 10 |
| 199607 | 199606 + if_matched=199605 | EXPLOIT-KETTE - Nicht-Python (gleiche pid/120s) | 2 | 15 |
| Regel | Treffer | Beschreibung |
|---|
| 199604 | 80 | EXPLOIT-KETTE ERKANNT - pid=46784 exe=/usr/bin/python3.13 |
| 199600 | 40 | AF_ALG-Socket von Nicht-Root-Prozess erstellt |
| 199603 | 28 | modprobe-Ausführung erkannt |
| 199602 | 12 | /usr/bin/su ausgeführt |
| Datum | Ereignis |
|---|
| 2026-03-23 | Schwachstelle an das Linux-Kernel-Sicherheitsteam gemeldet |
| 2026-03-24 | Erste Bestätigung erhalten |
| 2026-03-25 | Patches vorgeschlagen und überprüft |
| 2026-04-01 | Patch im Mainline-Kernel committet (a664bf3d603d) |
| 2026-04-22 | CVE-2026-31431 zugewiesen |
| 2026-04-29 | Öffentliche Offenlegung - Xint-Bericht + PoC veröffentlicht |
| Dirty Cow (2016-5195) | Dirty Pipe (2022-0847) | Copy Fail (2026-31431) |
|---|
| Race Condition | Ja - mehrere Versuche | Nein | Nein - deterministische Logik |
| Kann System zum Absturz bringen | Ja | Nein | Nein |
| Portabilität | Eingeschränkt | Versionsspezifisch | Alle Distributionen 2017+ |
| Exploit-Größe | Kilobyte (C) | Hunderte Bytes | 732 Bytes (Python-Stdlib) |
| FIM-Erkennung | Möglich | Möglich | Nicht möglich |
| Prüfung | Titel | Risiko |
|---|
| 31431001 | algif_aead nicht im Speicher geladen | KRITISCH |
| 31431002 | algif_aead über modprobe.d deaktiviert | HOCH |
| 31431003 | auditd aktiv und läuft | HOCH |
| 31431004 | CVE-2026-31431-Sensorregeln bereitgestellt | HOCH |
| Katalog bekannter ausgenutzter Schwachstellen | https://www.cisa.gov/known-exploited-vulnerabilities-catalog |
| CVE-2026-31431 - crypto: algif_aead - Rückkehr zum Out-of-Place-Betrieb | https://www.cve.org/CVERecord?id=CVE-2026-31431 |