
Exploit de prueba de concepto para la vulnerabilidad crítica de escape de contenedores en runC (CVE-2026-Pending) con condición de carrera de symlink, incluyendo PoC en Go, análisis y recomendación de parche.
Severidad: Crítica (CVSS 9.8)
Componente: opencontainers/runc (libcontainer)
Tipo de vulnerabilidad: CWE-59: Resolución incorrecta de enlaces antes del acceso al archivo ('Link Following')
Existe una vulnerabilidad crítica en la función maskPaths de runc. Al enmascarar rutas sensibles (como /proc/kcore) dentro de un contenedor, runc usa os.OpenFile(path, O_PATH, 0) sin la bandera O_NOFOLLOW. Esto permite que un proceso malicioso del contenedor reemplace la ruta de destino con un enlace simbólico a un archivo sensible del host (por ejemplo, /etc/shadow), lo que provoca que runc realice operaciones de montaje sobre el archivo del host en lugar de la ruta del contenedor.
El exploit.go incluido demuestra el comportamiento del kernel que permite esta evasión.
Compila y ejecuta dentro de un entorno Linux (o un contenedor con CAP_SYS_ADMIN si estás probando la recursividad):
go run exploit.go
// Vulnerable Code Pattern in runC:
// 1. Path is typically provided as a string (e.g. from config)
// 2. runC calls os.OpenFile(path, O_PATH...)
// 3. MISSING: unix.O_NOFOLLOW flag
// Result: Kernel follows symlink if attacker swapped the path.
Parche requerido:
Actualiza libcontainer/rootfs_linux.go para incluir unix.O_NOFOLLOW al abrir rutas de destino para el enmascaramiento.
- dstFh, err := os.OpenFile(path, unix.O_PATH|unix.O_CLOEXEC, 0)
+ dstFh, err := os.OpenFile(path, unix.O_PATH|unix.O_CLOEXEC|unix.O_NOFOLLOW, 0)
exploit.go: Código PoC funcional en Go.analysis.md: Desglose técnico detallado de la condición de carrera.cve_draft.md: Plantilla de informe para su envío.Descargo de responsabilidad: Este código es solo para fines de investigación de seguridad y educativos.