
CVE-2025-40271 Modificado por MadEploits
Prueba de concepto para una vulnerabilidad de escalada local de privilegios en el sistema de archivos proc del kernel de Linux. El fallo es un use-after-free en proc_readdir_de() provocado por rb_erase() sin RB_CLEAR_NODE(), que deja enlaces obsoletos del árbol rojo-negro que pueden aprovecharse mediante una condición de carrera durante la enumeración de directorios.
Autor: MadExploits
Investigación original de la vulnerabilidad y PoC en C por Aviral Srivastava (N-DAY RESEARCH). Este repositorio incluye una versión en shell (
exploit.sh) para entornos donde la compilación no resulta práctica.
| Campo | Detalle |
|---|---|
| CVE | CVE-2025-40271 |
| Componente | fs/proc — proc_readdir_de() / remove_proc_entry() |
| Tipo | Use-after-free (enlaces obsoletos del árbol rb) |
| Impacto | Escalada local de privilegios (LPE) |
| Arquitectura | x86_64 |
| Afectados | Kernels de Linux hasta 6.18-rc5 |
Cuando se elimina una entrada de directorio de proc, se invoca rb_erase() sobre el nodo rb de la entrada sin RB_CLEAR_NODE(). Los nodos liberados pueden permanecer accesibles a través de enlaces obsoletos del árbol. Si getdents64() entra en carrera con la eliminación de interfaces en /proc/self/net/dev_snmp6/, el kernel puede leer memoria liberada — a menudo reutilizada por objetos msg_msg rociados en el heap — y devolver valores anómalos de d_ino que filtran punteros del heap del kernel.
El PoC comprueba la versión del kernel en ejecución y termina en las builds parcheadas:
| Rama | Corregido en |
|---|---|
| 5.10.x | 5.10.247+ |
| 6.1.x | 6.1.159+ |
| 6.6.x | 6.6.123+ |
| 6.12.x | 6.12.73+ |
| 6.18+ | 6.18-rc6+ |
| 7.x+ | Parcheado |
| Archivo | Descripción |
|---|---|
exploit.c | PoC completo en C — gestión de veth por netlink, carrera con pthreads, rociado de msg_msg |
exploit.sh | Versión en shell sin compilación — unshare, ip, Python 3 integrado para syscalls/carrera |
Ambas implementaciones siguen el mismo flujo de explotación:
CAP_NET_ADMIN en el net ns)/proc/self/net/dev_snmp6/getdents64() en carrera contra la eliminación rápida de veth + rociado del heapd_ino similares a punteros del kernelcat /proc/sys/kernel/unprivileged_userns_clone
# must be 1
exploit.cgcc con pthreadslinux/netlink.h, etc.)gcc -o exploit exploit.c -lpthread
exploit.shbashpython3ip (iproute2)unshare (util-linux con soporte para --map-root-user)No se requiere compilador.
chmod +x exploit.sh
./exploit.sh
gcc -o exploit exploit.c -lpthread
./exploit
Kernel vulnerable — UAF activado (éxito parcial):
[+] Kernel X.Y.Z — VULNERABLE
[+] Namespace ready...
[+] Created 32 veth pairs (/proc/self/net/dev_snmp6 populated)
[+] UAF HIT! d_ino=0xffff8880........ (kernel heap pointer)
[+] Kernel heap leak: 0xffff8880........
[*] PARTIAL SUCCESS: UAF + heap leak DEMONSTRATED
Kernel parcheado:
[-] Kernel X.Y.Z — PATCHED
[*] Kernel is patched. Nothing to do.
d_ino contiene un valor que coincide con el patrón de puntero de kernel x86_64 (0xffff000000000000), normalmente procedente del m_list de la cabecera de msg_msg que se solapa con datos liberados de proc_dir_entry.modprobe_path requiere el offset entre la dirección de heap filtrada y la base del texto del kernel — esto es específico de la build (KASLR). El PoC demuestra el UAF y la fuga; una cadena completa necesita los offsets para la imagen de tu kernel objetivo.sysctl -w kernel.unprivileged_userns_clone=0
Este proyecto se proporciona únicamente para investigación de seguridad autorizada, educación y pruebas defensivas.
| Rol | Nombre |
|---|---|
| Autor del repositorio | MadExploits |
| Investigación original del CVE y PoC en C | Aviral Srivastava — N-DAY RESEARCH |
Úsalo bajo tu propio riesgo. No se proporciona ninguna garantía.