
Análise - POC - Mitigação
Apenas para fins educacionais. NÃO utilize em sistemas sem autorização explícita.
| Campo | Valor |
|---|---|
| CVE | CVE-2026-31431 |
| Alias | Copy Fail |
| CVSS | 7.8 (High) |
| Tipo | Local Privilege Escalation (LPE) |
| Kernel afetado | 2017 – 2026 (commit 72548b093ee3 em diante) |
| Correção upstream | commit a664bf3d603d (revert de 2017) |
| Divulgação | 29 de abril de 2026 (Theori / Xint Code) |
Copy Fail é um bug lógico determinístico (não requer race conditions) no subsistema criptográfico do kernel Linux. Permite a um usuário sem privilégios escrever 4 bytes controlados no page cache de qualquer arquivo legível do sistema, incluindo binários setuid como su ou sudo.
Diferente de vulnerabilidades anteriores similares:
Linux kernel — crypto/authencesn.c
└── algif_aead (módulo AF_ALG)
└── otimização in-place (commit 72548b093ee3, 2017)
└── Escrita scratch AEAD → cruza boundary do scatterlist
└── escreve 4 bytes no page cache de arquivo externo
Distribuições afetadas: Ubuntu, Debian, RHEL, Amazon Linux, SUSE, Fedora, Arch, AlmaLinux — qualquer distro com kernel ≥ 2017.
Em 2017 foi introduzida uma otimização que faz com que req->src e req->dst apontem para o mesmo scatterlist combinado. Isso faz com que as páginas do page cache (provenientes de splice()) fiquem encadeadas diretamente no scatterlist de destino gravavel.
1. Abrir socket AF_ALG com algoritmo authencesn
2. Usar splice() para alimentar páginas do page cache do binário alvo
para o socket AF_ALG (ex: /usr/bin/sudo)
3. Executar operação de descriptografia AEAD
4. authencesn usa o buffer de destino como scratch pad →
escreve seqno_hi (4 bytes controlados) FORA da saída legítima,
cruzando o boundary do scatterlist
5. Os 4 bytes aterrissam na página do page cache do binário alvo
6. O arquivo em disco NÃO muda → as verificações de integridade não detectam nada
7. O binário modificado em memória executa payload → root
A escrita desvia do caminho normal de escrita do VFS. O arquivo em disco permanece intacto. Ferramentas como sha256sum, aide, tripwire, ou inotify não detectam a mudança porque operam sobre o arquivo em disco ou sobre o inode, não sobre o page cache em memória.
O lab usa um kernel vulnerável para demonstrar a corrupção do page cache. Em ambientes Docker, a escalada completa de privilégios depende da configuração do host (kernel compartilhado).
# Clonar o repo
cd cve-2026-31431
# Construir a imagem vulnerável
docker build -t copyfail-lab -f docker/Dockerfile.vulnerable .
# Executar o lab
docker run --rm -it \
--cap-add=NET_ADMIN \
--security-opt seccomp=unconfined \
copyfail-lab bash
# Dentro do container:
cd /lab
python3 exploit/poc.py
os.splice)Ver exploit/poc.py e exploit/README.md.
O PoC demonstra:
Ver mitigation/README.md para instruções detalhadas.
TL;DR — Mitigação imediata (sem reinicialização):
# Desabilitar o módulo afetado
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf
sudo modprobe -r algif_aead 2>/dev/null || true
Correção definitiva: Atualizar o kernel para uma versão corrigida (após a664bf3d603d).
cve-2026-31431/
├── README.md ← este arquivo
├── docs/
│ ├── technical-analysis.md ← análise técnica aprofundada
│ └── affected-kernels.md ← tabela de versões afetadas/corrigidas
├── exploit/
│ ├── README.md ← documentação do PoC
│ └── poc.py ← proof of concept (Python 3.10+)
├── mitigation/
│ ├── README.md ← guia de mitigação
│ ├── disable-algif.conf ← modprobe config
│ └── check-vulnerable.sh ← script de detecção
├── docker/
│ ├── Dockerfile.vulnerable ← lab vulnerável
│ └── Dockerfile.patched ← lab com mitigação aplicada
└── scripts/
└── setup-lab.sh ← automação do lab
a664bf3d603d| Vuln | Tipo | Requer race? | Portável? | Tamanho exploit |
|---|
| Dirty Cow (CVE-2016-5195) | CoW race | Sim | Parcial | ~KB |
| Dirty Pipe (CVE-2022-0847) | pipe buffer | Não | Limitado | ~KB |
| Copy Fail (CVE-2026-31431) | Lógico | Não | Total | 732 bytes |
| Data | Evento |
|---|
| 2017 | Commit 72548b093ee3 introduz o bug no kernel |
| ~2025 | Theori/Xint Code começa análise do subsistema crypto |
| Abr 28, 2026 | Coordenação com distribuidores |
| Abr 29, 2026 | Divulgação pública + PoC publicado |
| May 1, 2026 | Kernels corrigidos disponíveis em repositórios de produção |
| May 1, 2026 | Adicionado ao catálogo CISA KEV |