
Exploit em Rust para CVE-2026-31431, uma primitiva de escrita no page-cache do kernel Linux via splice AF_ALG, permitindo escalonamento de privilégios para root por meio de patch em /etc/passwd ou execução de shellcode.
Implementação em Rust do CVE-2026-31431 (Copy Fail) — uma primitiva de escrita no page cache do kernel Linux via splice do AF_ALG.
A implementação de algif_aead do kernel Linux permite que um usuário sem privilégios escreva dados arbitrários no page cache de qualquer arquivo legível por meio da syscall splice(). O algoritmo AEAD authencesn escreve seqno_lo (bytes 4-7 do AAD controlados pelo usuário) no scatterlist de destino no offset assoclen + cryptlen, o que — quando encadeado a páginas do page cache via splice() — resulta em uma escrita arbitrária de 4 bytes. O conteúdo no disco permanece inalterado, mas todos os leitores subsequentes veem dados corrompidos no page cache.
Kernels afetados: Linux < 6.12.23, < 6.13.11, < 6.14.2
1. --uid — Altera o campo UID do usuário atual para 0000 em /etc/passwd via escrita no page cache. Após a modificação, su <nome_de_usuário> com sua própria senha abre um shell root. A ferramenta tenta limpar o page cache após a autenticação e antes de iniciar o shell, o que reduz a chance de o SSH continuar vendo a conta como UID 0. Nenhuma modificação de senha do root é necessária. Funciona para qualquer UID de 4 dígitos (1000-9999).
2. --escalate — Modifica a linha do root em /etc/passwd via escrita no page cache: root:x:0:0:root:... → root::0:0:root :.... O campo de comentário é preenchido com espaços para manter o comprimento da linha idêntico. Após a modificação, su root funciona sem senha.
3. --set-password — Primeiro escala privilégios (remove a senha do root), depois lê a nova senha do stdin e a aplica com chpasswd.
4. Modo padrão (sem flags) — Sobrescreve o page cache do binário su com payloads de shellcode específicos da arquitetura (x86_64, x86, aarch64) e, em seguida, executa su para obter um shell root.
cargo build
cargo build --release
cargo test
cargo clippy
./copyfail-rs --check
./copyfail-rs --uid
./copyfail-rs --escalate
printf '%s\n' 'minhasenha' | ./copyfail-rs --set-password
./copyfail-rs --backup /tmp/su.bak
./copyfail-rs --exec /bin/bash
As modificações no page cache são voláteis — limpar o cache restaura o conteúdo original do disco:
echo 3 > /proc/sys/vm/drop_caches
Este projeto é fornecido apenas para testes de segurança autorizados e fins educacionais.
| Flag | Descrição |
|---|
--check | Pré-verificação segura: inspeciona o alvo su resolvido e sai |
--escalate | Modifica /etc/passwd no page cache para remover a senha do root e, em seguida, executa su root |
--set-password | Escala privilégios primeiro, depois lê uma nova senha de root do stdin e a aplica via chpasswd |
--uid | Altera o UID do usuário atual para 0 em /etc/passwd e, em seguida, executa su <nome_de_usuário> |
--backup <caminho> | Faz backup do binário su antes de sobrescrevê-lo |
--exec <caminho> | Executa um comando específico como root após a sobrescrita |
| SO | Kernel | Resultado |
|---|
| Ubuntu 22.04.2 LTS | 6.8.0-87-generic | --escalate aprovado, --set-password aprovado, --uid aprovado |
| Ubuntu 22.04.2 LTS | 6.8.0-107-generic | --escalate aprovado, --uid aprovado |
| Ubuntu 25.10 | 6.17.0-5-generic | splice EINVAL, kernel corrigido |
| Ubuntu 25.10 | 6.17.0-8-generic | --uid aprovado |
| Alpine Linux edge | 6.19.12 | Exploit executa, escrita no page cache bloqueada pela correção do kernel |