
Sicherheitserkennungs-Tooling für CVE-2026-31431 „Copy Fail" und CVE-2026-43284 „Dirty Frag" – eine lokale Rechteausweitung im algif_aead-Modul des Linux-Kernels, die seit 2017 alle großen Distributionen betrifft.
Sichere Erkennungswerkzeuge für zwei verwandte Familien von Local-Privilege-Escalation-Schwachstellen im Linux-Kernel – Copy Fail (CVE-2026-31431) und Dirty Frag (CVE-2026-43284 / CVE-2026-43500) – die seit 2017 alle großen Distributionen betreffen, von jedem unprivilegierten lokalen Benutzer ausgenutzt werden können und unabhängige Gegenmaßnahmen erfordern.
Diese Sonden öffnen keine Sockets und führen keine Krypto- oder Netzwerkoperationen aus. Die Erkennung basiert ausschließlich auf Kernelversion, Distributions-Paketmetadaten, Modulstatus und aktiven Mitigations-Flags – alles ohne
sudofür alle lesbar.
Die Anwendung der Copy-Fail-Gegenmaßnahme schützt NICHT vor Dirty Frag. Beide Sonden müssen ausgeführt und beide Gegenmaßnahmen unabhängig voneinander angewendet werden.
.
├── cve-2026-31431-check.sh Copy Fail probe (all output modes)
├── copy_fail_userparameter.conf Zabbix agent UserParameter — Copy Fail
├── zabbix_template_copy_fail.yaml Zabbix 6.4 template — Copy Fail
├── copy_fail_auditd.rules auditd behavioral detection — Copy Fail
├── cve-2026-43284-check.sh Dirty Frag probe (all output modes)
├── dirty_frag_userparameter.conf Zabbix agent UserParameter — Dirty Frag
├── wazuh_sca/
│ └── copy_fail_sca.yml Wazuh SCA compliance policy
└── ansible/
└── copy_fall_scan.yml Fleet-wide Ansible scan playbook
Der Exploit erfordert genau diese Syscall-Kette:
socket(AF_ALG, SOCK_SEQPACKET, 0)
bind(fd, {alg_type="aead", alg_name="authencesn(hmac(sha256),cbc(aes))"})
accept(fd, ...)
splice(suid_binary_fd, op_fd) ← page cache fed into crypto subsystem
sendmsg / recvmsg ← 4-byte scratch write lands in page cache
Keine dieser Operationen wird von der Sonde berührt. Die Erkennung basiert auf:
.ko auf der Platte (automatisch ladbar)modprobe.d-Blacklist und initcall_blacklist-Kernelparameterchmod +x cve-2026-31431-check.sh
./cve-2026-31431-check.sh # human-readable
./cve-2026-31431-check.sh --json # machine-readable
./cve-2026-31431-check.sh --nagios # Nagios/Icinga/NRPE
./cve-2026-31431-check.sh --zabbix # integer 0/1/2 for Zabbix item
Exit-Codes: 0 = PATCHED oder MITIGATED · 1 = VULNERABLE · 2 = UNKNOWN
Das Skript vergleicht automatisch mit diesen Schwellenwerten und setzt das Ergebnis auf PATCHED, wenn das laufende Paket den Schwellenwert erreicht oder überschreitet.
Auf RHEL, AlmaLinux, Rocky Linux und Derivaten ist algif_aead fest in den Kernel einkompiliert. Der modprobe.d-Workaround hat keine Wirkung. Nur initcall_blacklist=algif_aead_init in der Kernel-Befehlszeile funktioniert. Die Sonde erkennt dies und warnt ausdrücklich.
grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
reboot
Dirty Frag verknüpft zwei In-Place-Entschlüsselungsfehler im Fast-Path, die von Hyunwoo Kim (@v4bel) entdeckt und etwa am 07.05.2026, eine Woche nach Copy Fail, veröffentlicht wurden:
esp4, esp6); Upstream-Fix f4c50a4034e6rxrpc); Upstream-Fix aa54b1d27fe0Der Exploit hängt Pipe-Seiten aus dem Page Cache von /usr/bin/su als seitenbasierte Socket-Buffer-Fragmente an und treibt dann die In-Place-Entschlüsselung mit einem vom Angreifer gewählten Schlüssel an – wobei beliebige Bytes direkt in die zwischengespeicherte Kopie einer Setuid-Binary geschrieben werden, ohne die Datei auf der Festplatte zu verändern.
Die Copy-Fail-Gegenmaßnahme (algif_aead-Blacklist) verhindert Dirty Frag NICHT.
chmod +x cve-2026-43284-check.sh
./cve-2026-43284-check.sh # human-readable
./cve-2026-43284-check.sh --json # machine-readable
./cve-2026-43284-check.sh --nagios # Nagios/Icinga/NRPE
./cve-2026-43284-check.sh --zabbix # integer 0/1/2 for Zabbix item
Die Sonde prüft esp4, esp6 und rxrpc unabhängig voneinander und meldet in der JSON-Ausgabe separate boolesche Werte cve_43284_safe / cve_43500_safe.
esp4 und esp6 sind die kernelseitigen ESP-Transformationen, die von IPsec (strongSwan, Libreswan) verwendet werden. Ihre Blacklistung unterbricht IPsec-Tunnel. Die Sonde erkennt aktive IPsec-Nutzung über ip xfrm state und Daemon-Erkennung und passt die Empfehlungen zur Behebung entsprechend an:
modprobe.d-Blacklist für alle drei Module anwenden.rxrpc separat blacklisten, falls nicht benötigt):# RHEL-family
sysctl -w user.max_user_namespaces=0
echo "install rxrpc /bin/false" >> /etc/modprobe.d/dirtyfrag.conf
# Ubuntu / Debian
sysctl -w kernel.unprivileged_userns_clone=0
echo "install rxrpc /bin/false" >> /etc/modprobe.d/dirtyfrag.conf
| Distro | CVE-2026-43284 | CVE-2026-43500 (rxrpc) |
|---|---|---|
| RHEL / Rocky / Alma 8.10 | 4.18.0-553.123.2.el8_10 | N/A – rxrpc wird unter RHEL 8 nicht ausgeliefert |
| RHEL / Rocky / Alma 9.x |
Für Systeme, die auf einen gepatchten Kernel warten, ist die modprobe.d-Blacklist sofort anzuwenden (unter Berücksichtigung des IPsec-Hinweises).
AlmaLinux / RHEL 8 baut das rxrpc-Modul überhaupt nicht. Die Sonde markiert auf RHEL/Rocky/Alma 8.x automatisch kernel_vuln_rxrpc=not_affected.
Beide Sonden auf jedem überwachten Host bereitstellen:
mkdir -p /etc/zabbix/scripts
install -m 750 -o zabbix -g zabbix cve-2026-31431-check.sh /etc/zabbix/scripts/
install -m 750 -o zabbix -g zabbix cve-2026-43284-check.sh /etc/zabbix/scripts/
cp copy_fail_userparameter.conf /etc/zabbix/zabbix_agentd.d/
cp dirty_frag_userparameter.conf /etc/zabbix/zabbix_agentd.d/
systemctl restart zabbix-agent # or zabbix-agent2
Importieren Sie zabbix_template_copy_fail.yaml über Konfiguration → Vorlagen → Importieren.
Bereitgestellte UserParameter-Items:
Die Copy-Fail-Vorlage enthält einen HIGH-Trigger bei status=1 und WARNING bei status=2. Kein sudo erforderlich – jede Datei, die von beiden Skripten gelesen wird, ist für alle lesbar.
install -m 755 cve-2026-31431-check.sh /usr/lib/nagios/plugins/
install -m 755 cve-2026-43284-check.sh /usr/lib/nagios/plugins/
# NRPE — add to /etc/nagios/nrpe.cfg:
command[check_copy_fail]=/usr/lib/nagios/plugins/cve-2026-31431-check.sh --nagios
command[check_dirty_frag]=/usr/lib/nagios/plugins/cve-2026-43284-check.sh --nagios
# CheckMK local checks:
echo '#!/bin/bash
OUT=$(/usr/lib/nagios/plugins/cve-2026-31431-check.sh --nagios); RC=$?
echo "$RC CVE-2026-31431 - $OUT"' > /usr/lib/check_mk_agent/local/copy_fail
echo '#!/bin/bash
OUT=$(/usr/lib/nagios/plugins/cve-2026-43284-check.sh --nagios); RC=$?
echo "$RC CVE-2026-43284 - $OUT"' > /usr/lib/check_mk_agent/local/dirty_frag
chmod +x /usr/lib/check_mk_agent/local/copy_fail \
/usr/lib/check_mk_agent/local/dirty_frag
Erkennt einen aktiven Exploit-Versuch in Echtzeit und ergänzt damit beide statischen Sonden.
cp copy_fail_auditd.rules /etc/audit/rules.d/
augenrules --load
# Watch for unexpected AF_ALG callers:
ausearch -k copy_fail_af_alg --interpret | \
grep -v -E 'cryptsetup|veritysetup|systemd-crypt|kcapi'
Wazuh-Regel-Stubs (Level 13 / 15) sind in den Kommentaren der .rules-Datei eingebettet.
cp wazuh_sca/copy_fail_sca.yml /var/ossec/etc/shared/default/
/var/ossec/bin/agent_control -r -a
Ergebnisse: Security → SCA → Nach Richtlinie cve_2026_31431_copy_fail filtern
ansible-playbook -i inventory/hosts ansible/copy_fall_scan.yml
# Limit to a subset:
ansible-playbook -i inventory/hosts ansible/copy_fall_scan.yml --limit webservers
Schreibt pro Host eine JSON-Datei plus summary.txt nach /tmp/copy_fail_results/ auf dem Controller. Das Playbook endet mit einem Exit-Code ungleich null, wenn ein Host VULNERABLE ist.
Copy Fail
Dirty Frag
| Copy Fail | Dirty Frag |
|---|
| CVE | CVE-2026-31431 | CVE-2026-43284 + CVE-2026-43500 |
| Modul(e) | algif_aead | esp4, esp6, rxrpc |
| Eingeführt | Aug 2017 (Kernel 4.14) | Jan 2017 / Jun 2023 |
| Gegenmaßnahme | modprobe.d-Blacklist für algif_aead | modprobe.d-Blacklist für esp4/esp6/rxrpc |
| Sonden-Skript | cve-2026-31431-check.sh | cve-2026-43284-check.sh |
| Distro | Patch-Stand | Advisory |
|---|
| RHEL / Rocky / Alma 8.10 | kernel-4.18.0-553.123.1.el8_10 | Rocky 2026-05-11 |
| RHEL / Rocky / Alma 9.7 | kernel-5.14.0-611.54.1.el9_7 | wie oben |
| RHEL / Rocky / Alma 10.1 | kernel-6.12.0-124.55.1.el10_1 | wie oben |
| Debian 11 (bullseye) | linux 5.10.251-3 | DLA-4560-1 |
| Debian 12 (bookworm) | linux 6.1.170-1 | DSA-6243-1 |
| Debian 13 (trixie) | linux 6.12.85-1 | DSA-6238-1 |
| Ubuntu 22.04 / 24.04 | Noch kein gepatchter Kernel – kmod-Mitigation über USN-8226-1 | USN-8226-1 |
| SLES 12 SP5 | kernel-default 4.12.14-122.299.1 | SUSE-SU-2026:1669-1 |
| SLES 15 SP5 | kernel-default 5.14.21-150500.55.144.1 | SUSE-SU-2026:1670-1 |
| SLES 15 SP6 | kernel-default 6.4.0-150600.23.92.1 | SUSE-SU-2026:1671-1 |
| SLES 15 SP7 | kernel-default 6.4.0-150700.53.40.1 | SUSE-SU-2026:1669-1 |
| SLES 16.0 | kernel-default 6.12.0-160000.29.1 | SUSE-Advisory |
| Ausstehend |
| Ausstehend |
| Debian / Ubuntu / SLES | Ausstehend | Ausstehend |
| Key | Typ | Bedeutung |
|---|
copy_fail.status | int | 0=safe · 1=vulnerable · 2=unknown |
copy_fail.detail | str | Für Menschen lesbares Copy-Fail-Ergebnis |
dirty_frag.status | int | 0=safe · 1=vulnerable · 2=unknown |
dirty_frag.detail | str | Für Menschen lesbares Dirty-Frag-Ergebnis |
| Distro | Copy Fail | Dirty Frag |
|---|