
Herramientas de detección segura para CVE-2026-31431 "Copy Fail" y CVE-2026-43284 "Dirty Frag": una escalada de privilegios local en el módulo algif_aead del kernel de Linux que afecta a todas las distribuciones principales desde 2017.
Herramientas de detección seguras para dos familias de vulnerabilidades relacionadas de escalada de privilegios local del kernel de Linux — Copy Fail (CVE-2026-31431) y Dirty Frag (CVE-2026-43284 / CVE-2026-43500) — ambas afectan a todas las distribuciones principales desde 2017, ambas explotables por cualquier usuario local sin privilegios, y ambas requieren mitigaciones independientes.
Estas sondas no abren sockets y no realizan operaciones criptográficas ni de red. La detección se basa únicamente en la versión del kernel, los metadatos de paquetes de la distribución, el estado de los módulos y los indicadores de mitigación activos — todo legible por cualquier usuario sin
sudo.
Aplicar la mitigación de Copy Fail NO protege contra Dirty Frag. Deben ejecutarse ambas sondas y aplicarse ambas mitigaciones de forma independiente.
.
├── 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
El exploit requiere exactamente esta cadena de syscalls:
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
La sonda no toca ninguna de ellas. La detección se basa en:
.ko en disco (auto-cargable)modprobe.d y el indicador initcall_blacklist en la línea de comandos del kernelchmod +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
Códigos de salida: 0 = PATCHED o MITIGATED · 1 = VULNERABLE · 2 = UNKNOWN
El script compara automáticamente contra estos umbrales y establece el veredicto en PATCHED cuando el paquete en ejecución iguala o supera el umbral.
En RHEL, AlmaLinux, Rocky Linux y derivados, algif_aead está compilado dentro del kernel. La solución alternativa de modprobe.d no tiene efecto. Solo funciona initcall_blacklist=algif_aead_init en la línea de comandos del kernel. La sonda detecta esta situación y advierte explícitamente.
grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
reboot
Dirty Frag encadena dos errores de ruta rápida (fast-path) de descifrado in-place descubiertos por Hyunwoo Kim (@v4bel), divulgados alrededor del 2026-05-07, una semana después de Copy Fail:
esp4, esp6); corrección upstream f4c50a4034e6rxrpc); corrección upstream aa54b1d27fe0El exploit adjunta páginas de pipe de la caché de páginas de /usr/bin/su como fragmentos paginados de socket-buffer y luego realiza un descifrado in-place con una clave elegida por el atacante — escribiendo bytes arbitrarios directamente en la copia en caché de un binario setuid, sin tocar el archivo en disco.
La mitigación de Copy Fail (lista negra de algif_aead) NO previene 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 sonda comprueba esp4, esp6 y rxrpc de forma independiente e informa de los booleanos separados cve_43284_safe / cve_43500_safe en la salida JSON.
esp4 y esp6 son las transformaciones ESP del lado del kernel utilizadas por IPsec (strongSwan, Libreswan). Ponerlas en la lista negra rompe los túneles IPsec. La sonda detecta el uso activo de IPsec mediante ip xfrm state y la detección de daemons, y ajusta el consejo de remediación en consecuencia:
modprobe.d para los tres módulos.rxrpc en la lista negra por separado si no es necesario):
# 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
| Distribución | CVE-2026-43284 | CVE-2026-43500 (rxrpc) |
|---|---|---|
| RHEL / Rocky / Alma 8.10 | 4.18.0-553.123.2.el8_10 | N/A — rxrpc no se incluye en RHEL 8 |
| RHEL / Rocky / Alma 9.x |
Para los sistemas que esperan un kernel parcheado, aplique la lista negra de modprobe.d de inmediato (teniendo en cuenta la advertencia de IPsec).
AlmaLinux / RHEL 8 no compila el módulo rxrpc en absoluto. La sonda marca automáticamente kernel_vuln_rxrpc=not_affected en RHEL/Rocky/Alma 8.x.
Despliegue ambas sondas en cada host monitorizado:
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
Importe zabbix_template_copy_fail.yaml mediante Configuration → Templates → Import.
Elementos UserParameter proporcionados:
La plantilla de Copy Fail incluye un disparador HIGH en status=1 y WARNING en status=2. No se requiere sudo — todos los archivos que leen ambos scripts son legibles por cualquier usuario.
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
Detecta un intento de exploit activo en curso, complementando ambas sondas estáticas.
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'
Los stubs de reglas de Wazuh (nivel 13 / 15) están incrustados en los comentarios del archivo .rules.
cp wazuh_sca/copy_fail_sca.yml /var/ossec/etc/shared/default/
/var/ossec/bin/agent_control -r -a
Resultados: Security → SCA → Filter by policy 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
Escribe el JSON por host + summary.txt en /tmp/copy_fail_results/ en el controlador. El play termina con un código distinto de cero si algún host es VULNERABLE.
Copy Fail
Dirty Frag
| Copy Fail | Dirty Frag |
|---|
| CVE | CVE-2026-31431 | CVE-2026-43284 + CVE-2026-43500 |
| Módulo(s) | algif_aead | esp4, esp6, rxrpc |
| Introducido | Ago 2017 (kernel 4.14) | Ene 2017 / Jun 2023 |
| Mitigación | Lista negra de modprobe.d para algif_aead | Lista negra de modprobe.d para esp4/esp6/rxrpc |
| Script de sondeo | cve-2026-31431-check.sh | cve-2026-43284-check.sh |
| Distribución | Parcheado en | Aviso |
|---|
| 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 | same |
| RHEL / Rocky / Alma 10.1 | kernel-6.12.0-124.55.1.el10_1 | same |
| 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 | Aún no hay kernel parcheado — mitigación con kmod mediante 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 | Aviso de SUSE |
| Pendiente |
| Pendiente |
| Debian / Ubuntu / SLES | Pendiente | Pendiente |
| Clave | Tipo | Significado |
|---|
copy_fail.status | int | 0=seguro · 1=vulnerable · 2=desconocido |
copy_fail.detail | str | Veredicto de Copy Fail en formato legible |
dirty_frag.status | int | 0=seguro · 1=vulnerable · 2=desconocido |
dirty_frag.detail | str | Veredicto de Dirty Frag en formato legible |
| Distribución | Copy Fail | Dirty Frag |
|---|