
Wazuh 4.14.4 regras de detecção para CVE-2026-31431 (Copy Fail) - Escalação de privilégios local no Linux via gravação no cache de página do authencesn
Engenharia de detecção para o LPE do kernel Copy Fail · Ubuntu / RHEL / SUSE / Amazon Linux 2023 / Kali
CVE-2026-31431 é um bug lógico no template criptográfico authencesn do kernel Linux. Ele permite que qualquer usuário local sem privilégios realize uma gravação determinística e controlada de 4 bytes no cache de páginas de qualquer arquivo legível no sistema - sem exigir condições de corrida, offsets do kernel ou privilégios elevados.
Um script Python 3.10+ de 732 bytes usando apenas módulos da biblioteca padrão (os, socket, zlib) explora a vulnerabilidade para obter root em todas as principais distribuições Linux lançadas desde 2017.
O arquivo em disco permanece inalterado, tornando o monitoramento tradicional de integridade de arquivos (FIM) completamente cego.
Descoberto por Taeyang Lee (Theori / Xint) com a assistência da ferramenta de IA Xint Code.
A gravação atinge apenas o cache de páginas em memória. O kernel nunca marca a página como suja, então o mecanismo de writeback nunca a persiste em disco. O binário em disco permanece byte a byte idêntico ao original.
Abordagem tradicional de FIM:
ler arquivo do disco -> calcular hash -> comparar -> nenhuma anomalia relatada
Realidade do Copy Fail:
arquivo em disco = INALTERADO
cache de páginas = CORROMPIDO
resultado do FIM = CEGO
A única detecção eficaz é comportamental, por meio do monitoramento de syscalls. Este repositório fornece regras Wazuh validadas em produção que detectam a cadeia de exploração no nível de syscalls do kernel.
Passo 1: socket(38, 5, 0) Socket AF_ALG - nenhum privilégio necessário
Passo 2: bind() Vincular ao authencesn - ativa o código vulnerável
Passo 3: sendmsg() Criar payload AAD - bytes 4-7 = valor a gravar
Passo 4: splice() [!] GATILHO - páginas do cache de páginas entram no SGL gravável
Passo 5: recv() authencesn grava seqno_lo no cache de páginas
Passo 6: execve(/usr/bin/su) Binário setuid corrompido executa shellcode como UID 0
splice() é o passo crítico. Ele entrega páginas do cache de páginas no scatterlist gravável do socket AF_ALG sem cópia - uma otimização in-place de 2017 em algif_aead.c que tornou páginas do buffer do pipe reutilizáveis no SGL de destino. Quando authencesn.decrypt() é executado, ele grava nessas páginas, que por acaso são o cache de páginas do seu arquivo alvo.
Todas as distribuições Linux que fornecem kernels desde o commit 72548b093ee3 (2017) são afetadas.
Escape de contêiner: Copy Fail também é um vetor de escape de contêiner. O cache de páginas é compartilhado entre todos os processos do host, inclusive através dos limites dos contêineres. A Parte 2 da Xint cobre a exploração em Kubernetes.
COPY-FAIL-Detection-with-Wazuh-4.14.4/
│
├── rules/
│ └── local_rules.xml # 8 regras de detecção Wazuh (199600-199607)
│
├── auditd/
│ └── cve-2026-31431.rules # Regras do sensor de syscalls auditd
│
├── sca/
│ └── cve_2026_31431.yml # Política SCA - independente da versão do kernel
│
└── docs/
├── pentlab_uid.png # Execução do PoC - root obtido no Kali
├── Rule-199604-TRIGs.png # Regra 199604 - 80 ocorrências no pentlab
├── Rule_199604_Wazuh_Server_only.png # Regra 199604 - primeira validação
├── Splice_-_Non-root_process.png # Regras 199600/199601/199604 disparando
├── Modprobe_-_Possible_Algif_aed_load_attempt.png # Regra 199603
├── Pentlab-PoC.png # Regra 199603 no agente pentlab
├── exploit_chain_timeline.svg # Cadeia de Exploração
└── SCA_CVE-2026-31431.png # Pontuação da política SCA 75%
Duas camadas independentes — nenhuma depende da versão do kernel.
O filtro uid!=0 cobre usuários além das contas interativas: contas de serviço (www-data, postgres, jenkins), contêineres e web shells sem sessão de login.
Regras do 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
Verificações de configuração automatizadas a cada 12 horas via sca/cve_2026_31431.yml. Nenhuma versão do kernel necessária.
Nota de engenharia: As regras 199600 e 199601 devem ser filhas da regra 92600 (processo Python, profundidade 1), não da 80700. O mecanismo de regras do Wazuh segue um único caminho de cadeia por evento. Colocar as regras de detecção na profundidade 2 sob a 92600 garante que elas vençam a avaliação da cadeia sobre regras irmãs (ex.: 92603-92606 em 0850-audit_rules.xml que também correspondem a
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
Saída 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
As regras são fornecidas em rules/local_rules.xml. Você pode mesclar o conteúdo no seu /var/ossec/etc/rules/local_rules.xml existente ou implantar como um arquivo independente:
# Opção A - arquivo independente
cp rules/local_rules.xml /var/ossec/etc/rules/cve-2026-31431_rules.xml
# Opção B - anexar ao local_rules.xml
cat rules/local_rules.xml >> /var/ossec/etc/rules/local_rules.xml
# Validar sintaxe - deve sair com 0 e zero avisos
/var/ossec/bin/wazuh-analysisd -t 2>&1 | tail -5
# Reiniciar o gerenciador
systemctl restart wazuh-manager
cp sca/cve_2026_31431.yml /var/ossec/etc/shared/default/
Adicione ao ossec.conf dentro do bloco <sca>:
<policies>
<policy>/var/ossec/etc/shared/default/cve_2026_31431.yml</policy>
</policies>
systemctl restart wazuh-manager
Garanta que o Wazuh ingira o log do auditd:
<!-- Adicione dentro de <ossec_config> -->
<localfile>
<log_format>audit</log_format>
<location>/var/log/audit/audit.log</location>
</localfile>
# Crie um usuário de teste se necessário
useradd -m testuser 2>/dev/null || true
# Gerar SINAL 1 - Socket AF_ALG
su - testuser -c "python3 -c \"import socket; socket.socket(38, 5, 0); print('AF_ALG OK')\""
# Gerar SINAL 3 - Execução de /usr/bin/su
su - testuser -c "/usr/bin/su --help 2>/dev/null || true"
# Verificar se o auditd capturou os eventos
ausearch -k copy_fail_af_alg -ts recent 2>/dev/null | grep "key=\|exe=\|uid=" | head -5
# Verificar se o Wazuh gerou 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
Pontuação SCA esperada (sistema sem mitigação): 75% (3 aprovados / 1 reprovado - algif_aead não bloqueado)
testuser (uid=1001) executou o PoC de 732 bytes e obteve shell root:

Socket AF_ALG + splice() do mesmo processo python - pid=46784 - INVESTIGAÇÃO IMEDIATA NECESSÁRIA:






Resultados do Discover no Dashboard Wazuh (agente=pentlab, Hoje):
wazuh-analysisd -t: saída 0 - zero avisos - todas as 8 regras carregadas.
rmmod algif_aead 2>/dev/null || true
echo 'install algif_aead /bin/false' > /etc/modprobe.d/disable-algif-aead.conf
Isso não afeta dm-crypt/LUKS, kTLS, IPsec, OpenSSL, GnuTLS ou SSH.
Aplique o commit do kernel a664bf3d603d por meio da atualização do kernel da sua distribuição. Ele reverte a otimização in-place de 2017 em algif_aead.c, separando req->src (SGL de TX, onde splice entrega as páginas) de req->dst (SGL de RX, buffer do usuário). Todas as principais distribuições estão fornecendo a correção.
# Ubuntu / Debian
apt update && apt upgrade linux-generic
# RHEL / Amazon Linux
dnf update kernel
# SUSE
zypper update kernel-default
Kislley Rodrigues (m0us3r) Embaixador Wazuh | Engenharia de Detecção | Blue Team
Regras de detecção, configuração do sensor auditd e política SCA validadas no Wazuh 4.14.4, Ubuntu 24.04.2 LTS (kernel 6.8.0-106-generic) e Kali GNU/Linux 2026.1 (kernel 6.18.12+kali-amd64).
| Fonte | Link |
|---|---|
| CISA Adiciona Bug de Acesso Root Linux Explorado Ativamente CVE-2026-31431 ao KEV | https://thehackernews.com/2026/05/cisa-adds-actively-exploited-linux-root.html |
Este projeto foi desenvolvido como parte do Programa de Embaixadores Wazuh.
O Wazuh é uma plataforma de segurança gratuita e de código aberto que fornece proteção unificada de XDR e SIEM. Saiba mais em wazuh.com.
| Recurso | Link |
|---|
| Site Oficial do CVE | https://copy.fail/ |
| Artigo 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 |
| Correção do Kernel - a664bf3d603d | https://github.com/torvalds/linux/commit/a664bf3d603d |
| Commit Vulnerável - 72548b093ee3 | https://github.com/torvalds/linux/commit/72548b093ee3 |
| MITRE ATT&CK T1068 | https://attack.mitre.org/techniques/T1068/ |
| Distribuição | Kernel | Status |
|---|
| 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 |
| Regra | Pai | Sinal | Profundidade | Nível |
|---|
| 80700 | decoded_as=auditd | âncora auditd (integrada ao Wazuh) | 0 | 0 |
| 92600 | 80700 | Execução de processo Python (integrada ao Wazuh) | 1 | 0 |
| 199600 | 92600 | Socket AF_ALG - cadeia python | 2 | 10 |
| 199601 | 92600 | Syscall splice() - cadeia python | 2 | 10 |
| 199604 | 199601 + if_matched=199600 | CADEIA DE EXPLORAÇÃO - python (mesmo pid/120s) | 3 | 15 |
| 199602 | 80700 | Execução de /usr/bin/su | 1 | 6 |
| 199603 | 80700 | Execução de modprobe/kmod | 1 | 12 |
| 199605 | 80700 | Socket AF_ALG - não-python | 1 | 10 |
| 199606 | 80700 | Syscall splice() - não-python | 1 | 10 |
| 199607 | 199606 + if_matched=199605 | CADEIA DE EXPLORAÇÃO - não-python (mesmo pid/120s) | 2 | 15 |
| Regra | Ocorrências | Descrição |
|---|
| 199604 | 80 | CADEIA DE EXPLORAÇÃO DETECTADA - pid=46784 exe=/usr/bin/python3.13 |
| 199600 | 40 | Socket AF_ALG criado por processo não-root |
| 199603 | 28 | Execução de modprobe detectada |
| 199602 | 12 | /usr/bin/su executado |
| Data | Evento |
|---|
| 2026-03-23 | Vulnerabilidade relatada à equipe de segurança do kernel Linux |
| 2026-03-24 | Confirmação inicial recebida |
| 2026-03-25 | Patches propostos e revisados |
| 2026-04-01 | Patch commitado no kernel mainline (a664bf3d603d) |
| 2026-04-22 | CVE-2026-31431 atribuído |
| 2026-04-29 | Divulgação pública - artigo da Xint + PoC publicados |
| Dirty Cow (2016-5195) | Dirty Pipe (2022-0847) | Copy Fail (2026-31431) |
|---|
| Condição de corrida | Sim - múltiplas tentativas | Não | Não - lógica determinística |
| Pode travar o sistema | Sim | Não | Não |
| Portabilidade | Limitada | Específica da versão | Todas as distros 2017+ |
| Tamanho do exploit | Kilobytes (C) | Centenas de bytes | 732 bytes (stdlib Python) |
| Detecção por FIM | Possível | Possível | Não possível |
| Verificação | Título | Risco |
|---|
| 31431001 | algif_aead não carregado em memória | CRÍTICO |
| 31431002 | algif_aead desabilitado via modprobe.d | ALTO |
| 31431003 | auditd ativo e em execução | ALTO |
| 31431004 | Regras do sensor CVE-2026-31431 implantadas | ALTO |
| Catálogo de Vulnerabilidades Exploradas Conhecidas | https://www.cisa.gov/known-exploited-vulnerabilities-catalog |
| CVE-2026-31431 - crypto: algif_aead - Reverter para operação fora do local | https://www.cve.org/CVERecord?id=CVE-2026-31431 |