
CVE-2025-31133 PoC
Este documento explica la funcionalidad del script de Prueba de Concepto (PoC) proporcionado para la vulnerabilidad runc CVE-2025-31133.
maskedPaths de runc.maskedPaths, permitiéndole escribir en archivos sensibles del sistema anfitrión. Esto constituye un escape de contenedor./proc/sys/kernel/core_pattern del anfitrión desde dentro de un contenedor."pwned" en el archivo objetivo y no ejecuta código arbitrario en el anfitrión. También proporciona instrucciones para restaurar el valor original.La característica maskedPaths en la especificación OCI de un contenedor (config.json) es un mecanismo de seguridad diseñado para evitar que los contenedores accedan a archivos sensibles del sistema. Funciona montando con bind /dev/null (un archivo de dispositivo vacío) sobre estas rutas sensibles dentro del contenedor, haciéndolos efectivamente ilegibles e inescribibles.
La vulnerabilidad (CVE-2025-31133) es una condición de carrera Time-of-Check a Time-of-Use (TOCTOU). El exploit funciona de la siguiente manera:
runc configura el contenedor, se prepara para usar el archivo dev/null del rootfs del contenedor como origen para el montaje bind que enmascarará la ruta sensible (por ejemplo, /proc/sys/kernel/core_pattern).runc resuelve la ruta a rootfs/dev/null y cuando realmente realiza la operación de montaje.rootfs/dev/null entre un nodo de dispositivo legítimo y un enlace simbólico que apunte al archivo objetivo en el anfitrión (/proc/sys/kernel/core_pattern).runc realizará su operación de montaje en el momento exacto en que rootfs/dev/null es un enlace simbólico. Esto hace que el kernel siga el enlace simbólico, y la operación de enmascaramiento prevista falla para /proc/sys/kernel/core_pattern.Este PoC utiliza esta técnica para escribir en /proc/sys/kernel/core_pattern, un objetivo común para tales exploits porque modificarlo puede llevar a la ejecución de código arbitrario en el anfitrión cuando un proceso falla. Sin embargo, este PoC solo escribe una cadena inofensiva para demostrar que existe la primitiva de escritura.
El script poc.sh automatiza todo el proceso descrito anteriormente.
Configuración y limpieza:
runc, el nombre del contenedor y la ruta del rootfs.cleanup robusta que asegura que cualquier contenedor o archivo creado previamente por el script sea eliminado. Esta función se llama automáticamente al salir, interrumpir o terminar.Preparación:
/proc/sys/kernel/core_pattern del anfitrión en un archivo temporal. Esto se utiliza más tarde para verificar si el exploit tuvo éxito y para ayudar al usuario a restaurar el sistema../rootfs) y un archivo config.json.config.json lista explícitamente /proc/sys/kernel/core_pattern bajo maskedPaths — la misma característica que el exploit pretende eludir.La función de carrera (symlink_race)
Requisitos previos:
runc.busybox-static instalado (para el shell del contenedor).sudo) para ejecutar runc y modificar /proc.Pasos:
poc.sh.chmod +x poc.sh.sudo ./poc.sh.[+] EXPLOIT SUCCEEDED!, significa que se ganó la condición de carrera. El archivo /proc/sys/kernel/core_pattern del anfitrión fue modificado exitosamente desde dentro del contenedor, confirmando la vulnerabilidad.[-] Exploit did not succeed., la carrera no se ganó en este intento. Las condiciones de carrera son probabilísticas y dependen en gran medida del tiempo y la carga del sistema. Intenta ejecutar el script varias veces más.El PoC modificará un archivo del sistema. Para restaurarlo a su estado original, ejecuta el comando sugerido por el script:
# El 'ORIGINAL_PATTERN' será el valor real de tu sistema
echo 'original_core_pattern_value' | sudo tee /proc/sys/kernel/core_pattern
/proc/sys/kernel/core_patternrootfs/dev/null.rootfs/dev/null al archivo objetivo del anfitrión (/proc/sys/kernel/core_pattern).rootfs/dev/null como un dispositivo de caracteres adecuado (mknod).Ejecución:
symlink_race se inicia como un proceso en segundo plano.runc run ... para crear e iniciar el contenedor. Este es el momento en que runc intentará aplicar los maskedPaths.runc exec para ejecutar un comando dentro del contenedor: echo 'pwned' > /proc/sys/kernel/core_pattern.Verificación:
/proc/sys/kernel/core_pattern del anfitrión."pwned" y el valor original.[+] EXPLOIT SUCCEEDED! o [-] Exploit did not succeed..