
Verificador Bash somente leitura para a vulnerabilidade Copy Fail do kernel Linux (CVE-2026-31431)
Um pequeno script Bash com poucas dependências que informa se o seu sistema Linux está exposto à vulnerabilidade de escalada de privilégio local Copy Fail (CVE-2026-31431).
O script é somente leitura: nunca explora a falha, nunca carrega módulos do kernel e nunca modifica o sistema.
Copy Fail é um bug lógico no template criptográfico AEAD authencesn do kernel Linux, acessível a partir do espaço do usuário através da interface de socket AF_ALG (algif_aead).
| Campo | Valor |
|---|---|
| CVE | CVE-2026-31431 |
| Divulgado | 2026-04-29 |
| CVSS v3.1 | 7.8 (Alta) |
| Classe | Escalada de Privilégio Local |
| Componente afetado | crypto/authencesn + crypto/algif_aead |
| Introduzido em | 2017 (otimização AEAD in-place em algif_aead.c) |
| Correção na linha principal | commit a664bf3d603d, mesclado em 2026-04-01 |
Um usuário local não privilegiado pode acionar uma escrita controlada de 4 bytes no cache de páginas de qualquer arquivo que possa ler. Uma prova de conceito pública (732 bytes de Python) usa essa primitiva para sobrescrever um binário setuid e obter root em praticamente todas as distribuições convencionais lançadas desde 2017.
Toda distribuição Linux que inclui um kernel construído desde 2017 com algif_aead habilitado. Famílias confirmadamente afetadas incluem:
# Baixar o script
curl -fsSLO https://raw.githubusercontent.com/samanzamani/copy-fail-checker/main/check-copy-fail.sh
# Torná-lo executável
chmod +x check-copy-fail.sh
# Executá-lo
./check-copy-fail.sh
Ou clone o repositório:
git clone https://github.com/samanzamani/copy-fail-checker.git
cd copy-fail-checker
./check-copy-fail.sh
O script não requer root. Executá-lo como seu usuário normal fornece a visão mais realista da superfície de ataque, porque é exatamente o contexto que um atacante teria.
O script executa três verificações independentes e as combina em um único veredito.
Ele lê /etc/os-release e uname -r, depois compara seu kernel em execução com a versão corrigida oficial publicada pela equipe de segurança da sua distribuição. A tabela de versões atualmente cobre:
Se sua distribuição não estiver na tabela, o script recorre às verificações de tempo de execução abaixo.
algif_aeadO script inspeciona quatro coisas sem modificar nada:
lsmod)modinfo)/etc/modprobe.d, /usr/lib/modprobe.d ou /run/modprobe.d/boot/config-<uname> ou /proc/config.gzUm módulo na lista negra, não carregado e não embutido fecha a superfície de ataque mesmo em um kernel não corrigido.
AF_ALGO sinal mais confiável é o que um atacante realmente veria. O script usa uma pequena sonda Python (socket.socket(AF_ALG, SOCK_SEQPACKET, 0) seguida de bind() no template AEAD authencesn(hmac(sha256),cbc(aes))) para descobrir se sockets AF_ALG podem ser criados e vinculados a partir de um contexto não privilegiado. A sonda cria, vincula e imediatamente fecha o socket sem deixar nada explorável.
Se python3 não estiver instalado, a sonda é ignorada e o veredito depende das verificações 1 e 2.
Para pipelines, gerenciamento de configuração ou varredura de frotas, use --json:
./check-copy-fail.sh --json
Exemplo de saída:
{
"verdict": "vulnerable",
"distro_id": "ubuntu",
"distro_version_id": "24.04",
"kernel": "6.8.0-31-generic",
"patched_version": "",
"kernel_status": "unknown",
"module_loaded": 0,
"module_builtin": 0,
"module_available": 1,
"module_blacklisted": 0,
"af_alg_status": "reachable"
}
Esta é a única correção completa. Após a atualização, reinicie para que o novo kernel esteja realmente em execução.
# Debian / Ubuntu
sudo apt update && sudo apt full-upgrade && sudo reboot
# RHEL / AlmaLinux / Rocky / CentOS Stream
sudo dnf clean metadata && sudo dnf upgrade && sudo reboot
# openSUSE / SLES
sudo zypper refresh && sudo zypper update && sudo reboot
# Amazon Linux 2023
sudo dnf upgrade --releasever=latest && sudo reboot
algif_aeadSe você não puder reiniciar em um kernel corrigido agora, coloque o módulo vulnerável na lista negra. Isso quebra qualquer aplicação que use legitimamente cifras AEAD AF_ALG (raro na maioria dos servidores — verifique primeiro em um ambiente de teste).
# Persistir a lista negra entre reinicializações
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf
# Descarregá-lo do kernel em execução agora
sudo rmmod algif_aead 2>/dev/null || true
Se o módulo for embutido, a lista negra não funcionará, mas é possível desabilitar a initcall. Uma reinicialização é necessária.
sudo grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
sudo reboot
Para cargas de trabalho conteinerizadas, também bloqueie a família de sockets AF_ALG em seu perfil seccomp para que um contêiner comprometido não possa alcançar a superfície do kernel.
== System information ==
[INFO] Distribution : Ubuntu 24.04.2 LTS (ubuntu 24.04)
[INFO] Kernel : 6.8.0-31-generic
== Check 1 / 3 — Kernel version ==
[WARN] No vendor-fixed kernel version is recorded for ubuntu 24.04.
[WARN] Falling back to runtime mitigation checks below.
== Check 2 / 3 — algif_aead kernel module ==
[WARN] algif_aead is not loaded but can be autoloaded on demand (no blacklist found).
== Check 3 / 3 — AF_ALG socket reachability ==
[VULN] AF_ALG sockets are reachable from this unprivileged context.
== Verdict ==
[VULN] This system appears to be VULNERABLE to CVE-2026-31431.
[VULN] Apply the vendor kernel update or blacklist algif_aead as a temporary mitigation.
uname -r. Se você estiver executando um kernel fora da árvore ou reconstruído, a comparação de versão pode não refletir se a correção foi realmente retroportada.blocked_permission para AF_ALG simplesmente porque o seccomp está em vigor — o kernel do host em si ainda pode estar vulnerável.MIT — use, modifique e distribua livremente. Sem garantias.
| Distribuição | Kernel corrigido (≥) |
|---|
| AlmaLinux / RHEL / Rocky / CentOS 8 | 4.18.0-553.121.1.el8_10 |
| AlmaLinux / RHEL / Rocky / CentOS 9 | 5.14.0-611.49.2.el9_7 |
| AlmaLinux / RHEL / Rocky / CentOS 10 | 6.12.0-124.52.2.el10_1 |
| Ubuntu 26.04+ ("Resolute") | não afetado |
| Ubuntu 18.04 – 25.10 | contínuo, veja apt |
| Debian (todos os conjuntos) | contínuo, veja DSA |
| Veredito | Código de saída | Significado |
|---|
patched | 0 | Kernel em execução está na versão corrigida pelo fornecedor ou superior. |
mitigated | 0 | AF_ALG está bloqueado e o módulo não está carregado. |
likely_mitigated | 0 | Módulo está na lista negra e não está carregado; nenhuma sonda ao vivo foi possível. |
vulnerable | 1 | Kernel não está corrigido e algif_aead / AF_ALG está acessível. |
unknown | 2 | Sinal insuficiente para decidir. Tratar como potencialmente vulnerável. |
not_applicable | 3 | Não está executando no Linux. |