
Prueba de concepto funcional para CVE-2026-31431, una escalada local de privilegios en el kernel de Linux mediante la corrupción de la caché de páginas de AF_ALG AEAD, que otorga una shell de root.
2026-04-29 — Publico este exploit un día después de compartirlo en el foro MyDigitalLife. No requiere Python; está escrito en C y compilado al menor tamaño posible usando:
musl-gcc -static -Os -o exploit exploit.c -sAmenaza crítica. El binario del exploit está compilado sin dependencias y puede usarse para probar vulnerabilidades en cualquier sistema Linux.
CVE-2026-31431 es una vulnerabilidad confirmada por NIST en el kernel de Linux que permite a un usuario local sin privilegios obtener un shell
rooten segundos. A la luz del exploit que circula públicamente para CVE-2026-31431, he desarrollado una prueba de concepto (PoC) binaria para evaluar la exposición de nuestra infraestructura interna. Si bien algunos entornos restringen el uso de su, esta vulnerabilidad es particularmente crítica para servidores compartidos porque ataca la gestión de memoria del kernel subyacente. En consecuencia, cualquier binario SETUID —incluidos sudo, passwd, mount o newgrp— puede aprovecharse para desencadenar el exploit y otorgar un shell root. Se requiere acción administrativa inmediata para parchear el kernel, ya que las restricciones estándar de espacio de usuario son insuficientes para mitigar esta amenaza. Cualquier sistema Linux que ejecute un kernel sin parchear está en riesgo.
Mi propio exploit funcional · Kernel de Linux · Interfaz criptográfica AF_ALG (AEAD)
Reemplaza /usr/bin/su en la caché de páginas del kernel sin tocar el archivo en disco
El acceso a shell local es suficiente — no se requieren privilegios adicionales
Afecta a distribuciones Linux sin parchear

CVE-2026-31431 es un error en el manejo de operaciones de I/O scatter-gather y referencias a la caché de páginas en el subsistema criptográfico del kernel de Linux — específicamente en la implementación del socket AF_ALG para algoritmos AEAD (crypto/af_alg.c, crypto/aead.c).
| Propiedad | Valor |
|---|---|
| Identificador | CVE-2026-31431 |
| Referencia | NIST NVD |
| Tipo | Escalada de Privilegios Local (LPE) |
| Componente | Kernel de Linux — AF_ALG / AEAD (authencesn) |
| Acceso requerido | Usuario local sin privilegios |
| Impacto | Shell root interactivo |
| Estado del exploit | PoC funcional disponible públicamente en GitHub |
| Persistencia | Ninguna — la modificación existe solo en RAM; el reinicio restaura el estado original |
El kernel de Linux expone una interfaz criptográfica al espacio de usuario mediante sockets AF_ALG. La vulnerabilidad radica en que durante una operación de descifrado AEAD, el kernel mapea incorrectamente la salida del descifrado directamente sobre las páginas de la caché de páginas del archivo fuente — en lugar de un búfer temporal. Un atacante puede así sobrescribir el contenido en memoria de cualquier archivo sin modificarlo en disco, sin privilegios root y sin dejar rastro visible en el sistema de archivos.
| Sistema | Estado |
|---|---|
| Ubuntu 24.04 (hardware físico / VM) | ⚠️ Vulnerable en kernel sin parchear |
| Debian, Fedora, Arch en kernel sin parchear | ⚠️ Vulnerable |
Distribuciones con CONFIG_SECURITY_LOCKDOWN_LSM | ✅ Probablemente protegidas |
Sistemas con nosuid o ProtectSUID (systemd) | ✅ Protegidos |
Sistemas con AppArmor/SELinux que bloquean AF_ALG | ✅ Protegidos |
| macOS, Windows (nativo) | ✅ No afectados |
El exploit consta de dos componentes: un script auxiliar en /tmp/x y un bucle de corrupción basado en AF_ALG. A continuación se muestra un recorrido exacto basado en el análisis del código fuente:
1. Configuración del script auxiliar
El exploit crea /tmp/x con el siguiente contenido:
#!/bin/sh
export TERM=xterm-256color
exec /bin/sh
Establece permisos 0755. La razón: /usr/bin/su elimina las variables de entorno (incluida TERM) al lanzarse. El script auxiliar las restaura antes de generar el shell real, garantizando una terminal funcional.
2. Construcción del payload ELF
Se construye en memoria un binario ELF x86_64 mínimo de 158 bytes que contiene shellcode crudo. La cadena /bin/sh en el desplazamiento 150 se parchea luego a /tmp/x\0 mediante memcmp/memcpy. Consulta Payload ELF para más detalles.
3. Apertura de /usr/bin/su en modo solo lectura
int su_fd = open("/usr/bin/su", O_RDONLY);
El archivo se abre en modo solo lectura — el exploit no requiere permisos de escritura en absoluto.
4. Bucle de corrupción — 39 iteraciones de 4 bytes cada una
El payload (158 bytes) se procesa en fragmentos de 4 bytes (39 fragmentos completos). Cada fragmento se pasa a corrupt_binary_chunk(), que realiza:
AF_ALG (SOCK_SEQPACKET)authencesn(hmac(sha256),cbc(aes)) — un algoritmo AEAD compuestoop_sock)sendmsg con un búfer de 8 bytes (4× 'A' + 4 bytes de payload) y tres CMSGs: ALG_OP_DECRYPT, IV (20 bytes), assoclen=8splice: su_fd → pipe → op_sock (copia cero a través del kernel)recv() — aquí es donde el kernel sobrescribe erróneamente la caché de páginas5. Ejecución
execve("/usr/bin/su", args, NULL);
El kernel carga /usr/bin/su a través de la caché de páginas — que ahora está envenenada. El bit SUID (chmod u+s) está intacto, por lo que el kernel ejecuta el archivo como root. El shellcode ejecuta setuid(0) → execve("/tmp/x") → shell root interactivo.