
Exploit e detector para uma escalada local de privilégios no kernel Linux (CVE-2026-31431) que corrompe o cache de páginas para obter acesso root, com orientações de mitigação.
Uma falha crítica de 9 anos no kernel Linux que permite obter acesso root em segundos
| Atributo | Detalhes |
|---|---|
| CVE | CVE-2026-31431 |
| Apelido | Copy Fail |
| Tipo | Escalonamento de Privilégios Local (LPE) |
| CVSS | 7.8 (High) |
| Descoberto por | Theori (Xint Code) |
| Divulgação | 29 de abril de 2026 |
| Componente | Subsistema algif_aead do kernel Linux |
Falha na otimização de "operação no local" (in-place) introduzida em 2017 (commit 72548b093ee3). Permite que um usuário local realize uma escrita controlada de 4 bytes diretamente no cache de páginas do kernel.
AF_ALG para acessar algoritmos criptográficos do kernel/usr/bin/su) ou arquivos sensíveis (/etc/passwd)É um bug lógico de design, não um estouro de memória. Exigia análise profunda do subsistema criptográfico para ser detectado.
# Ubuntu/Debian
sudo apt update
sudo apt upgrade
sudo reboot
# RHEL/AlmaLinux/Rocky
sudo dnf update kernel
sudo reboot
# Verificar versão do kernel
uname -r
⚠️ A reinicialização é obrigatória para ativar o novo kernel.
# Desabilitar o carregamento do módulo vulnerável
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/copyfail_mitigation.conf
# Descarregar o módulo se já estiver em uso
sudo rmmod algif_aead
# O módulo geralmente está integrado ao kernel
# Adicionar parâmetro de boot para desabilitá-lo
sudo grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
# Reiniciar para aplicar as alterações
sudo reboot
# Purgar o cache de páginas a quente
sudo sysctl -w vm.drop_caches=3
⚠️ Nota: Isso não substitui o patch. É apenas uma medida complementar.
| Data | Evento |
|---|---|
| 29 de abril | Divulgação pública pela Theori |
| 1 de maio |
# Obter versão do kernel
uname -r
# Vulnerável se:
# - v4.14 a v7.0-rc (lançado entre 2017 e abril 2026)
# - Contém o commit 72548b093ee3
# Verificar se o módulo algif_aead está carregado
lsmod | grep algif_aead
# Se aparecer na lista, seu sistema é vulnerável
Uma IA identificou esta falha que passou despercebida para os desenvolvedores durante 9 anos. Isso marca um antes e um depois:
# 1. Detect
python3 prueba.py
# exit 0 = not vulnerable, 2 = vulnerable, 1 = test error
# 2. Exploit (interactive — su will prompt for your own password)
python3 exploit.py --shell
python3 prueba.py
O que faz:
Confirma que AF_ALG e o algoritmo authencesn(hmac(sha256),cbc(aes))
são acessíveis a partir de um processo sem privilégios.
Cria um arquivo sentinela de 4 KiB em um diretório temporário e preenche o cache de páginas.
Envia 8 bytes de AAD inline via sendmsg+cmsg com seqno_lo definido para
o marcador PWND, e então copia 32 bytes da página do cache de páginas da sentinela para o socket de operação AF_ALG via os.splice().
Chama recv() para iniciar a descriptografia. A verificação de autenticação falha com
EBADMSG; a escrita temporária é executada mesmo assim.
Relê o arquivo (cache de páginas, não o disco) e procura pelo marcador.
Classes de saída:
Condição prévia não atendida: AF_ALG ou authencesn não disponíveis. Saída 0.VULNERÁVEL a CVE-2026-31431: o marcador PWND foi inserido na página modificada.Saída 2.
Cache de página MODIFICADA via caminho de inserção AEAD in-place: foi feita escrita na página,
mas o marcador não foi inserido na posição esperada.
Tratar como vulnerável. Saída 2.Cache de página intacta: corrigido. Saída 0.O detector nunca modifica /usr/bin/su, /etc/passwd nem qualquer outro arquivo fora do diretório temporário que cria, e tal arquivo é removido ao finalizar.
Saída. ## Uso do LPE
python3 exploit_cve_2026_31431.py # Apenas aplica o patch, imprime os próximos passos
python3 exploit_cve_2026_31431.py --shell # Aplica o patch e executa `su <usuário>`
Função:
/etc/passwd e encontra odeslocamento de bytes do campo UID de 4 caracteres.
write4 nesse deslocamento, substituindo o UID por0000.
pwd.getpwnam(usuário) para confirmar que a libc agora informa UID 0.--shell, executa execvp("su", ["su", usuário]). Digite sua própria
senha. O PAM valida contra /etc/shadow (sem modificação), entãosetuid(getpwnam(user).pw_uid) é definido para 0.
exigem escritas de múltiplos disparos; estenda write4 conforme necessário.
Nenhum daemon de cache NSS (nscd, sssd, systemd-userdbd) está mascarando
as leituras de /etc/passwd. Se getpwnam ainda retornar o UID real após
a aplicação do patch, reinicie ou ignore o cache, ou selecione um usuário diferente.
A página /etc/passwd deve permanecer no cache entre a aplicação do patch e a
execução de su. Na prática, isso é confiável em qualquer sistema com pressão de memória normal.
O arquivo /etc/passwd no disco permanece inalterado.
A execução de teste (exploit_cve_2026_31431.py sem --shell) remove automaticamente
a página corrompida ao sair via POSIX_FADV_DONTNEED, portanto as buscas de UID → nome
voltam ao normal imediatamente.
Após usar --shell**, a página permanece corrompida até ser limpa.
Enquanto estiver corrompida, qualquer operação que resolva UID 1000 → nome (por exemplo, ls,
gerenciadores de arquivos, verificações de propriedade de scp/sftp) falhará ou exibirá identificadores numéricos. Para limpá-la:
# Sem privilégios: solicita a remoção do cache de páginas de /etc/passwd:
python3 -c "import os; fd=os.open('/etc/passwd', os.O_RDONLY); \
os.posix_fadvise(fd, 0, 0, os.POSIX_FADV_DONTNEED); os.close(fd)"
# Do console de root:
echo 3 > /proc/sys/vm/drop_caches
Uma reinicialização também a limpa.
write4sendmsg([AAD de 8 bytes], cmsg=[ALG_SET_OP=DECRYPT, ALG_SET_IV, ALG_SET_AEAD_ASSOCLEN=8],
flags=MSG_MORE)
splice(target_fd, pipe_w, 32, offset_src=file_offset)
splice(pipe_r, op_fd, 32)
recv(op_fd) # EBADMSG; a escrita temporária já foi realizada
Os 4 bytes das posições 4 a 7 do AAD (seqno_lo) são escritos por
authencesn na lista de dispersão de destino, que neste caminho de código
é a página do cache de páginas que extraímos de target_fd. O deslocamento de aterrissagem
dentro da página corresponde ao offset_src que passamos para splice().
Até que o kernel corrigido chegue à sua distribuição:
sudo tee /etc/modprobe.d/disable-algif-aead.conf <<<'install algif_aead /bin/false'
sudo rmmod algif_aead 2>/dev/null
Após aplicar o patch, test_cve_2026_31431.py deve exibir a mensagem «Condição prévia
não atendida» e sair com código 0.
A correção original reverte as operações AEAD in-place para operações fora do local, mantendo as páginas do cache de páginas fora das listas de dispersão modificáveis.
algif_aeadalgif_aead em logs de auditoriaÚltima atualização: 3 de maio de 2026
Status: 🔴 CRÍTICO - Ação imediata necessária
| Primeiras tentativas de exploração ativa detectadas |
| 2 de maio | CISA ordena que agências federais dos EUA apliquem patch antes de 15 de maio |
| 3 de maio | Patches disponíveis em Ubuntu, RHEL, AlmaLinux, Debian |
| Distribuição | Status | Referência |
|---|
| Ubuntu | ✅ Corrigido | USN-8226-1 (20.04, 22.04, 24.04) |
| RHEL/AlmaLinux/Rocky | ✅ Disponível | Desde 1 de maio |
| Debian | ✅ Nos repositórios de segurança | Atualização disponível |
| Android | ⏳ Em breve | Boletim de segurança de junho 2026 |