
Investigación y guía de detección para CVE-2026-31431, una evasión basada en io_uring del monitoreo de llamadas al sistema. Proporciona reglas de detección para Tetragon, Falco y Wazuh, además de estrategias de endurecimiento.
Para CVE-2026-31431 ("Copy Fail"), demostramos debilidades sistemáticas en productos de seguridad convencionales combinando tres estrategias de evasión: ruta de E/S asíncrona io_uring, división de procesos (fork + SCM_RIGHTS) y reutilización de sockets. Mediante pruebas empíricas, demostramos que estas técnicas pueden evadir prácticamente todas las herramientas de detección basadas en syscalls.
io_uring envía solicitudes a través de buffers de anillo de memoria compartida, evadiendo los puntos de entrada tradicionales de syscalls. Esto significa:
iou-wrk-XXXXXaudit_syscall_entry()socket(AF_ALG) pueden evadirse mediante IORING_OP_SOCKET — seccomp solo verifica en la entrada de syscalls, y las operaciones de io_uring no pasan por esa entradaAl usar fork + SCM_RIGHTS (paso de fd a través de sockets de dominio Unix), la creación de sockets y las operaciones de splice pueden colocarse en diferentes procesos:
same_field(audit.pid) de Wazuh se rompe — PID del socket ≠ PID del splice, la regla CRÍTICA no se activaEl PoC original crea un nuevo socket por iteración (produciendo 40+ llamadas socket(AF_ALG)). La reutilización de sockets crea solo un socket de escucha; el bucle llama a accept() que no produce nuevos eventos de socket. Las reglas basadas en count >= N quedan completamente derrotadas.
ruta io_uring + splice + /etc/passwd + algoritmo authenc + división SCM_RIGHTS + reutilización de sockets
Bajo esta combinación: las herramientas basadas en syscalls están completamente ciegas, la correlación a nivel de proceso se rompe, los umbrales de conteo fallan. Solo la detección de punto de convergencia con kprobe puede detectar esta combinación.
__sock_create(family=38) es un punto de convergencia inevitable para todas las rutas (syscall e io_uring) — AF_ALG es la única API criptográfica de espacio de usuario en el kernel de Linux. No importa cómo los atacantes varíen su enfoque, deben crear un socket AF_ALG. Monitorear esta función a nivel LSM proporciona un 100% de recall y no se ve afectado por ninguna variante.
| Producto | Capa de Detección | Syscall Tradicional | Ruta io_uring | División Multi-Proceso | Reutilización de Sockets | Evaluación |
|---|---|---|---|---|---|---|
| Tetragon (kprobe) | Función del kernel | ✅ | ✅ | ✅ | ✅ | Única cobertura de cadena completa |
| Falco + plugin krsi | fexit/fentry | ✅ | ✅ | ✅ | ✅ | Requiere krsi para io_uring; solo entrada |
| Falco (modern_ebpf) | tracepoint de syscall | ✅ | ❌ | ✅ | ✅ | io_uring completamente invisible |
| auditd / Wazuh | auditoría de syscall | ✅ | ❌ | ❌ PID roto | ⚠️ | io_uring ciego + correlación PID rota |
| Elastic Security Agent | syscall | ✅ | ❌ | ⚠️ | ⚠️ | Igual que Wazuh; dependiente de syscall = ciego |
El driver nativo modern_ebpf de Falco solo captura la ruta de syscalls. El plugin krsi es obligatorio — utiliza trazado fexit en las salidas de las funciones del kernel io_socket() y __sys_socket() para cubrir la ruta io_uring en la creación de sockets AF_ALG. Regla de respaldo recomendada:
- rule: AF_ALG Socket Created
condition: >
(evt.type = socket and evt.args contains AF_ALG) or
(evt.type = krsi_socket and krsi.domain = 38)
output: >
AF_ALG socket created (source=%evt.type domain=%evt.arg.domain
krsi_domain=%krsi.domain proc=%proc.name pid=%proc.pid)
priority: WARNING
tags: [cve-2026-31431, crypto, container_escape]
El enfoque de detección de la regla recomendada: cubre simultáneamente eventos socket (ruta de syscall, usando coincidencia de cadena evt.args contains AF_ALG para evadir la limitación de tipo ENUMFLAGS32) y eventos krsi_socket (ruta io_uring, usando comparación de enteros krsi.domain = 38). Sin umbrales de conteo (derrotados por la reutilización de sockets), sin dependencia de correlación PID (derrotada por la división multi-proceso).
Nota: Las tres capas de defensa de la regla comunitaria ThreatBear son todas evadibles — desajuste de tipo ENUMFLAGS32 (evt.arg[0]=38 siempre falso), la reutilización de sockets derrota el umbral de conteo (count=1 < 40), la división multi-proceso rompe la correlación PID. Ver Análisis de Evasión de Reglas.
Wazuh depende completamente de los eventos de auditoría de syscalls de auditd. Las operaciones de io_uring no pasan por la entrada de syscalls, por lo que auditd produce cero eventos y las 7 reglas de Wazuh fallan. Lo mismo aplica a Elastic Security Agent — los productos dependientes de la entrada de syscalls son estructuralmente ciegos a la ruta io_uring. Ver Análisis de Limitaciones de Wazuh.
El directorio bypass_demo/ contiene descripciones conceptuales de los enfoques de evasión de detección. El código PoC real es solo para uso interno y no se distribuye públicamente.
| Documento | Contenido |
|---|---|
| VULNERABILITY.md | Causa raíz — superposición de tres cambios del kernel, cadena de ataque de 9 pasos, características de escritura en caché de páginas |
| EXPLOIT_VARIANTS.md | 6 dimensiones de variantes de explotación — ruta de E/S × envío de datos × archivo objetivo × algoritmo AEAD × división de procesos × reutilización de sockets |
| DETECTION_THEORY.md | Teoría de detección — puntos de convergencia vs. divergencia, arquitectura de detección de 4 capas, correlación temporal multi-señal |
| Documento | Contenido |
|---|---|
| detection/tetragon.md | Recomendado — Tetragon kprobe, 5 sondas que cubren tradicional + io_uring, única detección de cadena completa |
| detection/falco.md | Guía de configuración de Falco 0.40.0 + krsi 0.1.0, internals de krsi, solución de problemas |
| detection/wazuh.md | Tres limitaciones principales de Wazuh + auditd: ceguera a io_uring, ruptura de correlación PID, invisibilidad en caché de páginas |
| detection/rule_bypass.md | Principios de evasión de la regla ThreatBear, verificación empírica anti-evasión de la regla recomendada |
| Documento | Contenido |
|---|---|
| defense/HARDENING.md | Modelo de defensa de 3 capas: configuración del kernel → seccomp → namespaces de usuario; análisis de seguridad de Docker 29.4.2 |