
CVE-2026-31431 (Copy Fail) exploit novedoso: corrupción de código en vivo mediante caché de páginas. Sobrescribe el código de exit() de libc a través del uso compartido de páginas MAP_PRIVATE — afecta a TODOS los procesos en ejecución.
Una técnica de explotación novedosa para CVE-2026-31431 ("Copy Fail") que corrompe el código ejecutable de procesos en ejecución a través de la caché de páginas del kernel de Linux, logrando escalada de privilegios a root.
Todos los exploits publicados para este CVE corrompen archivos de datos — modificando /etc/passwd para cambiar el UID de root, o parcheando binarios setuid en disco. Este exploit hace algo fundamentalmente diferente: corrompe código ejecutable en vivo en memoria a través del mecanismo de caché de páginas del kernel.
| Exploits publicados | Este exploit | |
|---|---|---|
| Objetivo | Archivos de datos (/etc/passwd, /usr/bin/su) | Código ejecutable (sección .text de libc) |
| Mecanismo | Contenido de archivo analizado por programas | Páginas de código ejecutadas directamente por la CPU |
| Alcance | Archivo único | TODOS los procesos que mapean libc |
| Cambio en disco | Sí (contenido del archivo modificado) | No (solo caché de páginas en memoria) |
| Detección | Monitoreo de integridad de archivos | Invisible para verificaciones del sistema de archivos |
Cuando Linux mapea una biblioteca compartida con MAP_PRIVATE, no copia inmediatamente las páginas del archivo. En su lugar, las entradas de la tabla de páginas del proceso apuntan directamente a las páginas físicas de la caché de páginas. La copia solo ocurre al escribir (copy-on-write). Para páginas de código (.text), los procesos nunca escriben en ellas — por lo que permanecen compartidas con la caché de páginas para siempre.
Process A (bash) Process B (su) Page Cache (libc)
┌──────┐ ┌──────┐ ┌──────────┐
│ PTE │───────────>│ │ │ exit(): │
│ │ │ PTE │───────────>│ endbr64 │
└──────┘ └──────┘ │ push rax │
MAP_PRIVATE MAP_PRIVATE │ ... │
(clean page) (clean page) └──────────┘
↑
Copy Fail escribe aquí!
CVE-2026-31431 nos da una escritura controlada de 4 bytes en la caché de páginas de cualquier archivo legible. Al corromper las páginas de código de libc, modificamos las instrucciones que cada proceso ejecuta.
on_exit() en la caché de páginas de libc — 10 escrituras de 4 bytes cada unaexit() para saltar a nuestro shellcode — 1 escritura de 4 bytesexit() (prácticamente todos los programas) ejecuta nuestro shellcodeEl shellcode realiza setuid(0) → setgid(0) → execve("/bin/sh"), otorgando una shell de root.
crypto/algif_aead.c — la optimización in-place de 2017 (72548b093ee3) permite que splice() alimente páginas de la caché de páginas al descifrado AEAD. El reordenamiento ESN del algoritmo authencesn escribe 4 bytes de scratch de vuelta al scatterlist de origen, corrompiendo la caché de páginas del archivo empalmado.# Compilar
gcc -o exploit exploit.c
# Ejecutar como usuario sin privilegios
./exploit /lib/x86_64-linux-gnu/libc-2.31.so
# Disparador — ejecutar cualquier programa (llama a exit())
su -c id
# uid=0(root) gid=0(root) groups=0(root)
process 'id' launched '/bin/sh'exploit.c — Exploit completo con inyección de shellcodecopyfail_test.c — Verificación de la primitiva (prueba la escritura de 4 bytes)72548b093ee3)Esta herramienta se proporciona únicamente para investigación de seguridad autorizada y fines educativos. No la utilice contra sistemas que no posea o para los cuales no tenga permiso explícito de prueba.
Dirty Frag divulgó dos variantes más de escritura en caché de páginas en la misma clase de bug:
esp4/esp6): Mismo sumidero authencesn que Copy Fail, alcanzado mediante IPsec ESP-in-UDP. Requiere namespaces de usuario. Escritura de 4 bytes.rxrpc/rxkad): Descifrado in-place pcbc(fcrypt) en página fijada por splice. No se necesitan namespaces. Escritura de 8 bytes.La técnica de corrupción de código en vivo en este repositorio funciona con cualquiera de estas primitivas de escritura en caché de páginas — solo reemplace la función write4() con el disparador ESP o RxRPC. La técnica es agnóstica a la primitiva.