
Implementación en Zig del LPE de Linux Copy Fail (CVE-2026-31431) que proporciona un binario independiente para explotar la vulnerabilidad con fines de investigación de seguridad y detección defensiva, incluyendo inyección de shellcode y comprobaciones de vulnerabilidad del sistema.
Implementación en Zig de la prueba de concepto de 732 bytes para el LPE de Linux Copy Fail (CVE-2026-31431), divulgado por Theori / Xint el 29 de abril de 2026. El análisis técnico se puede encontrar en copy.fail.
Esta implementación no tiene dependencias en tiempo de ejecución y se puede ejecutar como un binario independiente.
Para compilar el exploit se requiere la versión 0.16.0 o superior de zig, que se puede instalar desde ziglang.org. Para compilar el exploit, ejecute el siguiente comando en la terminal:
zig build
Opcionalmente, se puede compilar de forma cruzada para un objetivo diferente p. ej.
zig build -Dcpu=baseline -Dtarget=aarch64-linux-musl -Doptimize=ReleaseSmall
o con cargas útiles sin comprimir
zig build -Dcompress=false
ejecute el binario compilado o use zig para ejecutarlo
zig-out/bin/copyfail
O BIEN
zig build run
$ zig-out/bin/copyfail
Uso:
run <ruta> <datos> [desplazamiento] [-- args...] - Escribe datos en el ejecutable en el desplazamiento dado (por defecto 0) y lo ejecuta
sudo <ruta_suid> [comando...] - Ejecuta un comando como root escribiendo shellcode en un binario suid.
(el primer argumento del comando debe ser la ruta completa al programa a ejecutar)
modify <ruta> <datos> [desplazamiento] - Escribe datos en el archivo en el desplazamiento dado (por defecto 0)
reset <ruta> - Restablece el archivo a su estado original
help - Muestra este mensaje
El ejecutable se puede ejecutar con diferentes comandos:
run
primero escribe los datos proporcionados en el desplazamiento dado (por defecto 0) en el ejecutable en la ruta proporcionada y luego lo ejecuta.
Una vez finalizada la ejecución, el archivo se restablece a su estado original mediante posix_fadvise.
Ejemplo:
copyfail run /ruta/al/ejecutable $(cat shellcode_bin) -- /bin/sh
sudo
escribe el shellcode incluido en un binario suid y lo ejecuta para ejecutar un comando como root.
El código fuente del shellcode se puede encontrar en payloads/sudo.zig.
El primer argumento del comando debe ser la ruta completa al programa, ya que el shellcode no busca el programa a ejecutar.
Una vez finalizada la ejecución, el archivo se restablece como en el comando run.
Ejemplo:
$ copyfail sudo /usr/bin/su /usr/bin/whoami
root
modify
escribe los datos proporcionados en el desplazamiento dado (por defecto 0) en el archivo en la ruta proporcionada, sin ejecutarlo.
Después de la modificación, el archivo NO se restablece. Use el comando reset para restablecerlo.
Ejemplo:
copyfail modify /ruta/al/archivo "Mi nuevo contenido" 1337
reset
restablece el archivo en la ruta proporcionada a su estado original mediante posix_fadvise. Esto descarta la página en caché y leerá el contenido del disco cuando se acceda de nuevo.
Ejemplo:
copyfail reset /ruta/al/archivo
is_vulnerable
comprueba si el sistema es vulnerable creando un archivo temporal, escribiendo datos de prueba en él y leyéndolos de nuevo para ver si los datos se corrompieron.
Ejemplo:
$ copyfail is_vulnerable
advertencia: El sistema es vulnerable
O BIEN
información: El sistema no es vulnerable
help
imprime el mensaje de uso.
límite inferior: torvalds/linux 72548b093ee3 agosto de 2017, v4.14
(reestructuración de iov_iter de AF_ALG que
introdujo la primitiva de escritura de páginas
de archivo mediante splice en la lista
dispersa de AEAD)
límite superior: torvalds/linux a664bf3d603d abril de 2026, mainline
(revierte la optimización in-place de algif_aead
de 2017; separa las listas dispersas de origen
y destino para que las páginas de caché de página
ya no puedan ser un destino criptográfico
escribible)
En medio: todos los kernels de las principales distribuciones que no aplicaron el backport de la corrección.
Ubuntu, RHEL, SUSE, Amazon Linux y Debian fueron todos confirmados como vulnerables
en sus kernels de imagen de nube estándar en el momento de la divulgación. Los
backports a nivel de distribución comenzaron a implementarse alrededor del 2026-04-29 junto con la
divulgación pública. Para verificar si un kernel objetivo está dentro de la ventana, compruebe si
a664bf3d603d (o su backport específico de la distribución) está presente en el
registro git del kernel o en el registro de cambios de la distribución.
Descubrimiento y divulgación original de CVE-2026-31431: Theori / Xint. Análisis técnico público en copy.fail.
Esta implementación en zig: Emmmmllll [email protected]
El compilador zig y la biblioteca estándar: Zig Software Foundation bajo términos MIT https://codeberg.org/ziglang/zig.
El exploit y la carga útil se publican con fines de investigación de seguridad y detección defensiva. El uso contra sistemas que no posee o para los que no tiene autorización explícita para probar es problema suyo, no del autor.