
Implementação em Zig do LPE Copy Fail do Linux (CVE-2026-31431), fornecendo um binário autônomo para explorar a vulnerabilidade para pesquisa de segurança e detecção defensiva, incluindo injeção de shellcode e verificações de vulnerabilidade do sistema.
Implementação em Zig do proof of concept de 732 Bytes para o LPE do Linux Copy Fail (CVE-2026-31431), divulgado pela Theori / Xint em 29 de abril de 2026 O writeup pode ser encontrado em copy.fail.
Esta implementação não possui dependências em tempo de execução e pode ser executada como um binário autônomo.
Para compilar o exploit, é necessária a versão 0.16.0 ou superior do zig, que pode ser instalada em ziglang.org. Para compilar o exploit, execute o seguinte comando no terminal:
zig build
Opcionalmente, pode ser compilado de forma cruzada para um Target diferente ex.:
zig build -Dcpu=baseline -Dtarget=aarch64-linux-musl -Doptimize=ReleaseSmall
ou com payloads não compactados
zig build -Dcompress=false
execute o binário compilado ou use o zig para executá-lo
zig-out/bin/copyfail
OU
zig build run
$ zig-out/bin/copyfail
Uso:
run <caminho> <dados> [offset] [-- args...] - Escreve dados no executável no offset informado (padrão 0) e o executa
sudo <caminho_suid> [comando...] - Executa um comando como root escrevendo shellcode em um binário suid.
(o primeiro argumento do comando deve ser o caminho completo para o programa a ser executado)
modify <caminho> <dados> [offset] - Escreve dados no arquivo no offset informado (padrão 0)
reset <caminho> - Restaura o arquivo ao seu estado original
help - Mostra esta mensagem
O executável pode ser executado com diferentes comandos:
run
primeiro escreve os dados fornecidos no offset informado (padrão 0) no executável no caminho fornecido e, em seguida, o executa.
Após a execução ser concluída, o arquivo é restaurado ao seu estado original usando posix_fadvise.
Exemplo:
copyfail run /caminho/para/exe $(cat shellcode_bin) -- /bin/sh
sudo
escreve o shellcode incluído em um binário suid e o executa para rodar um comando como root.
O código-fonte do shellcode pode ser encontrado em payloads/sudo.zig.
O primeiro argumento do comando deve ser o caminho completo para o programa, pois o shellcode não procura pelo programa a ser executado.
Após a execução ser concluída, o arquivo é restaurado como no comando run.
Exemplo:
$ copyfail sudo /usr/bin/su /usr/bin/whoami
root
modify
escreve os dados fornecidos no offset informado (padrão 0) no arquivo no caminho fornecido, sem executá-lo.
Após a modificação, o arquivo NÃO é restaurado. Use o comando reset para restaurá-lo.
Exemplo:
copyfail modify /caminho/para/arquivo "Meu novo conteúdo" 1337
reset
restaura o arquivo no caminho fornecido ao seu estado original usando posix_fadvise. Isso descarta a página em cache e lerá o conteúdo do disco quando acessado novamente.
Exemplo:
copyfail reset /caminho/para/arquivo
is_vulnerable
verifica se o sistema é vulnerável criando um arquivo temporário, escrevendo dados de teste nele e lendo-os de volta para ver se os dados foram corrompidos.
Exemplo:
$ copyfail is_vulnerable
aviso: O sistema é vulnerável
OU
info: O sistema não é vulnerável
help
imprime a mensagem de uso.
piso: torvalds/linux 72548b093ee3 agosto de 2017, v4.14
(rework do iov_iter do AF_ALG que
introduziu a primitiva de escrita
em página de arquivo via splice no
scatterlist do AEAD)
teto: torvalds/linux a664bf3d603d abril de 2026, mainline
(reverte a otimização in-place do
algif_aead de 2017; separa os
scatterlists de origem e destino
para que páginas do cache de página
não possam mais ser um destino de
criptografia gravável)
Entre eles: todos os kernels de grandes distribuições que não aplicaram o backport da correção.
Ubuntu, RHEL, SUSE, Amazon Linux e Debian foram todos confirmados como vulneráveis
em seus kernels padrão de imagem em nuvem no momento da divulgação. Os
backports em nível de distribuição começaram a ser lançados por volta de 2026-04-29
junto com a divulgação pública. Para verificar se um kernel alvo está na janela, verifique se
a664bf3d603d (ou seu backport específico da distribuição) está presente no
git log do kernel ou no changelog da distribuição.
Descoberta e divulgação original do CVE-2026-31431: Theori / Xint. Writeup público em copy.fail.
Esta implementação em zig: Emmmmllll [email protected]
O compilador zig e a biblioteca padrão: Zig Software Foundation nos termos MIT https://codeberg.org/ziglang/zig.
O exploit e o payload são publicados para fins de pesquisa de segurança e detecção defensiva. O uso contra sistemas que você não possui ou para os quais não tem autorização explícita para testar é problema seu, não do autor.