
CopyFail (CVE-2026-31431): PoC de escalada de privilegios en la caché de páginas del kernel de Linux + la única herramienta de detección pública. Nuevo vector de omisión de autenticación PAM + reglas Sigma/auditd/eBPF.
PoC multi-vector + detección emparejada para CVE-2026-31431 (CopyFail). Incluye un novedoso vector de evasió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 comando. Shell root. PAM killshot bajo el capó (una única escritura de 4 bytes en /etc/pam.d/common-auth), caída PTY a root vía sudo con contraseña descartada. La línea [sudo] password for noot: parpadea brevemente; sudo siempre muestra ese prompt; el binario le introduce cualquier cadena y el fallo de pam_unix se propaga a través de 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... ← lo que realmente se carga (mutado)
disk: 117dab1c... ← lo que AIDE / Wazuh / Tripwire ven (limpio)
Eso es el proyecto. Disco limpio, caché mutada. Todo FIM público está ciego. Esta herramienta no.
Binarios estáticos precompilados en el release v0.1.0. Elige tu arquitectura, descarga, ejecuta.
# x86_64 (la mayoría de portátiles + servidores cloud)
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
Otras arquitecturas:
| Arquitectura | Archivo |
|---|---|
| ARM64 (aarch64) | copyfail-aarch64-musl |
| ARMv7 (Raspberry Pi 3+) | copyfail-armv7-musleabihf |
Verifica la integridad:
curl -LO https://github.com/diemoeve/copyfail-rs/releases/download/v0.1.0/checksums.txt
sha256sum -c checksums.txt
Binarios musl estáticos, sin dependencias en tiempo de ejecución, funcionan en cualquier Linux.
Mutación de la caché de páginas. Sin escritura VFS. Sin página sucia. Sin evento inotify. El reescaneo periódico compite con la evicción.
AIDE/Wazuh/OSSEC/Tripwire/Samhain leen mediante I/O con buffer → caché de páginas → hashean los bytes mutados como verdad. O tras la evicción, hashean el disco limpio → "nunca ocurrió ningún cambio."
La detección necesita O_DIRECT (saltar caché) + lectura con buffer (acertar caché) + diff de hash. Discrepancia = 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 ingesta SIEM.
detection/:
sigma/copyfail-af-alg.yml, regla Sigma, intégrala en tu SIEMauditd/copyfail.rules, augenrules --loadebpf/copyfail-trace.bt, one-liner de bpftraceapparmor/copyfail-block.profile, regla de denegación AppArmor 3.0+mitigation/disable-algif.sh, blacklist 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 2026). Hasta ahora: solo Debian Sid/Forky lo incluyen. 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.
Tras 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 en tiempo de ejecución. Binario estático único.
Artefactos precompilados y sumas SHA256 adjuntos a los releases 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 llamador posterior.
CVE-2026-31431 divulgado por Theori / Xint el 2026-04-29 (writeup, blog de Xint). PoCs públicos previos:
Este proyecto (copyfail-rs): añade el vector de evasión de autenticación PAM, detección de doble modo, artefactos IR.
MIT.
a664bf3d603d72548b093ee3 (4.14, ago 2017)| Vector | Objetivo | Dónde aterriza |
|---|
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 | Muta el texto del binario setuid. execve → root. |
passwd | /etc/passwd | Cambio 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. Veredicto: vulnerable / mitigado / seguro. |
--scan | Diff de lectura O_DIRECT vs lectura con buffer en archivos críticos. Ramificado por statfs(): ext4/xfs/btrfs usan O_DIRECT, overlayfs retrocede, tmpfs se omite. |
--baseline / --diff | Instantánea del estado conocido-limpio. Diff posterior. Deltas solo en caché = la huella CopyFail. |
--watch | Daemon. 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 | --mode detect completo |
| 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 |