
Detecte e mitigue o CVE-2026-31431 (Copy Fail) em sistemas Linux.
Uma CLI Python sem dependências que verifica se um host Linux parece exposto ao CVE-2026-31431 ("Copy Fail") sem executar um exploit. Também pode aplicar uma mitigação temporária conservadora quando o componente afetado pode ser carregado como módulo de kernel. Suporta Debian/Ubuntu, RHEL/Rocky/AlmaLinux, Fedora e SUSE.
pip install copyfail-guard
copyfail-guard
O CVE-2026-31431 é um bug lógico na interface de kernel algif_aead (socket AF_ALG AEAD)
que permite que um usuário local sem privilégios realize uma escrita controlada de 4 bytes
no cache de páginas de qualquer arquivo legível, levando à escalada de privilégios para root.
CVSS 7.8, presente desde o kernel 4.14, corrigido em versões estáveis a partir de abril de 2026.
Existe um exploit público e a vulnerabilidade está listada no CISA KEV.
Algumas verificações de vulnerabilidade se resumem a "executar o exploit e ver se funciona". Isso não é uma boa prática em hosts de produção. O copyfail-guard adota uma abordagem sem exploit. Ele não tenta acionar o bug, modificar binários setuid ou comprovar explorabilidade. Em vez disso, inspeciona o estado do host (versão do kernel, status de carregamento do módulo, configuração do modprobe) e informa se a máquina parece exposta.
| Subcomando | Ação |
|---|---|
detect | Combina cinco sinais (versão do kernel, /proc/modules, modules.builtin, modules.dep, configuração do modprobe) em um de seis veredictos |
fix | Grava atomicamente uma regra modprobe install algif_aead /bin/false e tenta descarregar algif_aead |
reset | Remove a regra modprobe instalada por fix (execute após atualizar para um kernel corrigido) |
O fix é intencionalmente mínimo — ele não chama o gerenciador de pacotes.
A correção permanente exige a atualização do kernel pelo mecanismo de atualização
normal da sua distribuição.
pip install copyfail-guard
Ou execute diretamente de um checkout sem instalar:
PYTHONPATH=src python3 -m copyfail_guard detect
copyfail-guard [--json] [--dry-run] [--quiet] [detect | fix | reset]
$ copyfail-guard
[copyfail-guard] CVE-2026-31431 (Copy Fail) — VULNERÁVEL
Distribuição: Ubuntu 24.04.1 LTS (família debian)
Kernel: 6.8.0-50-generic (ramo 6.12, corrigido em 6.12.85)
Módulo: algif_aead — carregado como .ko
Mitigação: nenhuma
Ações recomendadas:
1. Aplicar mitigação agora:
sudo copyfail-guard fix
2. Atualizar o kernel para uma correção permanente:
Atualize o kernel neste sistema para 6.12.85 ou posterior (o que a sua
distribuição fornecer após integrar a correção do CVE-2026-31431) e reinicie.
Sempre visualize com --dry-run antes de aplicar:
$ sudo copyfail-guard --dry-run fix
[copyfail-guard] fix (dry-run) — OK
[ ok ] Verificações de pré-voo (Linux, host, root)
[skip] Gravaria blacklist do modprobe [/etc/modprobe.d/cve-2026-31431-copyfail-guard.conf]
[skip] Tentaria descarregar algif_aead (não carregado atualmente) [algif_aead]
[skip] Adicionaria registro de auditoria [/var/log/copyfail-guard.log]
$ sudo copyfail-guard fix
[copyfail-guard] fix — OK
[ ok ] Verificações de pré-voo (Linux, host, root)
[ ok ] Blacklist do modprobe gravada [/etc/modprobe.d/cve-2026-31431-copyfail-guard.conf]
[ ok ] algif_aead descarregado [algif_aead]
[ ok ] Registro de auditoria adicionado [/var/log/copyfail-guard.log]
Próximo passo para uma correção permanente:
Atualize o kernel para uma versão corrigida do CVE-2026-31431 usando o
mecanismo de atualização normal da sua distribuição e reinicie.
Se o módulo estiver em uso no momento, a etapa de descarregamento pode falhar. Nesse caso, a regra modprobe persistente ainda pode ser instalada com sucesso, e o copyfail-guard relatará a falha de descarregamento como um registro de ação estilo aviso, em vez de fingir que o módulo foi removido.
--json emite um documento estruturado no stdout, adequado para pipelines jq, Ansible ou SOAR:
$ copyfail-guard --json | jq .verdict
"vulnerable"
$ copyfail-guard --json | jq '{verdict, kernel: .kernel.patched_threshold}'
{
"verdict": "vulnerable",
"kernel": "6.12.85"
}
| Código | Significado |
|---|---|
0 | Seguro — veredicto é patched, mitigated ou not_applicable; ou a etapa de correção persistente foi bem-sucedida |
1 | Vulnerável — veredicto é vulnerable ou unmitigable_builtin |
2 | Erro — o estado não pôde ser determinado, pré-condição recusada ou a etapa de correção persistente falhou |
| Veredicto | Descrição |
|---|---|
patched | O kernel em execução está na versão corrigida ou além dela |
mitigated | O kernel é vulnerável, mas algif_aead está bloqueado pela configuração do modprobe |
not_applicable | O kernel é vulnerável, mas algif_aead não está presente neste sistema |
vulnerable | O kernel é vulnerável, o módulo pode ser carregado, sem mitigação em vigor |
unmitigable_builtin | algif_aead está compilado na imagem do kernel — a mitigação via modprobe não tem efeito; atualização do kernel é necessária |
unknown | A versão do kernel não pôde ser analisada ou está fora do intervalo avaliado |
Após atualizar para um kernel corrigido, use o subcomando reset para remover a
regra modprobe instalada por fix:
$ sudo copyfail-guard --dry-run reset
[copyfail-guard] reset (dry-run) — OK
[skip] Removeria /etc/modprobe.d/cve-2026-31431-copyfail-guard.conf
$ sudo copyfail-guard reset
[copyfail-guard] reset — OK
[ ok ] Removido /etc/modprobe.d/cve-2026-31431-copyfail-guard.conf
Reinicie para permitir que algif_aead seja carregado novamente, se necessário.
O reset é idempotente — se o arquivo já estiver ausente, ele sai com 0 e uma
mensagem "nada a fazer". Em seguida, reinicie.
Contêineres. O fix se recusa a executar dentro de um contêiner porque /proc/modules
reflete o kernel do host, mas o contêiner não tem autoridade para carregar ou descarregar
módulos. Execute o copyfail-guard diretamente no host.
algif_aead embutido. Alguns kernels compilam algif_aead diretamente na
imagem (CONFIG_CRYPTO_USER_API_AEAD=y). A mitigação via modprobe não tem efeito
nessa configuração; a única correção é uma atualização do kernel. O detect relata
unmitigable_builtin nesse caso. Executar fix ainda instalará a regra modprobe
(que impede que qualquer cópia carregável coexistente seja carregada), mas a instância
embutida não é afetada — atualização do kernel e reinicialização são o único remédio real.
blacklist vs install … /bin/false. Ambas as diretivas bloqueiam o
auto-carregamento comum, mas install algif_aead /bin/false é mais forte porque também
bloqueia invocações explícitas comuns de modprobe algif_aead. Um administrador com
privilégios suficientes ainda pode contornar a política do modprobe, por exemplo, usando
ferramentas de carregamento de módulos de baixo nível ou flags especiais do modprobe.
O copyfail-guard sempre instala a forma mais forte. Se o seu sistema já tiver uma diretiva
blacklist simples, a ferramenta relata mitigated, mas emite uma nota recomendando a atualização.
SELinux/AppArmor. Gravações em /etc/modprobe.d/ no RHEL normalmente herdam
system_u:object_r:modules_conf_t:s0 do diretório pai, portanto, normalmente nenhuma
reclassificação manual deve ser necessária para o arquivo que o copyfail-guard grava.
initramfs. O algif_aead normalmente não é incluído na imagem de inicialização nas
principais distribuições, portanto, o copyfail-guard não executa update-initramfs -u ou
dracut -f após instalar a regra modprobe. Se a sua distribuição ou build local incluir
algif_aead no initramfs, siga as orientações de kernel/módulo da sua distribuição.
Apache 2.0 — consulte LICENSE.