
Orientação de pesquisa e detecção para CVE-2026-31431, uma bypass baseada em io_uring do monitoramento de chamadas de sistema. Fornece regras de detecção para Tetragon, Falco e Wazuh, além de estratégias de endurecimento.
Para o CVE-2026-31431 ("Copy Fail"), demonstramos fraquezas sistemáticas em produtos de segurança mainstream combinando três estratégias de bypass: caminho de I/O assíncrono io_uring, divisão de processos (fork + SCM_RIGHTS) e reutilização de sockets. Através de testes empíricos, provamos que essas técnicas podem evadir praticamente todas as ferramentas de detecção baseadas em syscalls.
O io_uring submete requisições via buffers de anel em memória compartilhada, contornando os pontos de entrada tradicionais de syscalls. Isso significa que:
iou-wrk-XXXXX) executam operações dentro do kernel sem acionar audit_syscall_entry()socket(AF_ALG) podem ser bypassadas via IORING_OP_SOCKET — o seccomp só verifica na entrada do syscall, e as operações do io_uring não passam por essa entradaAo usar fork + SCM_RIGHTS (passagem de fd via socket de domínio Unix), a criação de sockets e as operações de splice podem ser colocadas em processos diferentes:
same_field(audit.pid) do Wazuh quebra — PID do socket ≠ PID do splice, a regra CRITICAL não disparaO PoC original cria um novo socket por iteração (produzindo 40+ chamadas socket(AF_ALG)). A reutilização de sockets cria apenas um socket de escuta; o loop chama accept() que não produz novos eventos de socket. Regras baseadas em count >= N são completamente derrotadas.
caminho io_uring + splice + /etc/passwd + algoritmo authenc + divisão SCM_RIGHTS + reutilização de sockets
Sob essa combinação: ferramentas baseadas em syscalls ficam completamente cegas, a correlação em nível de processo é quebrada, os limites de contagem falham. Apenas a detecção por ponto de convergência com kprobe pode capturar essa combinação.
__sock_create(family=38) é um ponto de convergência impossível de bypassar para todos os caminhos (syscall e io_uring) — AF_ALG é a única API de criptografia em espaço de usuário no kernel Linux. Não importa como os atacantes variem sua abordagem, eles precisam criar um socket AF_ALG. Monitorar essa função no nível LSM fornece 100% de recall e não é afetado por nenhuma variante.
| Produto | Camada de Detecção | Syscall Tradicional | Caminho io_uring | Divisão Multi-Processo | Reutilização de Sockets | Avaliação |
|---|---|---|---|---|---|---|
| Tetragon (kprobe) | Função do kernel | ✅ | ✅ | ✅ | ✅ | Única cobertura de cadeia completa |
| Falco + plugin krsi | fexit/fentry | ✅ | ✅ | ✅ | ✅ | Precisa de krsi para io_uring; apenas entrada |
| Falco (modern_ebpf) | tracepoint de syscall | ✅ | ❌ | ✅ | ✅ | io_uring completamente invisível |
| auditd / Wazuh | auditoria de syscall | ✅ | ❌ | ❌ PID quebrado | ⚠️ | io_uring cego + correlação de PID quebrada |
| Elastic Security Agent | syscall | ✅ | ❌ | ⚠️ | ⚠️ | Igual ao Wazuh; dependente de syscall = cego |
O driver nativo modern_ebpf do Falco apenas captura o caminho de syscall. O plugin krsi é necessário — ele usa rastreamento fexit nas saídas das funções do kernel io_socket() e __sys_socket() para cobrir o caminho io_uring para criação de sockets AF_ALG. Regra de fallback 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]
A abordagem de detecção da regra recomendada: cobre simultaneamente eventos socket (caminho de syscall, usando correspondência de string evt.args contains AF_ALG para contornar a limitação de tipo ENUMFLAGS32) e eventos krsi_socket (caminho io_uring, usando comparação de inteiro krsi.domain = 38). Sem limites de contagem (derrotados pela reutilização de sockets), sem dependência de correlação de PID (derrotada pela divisão multi-processo).
Nota: As três camadas de defesa da regra da comunidade ThreatBear são todas bypassáveis — incompatibilidade de tipo ENUMFLAGS32 (evt.arg[0]=38 sempre falso), reutilização de sockets derrota o limite de contagem (count=1 < 40), divisão multi-processo quebra a correlação de PID. Veja Análise de Bypass de Regra.
O Wazuh depende inteiramente dos eventos de auditoria de syscalls do auditd. As operações do io_uring não passam pela entrada de syscall, então o auditd produz zero eventos e todas as 7 regras do Wazuh falham. O mesmo se aplica ao Elastic Security Agent — produtos dependentes de entrada de syscall são estruturalmente cegos ao caminho io_uring. Veja Análise de Limitações do Wazuh.
O diretório bypass_demo/ contém descrições conceituais das abordagens de bypass de detecção. O código PoC real é apenas para uso interno e não é distribuído publicamente.
| Documento | Conteúdo |
|---|---|
| VULNERABILITY.md | Causa raiz — sobreposição de três mudanças no kernel, cadeia de ataque em 9 etapas, características de escrita no page cache |
| EXPLOIT_VARIANTS.md | 6 dimensões de variantes de exploração — caminho de I/O × submissão de dados × arquivo alvo × algoritmo AEAD × divisão de processos × reutilização de sockets |
| DETECTION_THEORY.md | Teoria de detecção — pontos de convergência vs. divergência, arquitetura de detecção em 4 camadas, correlação temporal multi-sinal |
| Documento | Conteúdo |
|---|---|
| detection/tetragon.md | Recomendado — Tetragon kprobe, 5 probes cobrindo tradicional + io_uring, única detecção de cadeia completa |
| detection/falco.md | Guia de configuração do Falco 0.40.0 + krsi 0.1.0, internals do krsi, solução de problemas |
| detection/wazuh.md | Três principais limitações do Wazuh + auditd: cegueira ao io_uring, quebra de correlação de PID, invisibilidade no page cache |
| detection/rule_bypass.md | Princípios de bypass da regra ThreatBear, verificação empírica anti-bypass da regra recomendada |
| Documento | Conteúdo |
|---|---|
| defense/HARDENING.md | Modelo de defesa em 3 camadas: configuração do kernel → seccomp → namespaces de usuário; análise de segurança do Docker 29.4.2 |