
Exploit en Rust para CVE-2026-31431, una primitiva de escritura en la caché de páginas del kernel de Linux mediante AF_ALG splice, que permite la escalada de privilegios a root a través de la modificación de /etc/passwd o la ejecución de shellcode.
Implementación en Rust de CVE-2026-31431 (Copy Fail) — una primitiva de escritura en la caché de páginas del kernel de Linux mediante AF_ALG splice.
La implementación de algif_aead del kernel de Linux permite a un usuario sin privilegios escribir datos arbitrarios en la caché de páginas de cualquier archivo legible mediante la llamada al sistema splice(). El algoritmo AEAD authencesn escribe seqno_lo (bytes AAD 4-7 controlados por el usuario) en el scatterlist de destino en el desplazamiento assoclen + cryptlen, lo que — al encadenarse a páginas de la caché de páginas mediante splice() — resulta en una escritura arbitraria de 4 bytes. El contenido en disco permanece sin cambios, pero todos los lectores posteriores ven datos corruptos en la caché de páginas.
Kernels afectados: Linux < 6.12.23, < 6.13.11, < 6.14.2
1. --uid — Cambia el campo UID del usuario actual a 0000 en /etc/passwd mediante la escritura en la caché de páginas. Después del parcheo, su <nombre_de_usuario> con tu propia contraseña abre un shell root. La herramienta intenta limpiar la caché de páginas después de la autenticación y antes de iniciar el shell, lo que reduce la posibilidad de que SSH siga viendo la cuenta como UID 0. No se requiere modificación de la contraseña de root. Funciona para cualquier UID de 4 dígitos (1000-9999).
2. --escalate — Parchea la línea de root en /etc/passwd mediante la escritura en la caché de páginas: root:x:0:0:root:... → root::0:0:root :.... El campo de comentario se rellena con espacios para mantener la longitud de línea idéntica. Después del parcheo, su root funciona sin contraseña.
3. --set-password — Primero escala (elimina la contraseña de root), luego lee la nueva contraseña desde stdin y la aplica con chpasswd.
4. Modo predeterminado (sin flags) — Sobrescribe la caché de páginas del binario su con payloads de shellcode específicos de la arquitectura (x86_64, x86, aarch64), luego ejecuta su para obtener un shell root.
cargo build
cargo build --release
cargo test
cargo clippy
./copyfail-rs --check
./copyfail-rs --uid
./copyfail-rs --escalate
printf '%s\n' 'mipassword' | ./copyfail-rs --set-password
./copyfail-rs --backup /tmp/su.bak
./copyfail-rs --exec /bin/bash
Las modificaciones en la caché de páginas son volátiles — limpiar la caché restaura el contenido original en disco:
echo 3 > /proc/sys/vm/drop_caches
Este proyecto se proporciona únicamente con fines de pruebas de seguridad autorizadas y educativos.
| Flag | Descripción |
|---|
--check | Verificación previa segura: inspecciona el objetivo su resuelto y sale |
--escalate | Parchea /etc/passwd en la caché de páginas para eliminar la contraseña de root, luego ejecuta su root |
--set-password | Escala primero, luego lee una nueva contraseña de root desde stdin y la aplica mediante chpasswd |
--uid | Cambia el UID del usuario actual a 0 en /etc/passwd, luego ejecuta su <nombre_de_usuario> |
--backup <ruta> | Realiza una copia de seguridad del binario su antes de sobrescribirlo |
--exec <ruta> | Ejecuta un comando específico como root después de la sobrescritura |
| SO | Kernel | Resultado |
|---|
| Ubuntu 22.04.2 LTS | 6.8.0-87-generic | --escalate correcto, --set-password correcto, --uid correcto |
| Ubuntu 22.04.2 LTS | 6.8.0-107-generic | --escalate correcto, --uid correcto |
| Ubuntu 25.10 | 6.17.0-5-generic | splice EINVAL, kernel parcheado |
| Ubuntu 25.10 | 6.17.0-8-generic | --uid correcto |
| Alpine Linux edge | 6.19.12 | El exploit se ejecuta, escritura en caché de páginas bloqueada por el parche del kernel |