FlawOpen

flawopen.com/AI Security/litellm-mcp-preview-command-injection-cve-2026-42271

● CVE-2026-42271 · CVSS v4 8.7[1] · Высокий
Исследования · FlawOpen

Инъекция команд в MCP LiteLLM: CVE-2026-42271

GTIG подтвердил эксплуатацию CVE-2026-42271: действующий ключ LiteLLM позволял запускать команды через предпросмотр MCP. Обновитесь до 1.83.7+.[1], [6], [8]

Вектор CVSSCVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:H/VI:H/VA:H/SC:H/SI:N/SA:N[1]
💡 Простыми словами (ELI5)

В мастерской посетителям дают проверить инструмент перед добавлением. Стенд проверки может запустить мощный станок мастерской, поэтому давать ему инструкции должен только руководитель. В уязвимых версиях LiteLLM до стенда мог добраться любой принятый пропуск. Отдельная ошибка Starlette также могла обмануть охранника, который проверяет доступ по восстановленному URL. Для этих границ нужны отдельные исправления. У другой стойки посетитель может написать косую черту или вопросительный знак на наклейке посылки. Служащий вставляет этот текст в восстановленный адрес и принимает его за новый маршрут, хотя посылка всё равно идёт по исходному коридору. Так проявляется отдельная путаница Host и пути в Starlette.[1], [3], [5]

Ключевые понятия и термины

Model Context Protocol (MCP)
Протокол, с помощью которого приложение, например шлюз ИИ, подключается к внешним инструментам и источникам данных. Конечные точки предварительного просмотра LiteLLM проверяют конфигурацию MCP перед сохранением.[1]
Транспорт stdio
Режим подключения MCP, запускающий локальный дочерний процесс и обменивающийся сообщениями через стандартный ввод и вывод. Процесс работает на узле прокси LiteLLM с правами службы прокси.[1], [2]
Ролевая авторизация
Проверка на сервере, разрешающая операцию только идентичности с нужной ролью. В CVE-2026-42271 для маршрутов предварительного просмотра отсутствовала проверка PROXY_ADMIN, использовавшаяся при сохранении.[1], [2]
CVE-2026-48710 (Starlette BadHost)
Отдельная ошибка Starlette: некорректный заголовок Host мог привести к тому, что request.url.path отличался от пути, использованного маршрутизацией. Horizon3 сообщила, что это могло обойти авторизацию LiteLLM по пути при определённых сочетаниях зависимостей; эта ошибка не входит в CVE-2026-42271.[3], [5], [4]
Список разрешённых команд MCP stdio
Набор базовых имён исполняемых файлов, которые LiteLLM допускает для транспорта stdio. Проверка выполняется при валидации конфигурации и повторно перед созданием клиента для старых записей. Это не песочница: разрешённые среды выполнения могут интерпретировать переданные аргументы.[8]

Связи со стандартами

Пошаговый сценарий атаки

Шаг 1

Проверьте версию LiteLLM и доступность маршрутов

Согласно advisory сопровождающих, затронуты версии LiteLLM >=1.74.2 и <1.83.7; требуется действующий API-ключ прокси. До исправления к preview-маршрутам мог обратиться любой владелец ключа, включая ключ внутреннего пользователя с низкими привилегиями. GTIG включает CVE-2026-42271 в список подтверждённой эксплуатации; для предпосылок именно этого CVE используйте модель с аутентификацией из advisory сопровождающих.[1], [6]

Шаг 2

Ключ с низкими привилегиями достигает административного предпросмотра

Конечные точки принимали полную конфигурацию сервера MCP, включая команду stdio, аргументы и переменные окружения. Сервер проверял ключ, но не роль PROXY_ADMIN, поэтому любой аутентифицированный владелец ключа мог запустить предпросмотр.[1]

Шаг 3

Предпросмотр запускает процесс на узле прокси

Чтобы проверить переданную конфигурацию stdio, LiteLLM создавал клиент MCP и запускал заданный дочерний процесс с правами службы прокси. Это выполнение команд на узле шлюза, а не просто небезопасный текст, сформированный моделью ИИ.[2], [8]

Шаг 4

Отдельная ошибка Starlette может ослабить границу аутентификации

Horizon3 сообщила, что CVE-2026-48710 могла заставить авторизацию по пути увидеть request.url.path, отличный от маршрута, выбранного Starlette, если присутствовала уязвимая версия. Исследователи сообщили о цепочке с CVE-2026-42271, которая снимала требование API-ключа в затронутых развертываниях. Указывайте авторство этой цепочки; причины и исправления CVE различаются.[5], [3], [4]

Шаг 5

Исправьте обе границы и проверьте разрешённые версии пакетов

В LiteLLM 1.83.7 исправлены preview-маршруты: теперь они требуют PROXY_ADMIN, а tools/list имеет явную аутентификацию. Патч также проверяет список разрешённых команд при создании/обновлении и повторно в _create_mcp_client, чтобы отсеять старую конфигурацию. Список не является песочницей: разрешённые среды выполнения всё ещё интерпретируют аргументы. Starlette отдельно исправил CVE-2026-48710 в версии 1.0.1; проверьте фактически разрешённые версии пакетов и независимо оцените описанную цепочку.[1], [8], [4], [7]

Шаг 6

Контекст недавней кампании (сообщение от 7 октября 2026 года)

Black Lotus Labs сообщила, что образец вредоносной программы PoeLLM, вероятно, нацеливался на /mcp-rest/test/connection; BleepingComputer также сообщила о попытках использовать CVE-2026-42271 в этой кампании. Отчет не доказывает, что все зараженные узлы были скомпрометированы через этот CVE или что каждая цель LiteLLM была уязвима. Это свидетельство текущего таргетирования, а не число жертв, связанных именно с этой ошибкой.[9], [10]

Анализ первопричины

Ошибка LiteLLM заключалась в отсутствии проверки роли на обоих маршрутах предварительного просмотра MCP: любой действительный API-ключ прокси позволял вызвать их без роли PROXY_ADMIN. Предварительный просмотр соединения принимал заданную клиентом конфигурацию stdio и запускал команду с правами процесса прокси. Отдельная ошибка Starlette позволяла некорректному заголовку Host привести к тому, что request.url.path отличался от маршрутизированного Starlette пути; Horizon3 сообщила, что при объединении этого поведения с LiteLLM можно обойти проверку API-ключа, основанную на пути. Это разные уязвимости: устраните проблемы авторизации и выполнения команд в LiteLLM и обновите Starlette до версии 1.0.1 или новее.[1], [8], [3], [4], [5]

Исходный код: Уязвимый vs Защищённый вариант

Этот фрагмент показывает объединённое исправление LiteLLM на границе запуска: перед созданием stdio-клиента проверяется базовое имя команды, поэтому проверку проходят и старые записи из БД/конфигурации. Патч также проверяет новые и обновляемые конфигурации серверов и ограничивает оба preview-эндпоинта ролью PROXY_ADMIN; для /test/tools/list добавлена явная зависимость user_api_key_auth. Список разрешённых команд — не песочница: разрешённые среды выполнения всё ещё могут интерпретировать аргументы. Оставьте preview только администраторам и запускайте прокси с минимальными привилегиями.[1], [2], [8]

Фрагмент исходного кода: Фрагмент проверки stdio-клиента LiteLLM

УЯЗВИМАЯ РЕАЛИЗАЦИЯ
# _create_mcp_client до добавления проверки stdio-команд.
if server.command and server.args is not None:
    stdio_config = MCPStdioConfig(
        command=server.command,
        args=server.args,
        env=resolved_env,
    )
БЕЗОПАСНЫЙ ИСПРАВЛЕННЫЙ ВАРИАНТ
# _create_mcp_client: повторно проверяйте старые записи БД/конфигурации.
if server.command:
    base_command = os.path.basename(server.command)
    if base_command not in MCP_STDIO_ALLOWED_COMMANDS:
        raise HTTPException(
            status_code=403,
            detail="MCP stdio command is not in the allowlist",
        )

if server.command and server.args is not None:
    stdio_config = MCPStdioConfig(
        command=server.command,
        args=server.args,
        env=resolved_env,
    )

Чек-лист по защите системы для инженеров

Источники

← AI Security Directory →