
Outillage de détection sûr pour CVE-2026-31431 "Copy Fail" et CVE-2026-43284 "Dirty Frag" — une élévation locale de privilèges dans le module algif_aead du noyau Linux affectant toutes les principales distributions depuis 2017.
Outils de détection sûrs pour deux familles de vulnérabilités d'élévation de privilèges locaux du noyau Linux — Copy Fail (CVE-2026-31431) et Dirty Frag (CVE-2026-43284 / CVE-2026-43500) — affectant toutes les principales distributions depuis 2017, toutes deux exploitables par tout utilisateur local non privilégié, et toutes deux nécessitant des mitigations indépendantes.
Ces sondes n'ouvrent aucun socket et n'effectuent aucune opération cryptographique ou réseau. La détection repose uniquement sur la version du noyau, les métadonnées des paquets de la distribution, l'état des modules et les indicateurs de mitigation actifs — le tout lisible par tous sans
sudo.
Appliquer la mitigation Copy Fail ne protège PAS contre Dirty Frag. Les deux sondes doivent être exécutées et les deux mitigations appliquées indépendamment.
.
├── 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
L'exploit nécessite cette chaîne d'appels système exacte :
socket(AF_ALG, SOCK_SEQPACKET, 0)
bind(fd, {alg_type="aead", alg_name="authesn(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
Aucun de ces appels n'est effectué par la sonde. La détection repose sur :
.ko sur disque (chargeable automatiquement)modprobe.d et indicateur initcall_blacklist de la ligne de commande du noyauchmod +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
Codes de sortie : 0 = CORRIGÉ ou MITIGÉ · 1 = VULNÉRABLE · 2 = INCONNU
Le script compare automatiquement ces seuils et attribue le verdict CORRIGÉ lorsque le paquet installé atteint ou dépasse le seuil.
Sur RHEL, AlmaLinux, Rocky Linux et leurs dérivés, algif_aead est compilé dans le noyau. La solution de contournement modprobe.d n'a aucun effet. Seul initcall_blacklist=algif_aead_init sur la ligne de commande du noyau fonctionne. La sonde le détecte et émet un avertissement explicite.
grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
reboot
Dirty Frag enchaîne deux bogues de décryptage en place sur le chemin rapide découverts par Hyunwoo Kim (@v4bel), divulgués vers le 7 mai 2026, une semaine après Copy Fail :
esp4, esp6) ; correctif en amont f4c50a4034e6rxrpc) ; correctif en amont aa54b1d27fe0L'exploit attache les pages de pipe du cache de pages de /usr/bin/su comme fragments paginés de socket-buffer, puis pilote le décryptage en place avec une clé choisie par l'attaquant — écrivant des octets arbitraires directement dans la copie en cache d'un binaire setuid, sans toucher au fichier sur disque.
La mitigation Copy Fail (liste noire algif_aead) ne prévient PAS Dirty Frag.
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
La sonde vérifie esp4, esp6 et rxrpc indépendamment et rapporte des booléens distincts cve_43284_safe / cve_43500_safe dans la sortie JSON.
esp4 et esp6 sont les transformations ESP côté noyau utilisées par IPsec (strongSwan, Libreswan). Leur mise sur liste noire casse les tunnels IPsec. La sonde détecte l'utilisation active d'IPsec via ip xfrm state et la détection de démons, et adapte les recommandations de remédiation en conséquence :
modprobe.d complète pour les trois modules.rxrpc sur liste noire séparément si ce n'est pas nécessaire) :
# 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 non fourni sur RHEL 8 |
| RHEL / Rocky / Alma 9.x |
Pour les systèmes en attente d'un noyau corrigé, appliquez immédiatement la liste noire modprobe.d (en tenant compte de la réserve IPsec).
AlmaLinux / RHEL 8 ne compile pas du tout le module rxrpc. La sonde marque automatiquement kernel_vuln_rxrpc=not_affected sur RHEL/Rocky/Alma 8.x.
Déployez les deux sondes sur chaque hôte supervisé :
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
Importez zabbix_template_copy_fail.yaml via Configuration → Modèles → Importer.
Éléments UserParameter fournis :
Le modèle Copy Fail comprend un déclencheur HIGH sur status=1 et un WARNING sur status=2. Aucun sudo requis — chaque fichier lu par les deux scripts est lisible par tous.
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
Détecte une tentative d'exploitation active en cours, complétant les deux sondes statiques.
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'
Des ébauches de règles Wazuh (niveau 13 / 15) sont intégrées dans les commentaires du fichier .rules.
cp wazuh_sca/copy_fail_sca.yml /var/ossec/etc/shared/default/
/var/ossec/bin/agent_control -r -a
Résultats : Security → SCA → Filtrer par politique cve_2026_31431_copy_fail
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
Écrit un JSON par hôte + summary.txt dans /tmp/copy_fail_results/ sur le contrôleur. Le playbook se termine avec un code non nul si un hôte est VULNÉRABLE.
Copy Fail
Dirty Frag
| Copy Fail | Dirty Frag |
|---|
| CVE | CVE-2026-31431 | CVE-2026-43284 + CVE-2026-43500 |
| Module(s) | algif_aead | esp4, esp6, rxrpc |
| Introduit | Août 2017 (noyau 4.14) | Janv. 2017 / Juin 2023 |
| Mitigation | liste noire modprobe.d pour algif_aead | liste noire modprobe.d pour esp4/esp6/rxrpc |
| Script de sonde | cve-2026-31431-check.sh | cve-2026-43284-check.sh |
| Distro | Version corrigée | Avis de sécurité |
|---|
| 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 | idem |
| RHEL / Rocky / Alma 10.1 | kernel-6.12.0-124.55.1.el10_1 | idem |
| 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 | Pas encore de noyau corrigé — mitigation kmod via 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 | Avis SUSE |
| En attente |
| En attente |
| Debian / Ubuntu / SLES | En attente | En attente |
| Clé | Type | Signification |
|---|
copy_fail.status | int | 0=sûr · 1=vulnérable · 2=inconnu |
copy_fail.detail | str | Verdict Copy Fail lisible par un humain |
dirty_frag.status | int | 0=sûr · 1=vulnérable · 2=inconnu |
dirty_frag.detail | str | Verdict Dirty Frag lisible par un humain |
| Distro | Copy Fail | Dirty Frag |
|---|