
CVE-2026-31431 (Copy Fail) exploit inovador: corrupção de código em tempo real via cache de páginas. Sobrescreve o código de exit() da libc através do compartilhamento de páginas MAP_PRIVATE — afeta TODOS os processos em execução.
Uma técnica de exploração inédita para a CVE-2026-31431 ("Copy Fail") que corrompe o código executável de processos em execução através do page cache do kernel Linux, alcançando escalonamento de privilégios para root.
Todos os exploits publicados para esta CVE corrompem arquivos de dados — modificando /etc/passwd para alterar o UID do root, ou corrigindo binários setuid no disco. Este exploit faz algo fundamentalmente diferente: corrompe o código executável em tempo real na memória através do mecanismo de page cache do kernel.
| Exploits publicados | Este exploit | |
|---|---|---|
| Alvo | Arquivos de dados (/etc/passwd, /usr/bin/su) | Código executável (seção .text da libc) |
| Mecanismo | Conteúdo de arquivo interpretado por programas | Páginas de código executadas diretamente pela CPU |
| Escopo | Arquivo único | TODOS os processos que mapeiam a libc |
| Alteração no disco | Sim (conteúdo do arquivo modificado) | Não (apenas page cache na memória) |
| Detecção | Monitoramento de integridade de arquivos | Invisível para verificações do sistema de arquivos |
Quando o Linux mapeia uma biblioteca compartilhada com MAP_PRIVATE, ele não copia imediatamente as páginas do arquivo. Em vez disso, as entradas da tabela de páginas do processo apontam diretamente para as páginas físicas do page cache. A cópia só ocorre na escrita (copy-on-write). Para páginas de código (.text), os processos nunca escrevem nelas — então elas permanecem compartilhadas com o page cache para sempre.
Processo A (bash) Processo B (su) Page Cache (libc)
┌──────┐ ┌──────┐ ┌──────────┐
│ PTE │───────────>│ │ │ exit(): │
│ │ │ PTE │───────────>│ endbr64 │
└──────┘ └──────┘ │ push rax │
MAP_PRIVATE MAP_PRIVATE │ ... │
(página limpa) (página limpa) └──────────┘
↑
Copy Fail escreve aqui!
A CVE-2026-31431 nos dá uma escrita controlada de 4 bytes no page cache de qualquer arquivo legível. Ao corromper as páginas de código da libc, modificamos as instruções que todo processo executa.
on_exit() no page cache da libc — 10 escritas de 4 bytes cadaexit() para saltar para o nosso shellcode — 1 escrita de 4 bytesexit() (praticamente todo programa) executa nosso shellcodeO shellcode executa setuid(0) → setgid(0) → execve("/bin/sh"), fornecendo um shell root.
crypto/algif_aead.c — a otimização in-place de 2017 (72548b093ee3) permite que splice() alimente páginas do page cache no decrypt AEAD. O rearranjo ESN do algoritmo authencesn escreve 4 bytes de rascunho de volta ao scatterlist de origem, corrompendo o page cache do arquivo com splice.# Compilar
gcc -o exploit exploit.c
# Executar como usuário sem privilégios
./exploit /lib/x86_64-linux-gnu/libc-2.31.so
# Gatilho — execute qualquer programa (ele chama exit())
su -c id
# uid=0(root) gid=0(root) groups=0(root)
process 'id' launched '/bin/sh'exploit.c — Exploit completo com injeção de shellcodecopyfail_test.c — Verificação da primitiva (testa escrita de 4 bytes)72548b093ee3)Esta ferramenta é fornecida apenas para pesquisa de segurança autorizada e fins educacionais. Não use contra sistemas que você não possui ou para os quais não tem permissão explícita de teste.
Dirty Frag divulgou mais duas variantes de escrita no page cache na mesma classe de bug:
esp4/esp6): Mesmo sink authencesn do Copy Fail, alcançado via IPsec ESP-in-UDP. Requer namespaces de usuário. Escrita de 4 bytes.rxrpc/rxkad): Decrypt in-place pcbc(fcrypt) em página fixada por splice. Nenhum namespace necessário. Escrita de 8 bytes.A técnica de corrupção de código em tempo real neste repositório funciona com qualquer uma dessas primitivas de escrita no page cache — basta substituir a função write4() pelo gatilho ESP ou RxRPC. A técnica é agnóstica à primitiva.