flawopen.com/AI Security/litellm-mcp-preview-command-injection-cve-2026-42271
Инъекция команд в MCP LiteLLM: CVE-2026-42271
GTIG подтвердил эксплуатацию CVE-2026-42271: действующий ключ LiteLLM позволял запускать команды через предпросмотр MCP. Обновитесь до 1.83.7+.[1], [6], [8]
В мастерской посетителям дают проверить инструмент перед добавлением. Стенд проверки может запустить мощный станок мастерской, поэтому давать ему инструкции должен только руководитель. В уязвимых версиях 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]
Связи со стандартами
- Ссылка CWE для слабого места, описанного в этом руководстве: CWE-78
- CISA KEV — добавлено 2026-06-08 — CVE-2026-42271
Пошаговый сценарий атаки
Проверьте версию LiteLLM и доступность маршрутов
Согласно advisory сопровождающих, затронуты версии LiteLLM >=1.74.2 и <1.83.7; требуется действующий API-ключ прокси. До исправления к preview-маршрутам мог обратиться любой владелец ключа, включая ключ внутреннего пользователя с низкими привилегиями. GTIG включает CVE-2026-42271 в список подтверждённой эксплуатации; для предпосылок именно этого CVE используйте модель с аутентификацией из advisory сопровождающих.[1], [6]
Ключ с низкими привилегиями достигает административного предпросмотра
Конечные точки принимали полную конфигурацию сервера MCP, включая команду stdio, аргументы и переменные окружения. Сервер проверял ключ, но не роль PROXY_ADMIN, поэтому любой аутентифицированный владелец ключа мог запустить предпросмотр.[1]
Отдельная ошибка Starlette может ослабить границу аутентификации
Horizon3 сообщила, что CVE-2026-48710 могла заставить авторизацию по пути увидеть request.url.path, отличный от маршрута, выбранного Starlette, если присутствовала уязвимая версия. Исследователи сообщили о цепочке с CVE-2026-42271, которая снимала требование API-ключа в затронутых развертываниях. Указывайте авторство этой цепочки; причины и исправления CVE различаются.[5], [3], [4]
Исправьте обе границы и проверьте разрешённые версии пакетов
В LiteLLM 1.83.7 исправлены preview-маршруты: теперь они требуют PROXY_ADMIN, а tools/list имеет явную аутентификацию. Патч также проверяет список разрешённых команд при создании/обновлении и повторно в _create_mcp_client, чтобы отсеять старую конфигурацию. Список не является песочницей: разрешённые среды выполнения всё ещё интерпретируют аргументы. Starlette отдельно исправил CVE-2026-48710 в версии 1.0.1; проверьте фактически разрешённые версии пакетов и независимо оцените описанную цепочку.[1], [8], [4], [7]
Контекст недавней кампании (сообщение от 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,
)
Чек-лист по защите системы для инженеров
- ✓Составьте перечень развертываний прокси LiteLLM и проверьте фактически разрешённую версию; обновите затронутые выпуски до 1.83.7 или новее.[1], [8]
- ✓Проверьте lock-файл или образ и убедитесь, что используется Starlette 1.0.1 или новее, если это допускает разрешённая версия FastAPI; не применяйте непроверенное переопределение зависимости.[3], [7]
- ✓До обновления LiteLLM блокируйте POST /mcp-rest/test/connection и POST /mcp-rest/test/tools/list на обратном прокси или API-шлюзе, как рекомендует бюллетень сопровождающих.[1]
- ✓Убедитесь, что обе конечные точки требуют user_api_key_auth и отклоняют любую роль, кроме PROXY_ADMIN, до создания клиента MCP.[1], [8]
- ✓Добавьте тесты, подтверждающие, что неаутентифицированный запрос и действующий ключ без роли администратора не запускают предварительный просмотр, а уполномоченный администратор может выполнить штатную операцию.[8]
- ✓Для Starlette проверьте обработку некорректного Host и убедитесь, что middleware контроля доступа использует канонический путь ASGI или проверенный фреймворком URL.[3], [4]
- ✓Проверьте журналы прокси и телеметрию дочерних процессов на неожиданные обращения к маршрутам предпросмотра; смените хранящиеся в прокси учётные данные, если расследование указывает на возможный доступ к узлу.[1], [8]
- ✓Ведите отдельные записи:
CVE-2026-42271— выполнение команд LiteLLM;CVE-2026-48710— разбор Host и подмена пути в Starlette.[1], [3] - ✓Проверьте LITELLM_MCP_STDIO_EXTRA_COMMANDS во всех средах: пользовательские записи расширяют границу доверия исполняемым файлам и не делают обработку аргументов безопасной.[8]
Источники
- LiteLLM security advisory GHSA-v4p8-mg3p-g94g / CVE-2026-42271
- LiteLLM pull request #25343: MCP stdio endpoint authorization and command validation fix
- Starlette advisory GHSA-86qp-5c8j-p5mr / CVE-2026-48710
- Starlette commit 764dab0: ignore malformed Host when constructing request.url
- Horizon3: CVE-2026-42271 chained with CVE-2026-48710
- Google Threat Intelligence Group: Vulnerability Discovery and Exploitation Trends in the AI Era
- LiteLLM issue #28993: FastAPI constraint and Starlette CVE-2026-48710 dependency resolution report
- LiteLLM merged PR #25343 — command allowlist, execution guard, role checks, and tests
- Lumen Black Lotus Labs: вредоносная программа PoeLLM атакует открытые сервисы
- BleepingComputer: атаки PoeLLM на доступные из интернета AI-серверы