
Wazuh 4.14.4 reglas de detección para CVE-2026-31431 (Copy Fail) - Escalada de privilegios local en Linux mediante escritura en la caché de página de authencesn
Ingeniería de detección para el LPE del kernel Copy Fail · Ubuntu / RHEL / SUSE / Amazon Linux 2023 / Kali
CVE-2026-31431 es un error lógico en la plantilla criptográfica authesn del kernel de Linux. Permite a cualquier usuario local sin privilegios realizar una escritura determinista y controlada de 4 bytes en la caché de páginas de cualquier archivo legible del sistema, sin requerir condiciones de carrera, offsets del kernel ni privilegios elevados.
Un script de Python 3.10+ de 732 bytes que utiliza únicamente módulos de la biblioteca estándar (os, socket, zlib) explota la vulnerabilidad para obtener root en todas las principales distribuciones de Linux publicadas desde 2017.
El archivo en disco permanece sin cambios, lo que deja completamente ciega la monitorización tradicional de integridad de archivos (FIM).
Descubierto por Taeyang Lee (Theori / Xint) con la asistencia de la herramienta de IA Xint Code.
La escritura apunta únicamente a la caché de páginas en memoria. El kernel nunca marca la página como sucia, por lo que el mecanismo de escritura diferida nunca la persiste en disco. El binario en disco permanece byte a byte idéntico al original.
Enfoque tradicional de FIM:
leer archivo del disco -> calcular hash -> comparar -> no se reporta anomalía
Realidad de Copy Fail:
archivo en disco = SIN CAMBIOS
caché de páginas = CORRUPTA
resultado FIM = CIEGO
La única detección efectiva es conductual, mediante la monitorización de syscalls. Este repositorio proporciona reglas de Wazuh validadas en producción que detectan la cadena de explotación a nivel de syscalls del kernel.
Paso 1: socket(38, 5, 0) Socket AF_ALG - no requiere privilegios
Paso 2: bind() Vincular a authencsn - activa el código vulnerable
Paso 3: sendmsg() Crear payload AAD - bytes 4-7 = valor a escribir
Paso 4: splice() [!] DISPARADOR - las páginas de la caché entran en SGL escribible
Paso 5: recv() authencsn escribe seqno_lo en la caché de páginas
Paso 6: execve(/usr/bin/su) El binario setuid corrupto ejecuta shellcode como UID 0
splice() es el paso crítico. Entrega páginas de la caché al scatterlist escribible del socket AF_ALG sin copiarlas: una optimización in-place de 2017 en algif_aead.c que hizo reutilizables las páginas del buffer de la tubería en el SGL de destino. Cuando se ejecuta authencsn.decrypt(), escribe en esas páginas, que resultan ser la caché de páginas de tu archivo objetivo.
Todas las distribuciones de Linux que incluyen kernels desde el commit 72548b093ee3 (2017) están afectadas.
Escape de contenedores: Copy Fail también es un vector de escape de contenedores. La caché de páginas se comparte entre todos los procesos del host, incluso a través de los límites de los contenedores. La Parte 2 de Xint cubre la explotación en Kubernetes.
COPY-FAIL-Detection-with-Wazuh-4.14.4/
│
├── rules/
│ └── local_rules.xml # 8 reglas de detección de Wazuh (199600-199607)
│
├── auditd/
│ └── cve-2026-31431.rules # Reglas del sensor de syscalls auditd
│
├── sca/
│ └── cve_2026_31431.yml # Política SCA - independiente de la versión del kernel
│
└── docs/
├── pentlab_uid.png # Ejecución del PoC - root obtenido en Kali
├── Rule-199604-TRIGs.png # Regla 199604 - 80 aciertos en pentlab
├── Rule_199604_Wazuh_Server_only.png # Regla 199604 - primera validación
├── Splice_-_Non-root_process.png # Reglas 199600/199601/199604 disparándose
├── Modprobe_-_Possible_Algif_aed_load_attempt.png # Regla 199603
├── Pentlab-PoC.png # Regla 199603 en el agente pentlab
├── exploit_chain_timeline.svg # Cadena de explotación
└── SCA_CVE-2026-31431.png # Puntuación de la política SCA 75%
Dos capas independientes: ninguna depende de la versión del kernel.
El filtro uid!=0 cubre usuarios más allá de las cuentas interactivas: cuentas de servicio (www-data, postgres, jenkins), contenedores y webshells sin sesión de inicio.
Reglas del sensor auditd (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
Comprobaciones de configuración automatizadas cada 12 horas mediante sca/cve_2026_31431.yml. No se requiere versión del kernel.
Nota de ingeniería: Las reglas 199600 y 199601 deben ser hijas de la regla 92600 (proceso Python, profundidad 1), no de la 80700. El motor de reglas de Wazuh sigue una única ruta de cadena por evento. Colocar las reglas de detección en profundidad 2 bajo la 92600 garantiza que ganen la evaluación de cadena frente a reglas hermanas (p. ej., 92603-92606 en 0850-audit_rules.xml que también coinciden con
if_group=audit + exe=python).
# 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
Salida esperada:
-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
Las reglas se proporcionan en rules/local_rules.xml. Puedes fusionar el contenido en tu /var/ossec/etc/rules/local_rules.xml existente o desplegarlo como archivo independiente:
# Opción A - archivo independiente
cp rules/local_rules.xml /var/ossec/etc/rules/cve-2026-31431_rules.xml
# Opción B - añadir a local_rules.xml
cat rules/local_rules.xml >> /var/ossec/etc/rules/local_rules.xml
# Validar sintaxis - debe salir con 0 y cero advertencias
/var/ossec/bin/wazuh-analysisd -t 2>&1 | tail -5
# Reiniciar el gestor
systemctl restart wazuh-manager
cp sca/cve_2026_31431.yml /var/ossec/etc/shared/default/
Añadir a ossec.conf dentro del bloque <sca>:
<policies>
<policy>/var/ossec/etc/shared/default/cve_2026_31431.yml</policy>
</policies>
systemctl restart wazuh-manager
Asegúrate de que Wazuh ingiere el log de auditd:
<!-- Añadir dentro de <ossec_config> -->
<localfile>
<log_format>audit</log_format>
<location>/var/log/audit/audit.log</location>
</localfile>
# Crear un usuario de prueba si es necesario
useradd -m testuser 2>/dev/null || true
# Generar SEÑAL 1 - socket AF_ALG
su - testuser -c "python3 -c \"import socket; socket.socket(38, 5, 0); print('AF_ALG OK')\""
# Generar SEÑAL 3 - ejecución de /usr/bin/su
su - testuser -c "/usr/bin/su --help 2>/dev/null || true"
# Verificar que auditd capturó los eventos
ausearch -k copy_fail_af_alg -ts recent 2>/dev/null | grep "key=\|exe=\|uid=" | head -5
# Verificar que Wazuh generó alertas
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
Puntuación SCA esperada (sistema sin mitigar): 75% (3 aprobadas / 1 fallida - algif_aead no bloqueado)
testuser (uid=1001) ejecutó el PoC de 732 bytes y obtuvo shell root:

Socket AF_ALG + splice() del mismo proceso python - pid=46784 - SE REQUIERE INVESTIGACIÓN INMEDIATA:






Resultados de Discover del panel de Wazuh (agente=pentlab, Hoy):
wazuh-analysisd -t: salida 0 - cero advertencias - las 8 reglas cargadas.
rmmod algif_aead 2>/dev/null || true
echo 'install algif_aead /bin/false' > /etc/modprobe.d/disable-algif-aead.conf
Esto no afecta a dm-crypt/LUKS, kTLS, IPsec, OpenSSL, GnuTLS ni SSH.
Aplica el commit del kernel a664bf3d603d mediante la actualización del kernel de tu distribución. Revierte la optimización in-place de 2017 en algif_aead.c, separando req->src (SGL de TX, donde splice entrega las páginas) de req->dst (SGL de RX, buffer de usuario). Todas las principales distribuciones están distribuyendo el parche.
# Ubuntu / Debian
apt update && apt upgrade linux-generic
# RHEL / Amazon Linux
dnf update kernel
# SUSE
zypper update kernel-default
Kislley Rodrigues (m0us3r) Embajador de Wazuh | Ingeniería de Detección | Blue Team
Reglas de detección, configuración del sensor auditd y política SCA validadas en Wazuh 4.14.4, Ubuntu 24.04.2 LTS (kernel 6.8.0-106-generic) y Kali GNU/Linux 2026.1 (kernel 6.18.12+kali-amd64).
| Fuente | Enlace |
|---|---|
| CISA añade el fallo de acceso root de Linux explotado activamente CVE-2026-31431 al KEV | https://thehackernews.com/2026/05/cisa-adds-actively-exploited-linux-root.html |
Este proyecto se desarrolló como parte del Programa de Embajadores de Wazuh.
Wazuh es una plataforma de seguridad gratuita y de código abierto que proporciona protección unificada XDR y SIEM. Más información en wazuh.com.
| Recurso | Enlace |
|---|
| Sitio oficial del CVE | https://copy.fail/ |
| Informe técnico - 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 |
| Parche del kernel - a664bf3d603d | https://github.com/torvalds/linux/commit/a664bf3d603d |
| Commit vulnerable - 72548b093ee3 | https://github.com/torvalds/linux/commit/72548b093ee3 |
| MITRE ATT&CK T1068 | https://attack.mitre.org/techniques/T1068/ |
| Distribución | Kernel | Estado |
|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws | ROOT CONFIRMADO |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 | ROOT CONFIRMADO |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 | ROOT CONFIRMADO |
| SUSE 16 | 6.12.0-160000.9-default | ROOT CONFIRMADO |
| Kali GNU/Linux 2026.1 | 6.18.12+kali-amd64 | ROOT CONFIRMADO |
| Regla | Padre | Señal | Profundidad | Nivel |
|---|
| 80700 | decoded_as=auditd | ancla auditd (integrada en Wazuh) | 0 | 0 |
| 92600 | 80700 | Ejecución de proceso Python (integrada en Wazuh) | 1 | 0 |
| 199600 | 92600 | Socket AF_ALG - cadena python | 2 | 10 |
| 199601 | 92600 | Syscall splice() - cadena python | 2 | 10 |
| 199604 | 199601 + if_matched=199600 | CADENA DE EXPLOTACIÓN - python (mismo pid/120s) | 3 | 15 |
| 199602 | 80700 | Ejecución de /usr/bin/su | 1 | 6 |
| 199603 | 80700 | Ejecución de modprobe/kmod | 1 | 12 |
| 199605 | 80700 | Socket AF_ALG - no python | 1 | 10 |
| 199606 | 80700 | Syscall splice() - no python | 1 | 10 |
| 199607 | 199606 + if_matched=199605 | CADENA DE EXPLOTACIÓN - no python (mismo pid/120s) | 2 | 15 |
| Regla | Aciertos | Descripción |
|---|
| 199604 | 80 | CADENA DE EXPLOTACIÓN DETECTADA - pid=46784 exe=/usr/bin/python3.13 |
| 199600 | 40 | Socket AF_ALG creado por proceso no root |
| 199603 | 28 | Ejecución de modprobe detectada |
| 199602 | 12 | /usr/bin/su ejecutado |
| Fecha | Evento |
|---|
| 2026-03-23 | Vulnerabilidad reportada al equipo de seguridad del kernel de Linux |
| 2026-03-24 | Confirmación inicial recibida |
| 2026-03-25 | Parches propuestos y revisados |
| 2026-04-01 | Parche confirmado en el kernel principal (a664bf3d603d) |
| 2026-04-22 | Asignado CVE-2026-31431 |
| 2026-04-29 | Divulgación pública - informe de Xint + PoC publicado |
| Dirty Cow (2016-5195) | Dirty Pipe (2022-0847) | Copy Fail (2026-31431) |
|---|
| Condición de carrera | Sí - múltiples intentos | No | No - lógica determinista |
| Puede bloquear el sistema | Sí | No | No |
| Portabilidad | Limitada | Específica de versión | Todas las distros 2017+ |
| Tamaño del exploit | Kilobytes (C) | Cientos de bytes | 732 bytes (stdlib de Python) |
| Detección FIM | Posible | Posible | No posible |
| Comprobación | Título | Riesgo |
|---|
| 31431001 | algif_aead no cargado en memoria | CRÍTICO |
| 31431002 | algif_aead deshabilitado mediante modprobe.d | ALTO |
| 31431003 | auditd activo y en ejecución | ALTO |
| 31431004 | Reglas del sensor CVE-2026-31431 desplegadas | ALTO |
| Catálogo de Vulnerabilidades Explotadas Conocidas | https://www.cisa.gov/known-exploited-vulnerabilities-catalog |
| CVE-2026-31431 - crypto: algif_aead - Revertir a operar fuera de lugar | https://www.cve.org/CVERecord?id=CVE-2026-31431 |