325 миллионов скачиваний в неделю и один символ в заголовке. Что такое BadHost и почему ваш самописный AI-агент тоже под ударом

325 миллионов скачиваний в неделю и один символ в заголовке. Что такое BadHost и почему ваш самописный AI-агент тоже под ударом

21 мая немецкая X41 D-Sec выкатила патч Starlette 1.0.1 и опубликовала уязвимость CVE-2026-48710. Под ударом FastAPI, vLLM, LiteLLM и любой MCP-сервер с проверкой прав по URL-пути. Что это значит для владельца бизнеса, у которого внутри уже работает свой AI-агент, и как закрыть проблему за полчаса.

Что произошло

325 миллионов скачиваний в неделю и один символ в заголовке. Что такое BadHost и почему ваш самописный AI-агент тоже под ударом

Starlette это маленький ASGI-фреймворк, на котором держится почти всё, что в Python называется agentic-стеком. FastAPI это надстройка над Starlette. LiteLLM, vLLM, большинство MCP-серверов, OpenAI-совместимые шлюзы, agent-харнесы вроде LangGraph, все эти проекты используют Starlette как фундамент.

Скачиваний у Starlette 325 миллионов в неделю. Это не редкий пакет, это водопровод.

В январе 2026 группа X41 D-Sec проводила аудит vLLM по гранту фонда OSTIF. В коде Starlette нашли участок, который собирает request.url из HTTP-заголовка Host и пути запроса, не проверяя Host по RFC 3986. Если в Host подставить символ, отсутствующий в стандарте, Starlette перепарсит URL, и проверка прав по пути пропустит атакующего туда, куда не должна.

Один символ. Без эксплойта, без шеллкода, без выполнения кода. Просто авторизация на эндпоинте, до которого по идее доступа не было.

Патч готовили три месяца. Версия Starlette 1.0.1 вышла 21 мая, публичное раскрытие 22 мая, сканер открыт на badhost.org.

Кого касается

325 миллионов скачиваний в неделю и один символ в заголовке. Что такое BadHost и почему ваш самописный AI-агент тоже под ударом

Если в команде есть хотя бы один из этих сценариев, проверка обязательна:

  • самописный MCP-сервер на FastAPI;
  • LiteLLM-шлюз перед Claude или GPT API;
  • vLLM для self-hosted моделей;
  • внутренний agent-харнес на Python, который принимает HTTP-запросы;
  • любой эндпоинт «для своих» с проверкой прав по пути URL.

Если бизнес работает только в Cowork или ChatGPT, прямой угрозы нет. Runtime у вендора в облаке. Но как только команда выходит за пределы управляемого продукта в собственный стек, фундамент становится вашей ответственностью.

Механизм атаки

Технически уязвимость на стыке трёх слоёв. ASGI-сервер передаёт Host из заголовка как есть. Starlette берёт этот Host, склеивает с path, заново парсит итоговый URL и кладёт результат в request.url. Разработчики, пишущие middleware, чаще всего используют request.url.path для решения вопроса «можно ли пускать на этот эндпоинт».

Если Host содержит символы из «серой зоны» RFC, перепарсинг ведёт к расхождению между тем, какой path пришёл, и тем, какой путь увидела проверка прав. Запрос идёт по одному адресу, а проверка считает, что он по другому.

Шлюзы вроде LiteLLM и vLLM держат на этих эндпоинтах admin и key-management. То есть передача API-ключей, выгрузка списка пользователей, управление моделями. Доступ к этому без аутентификации, это уже не «утечка данных», это полный захват infra.

Дополнительная боль в том, что между обнаружением (январь) и патчем (21 мая) прошло почти четыре месяца. По формальной координации это в норме. Но в это окно атака была технически возможна для любого, кто читает GitHub-issues внимательно.

Что делать сегодня

325 миллионов скачиваний в неделю и один символ в заголовке. Что такое BadHost и почему ваш самописный AI-агент тоже под ударом

Чеклист для команды, у которой внутри уже есть свой AI-агент:

  1. Получить версии. Команда pip show starlette в каждом проекте, где есть FastAPI, vLLM или LiteLLM. Любая версия ниже 1.0.1 в патч.
  2. Поставить обратный прокси перед ASGI. Nginx или Caddy с явной проверкой Host по белому списку доменов. Это закрывает атаку на уровне до приложения.
  3. Переписать проверку прав. Если в коде есть строки вроде if request.url.path.startswith("/admin"), переписать на FastAPI Depends и Security. Это не про BadHost напрямую, это про общую гигиену.
  4. Прогнать сканер на badhost.org по своим публичным эндпоинтам. Сканер бесплатный, на него не нужно регистрироваться.
  5. Обновить мониторинг. Алерт на нестандартные Host-заголовки в логах nginx или uvicorn. Это не предотвращает атаку, но даёт сигнал «что-то пробуют».

На команду до 10 человек весь чеклист отнимает 30-45 минут.

Большая картинка

325 миллионов скачиваний в неделю и один символ в заголовке. Что такое BadHost и почему ваш самописный AI-агент тоже под ударом

15 июня Anthropic вводит отдельный счётчик кредитов для Claude Code, Agent SDK и сторонних агентских приложений. Сценарий, при котором AI-задачи живут в общем пуле подписки, закончится. С 15 июня стоимость каждой агентской команды становится частью отчёта о прибылях и убытках, а не строкой в IT-бюджете.

Часть команд решит уходить из управляемого окружения в собственный стек, чтобы видеть и контролировать расход. Это нормальный ход. Но в момент, когда фундамент Python для AI-агентов сидит в патч-марафоне, переезжать без аудита значит менять одну фиксированную плату на потенциально неограниченную плату за инциденты.

Сначала аудит стека. Потом миграция.

Если вы AI-Officer внутри компании или внешний консультант, в ближайшие четыре недели у вас одна задача: убедиться, что инфраструктура под Claude или GPT не течёт.

325 миллионов скачиваний в неделю и один символ в заголовке. Что такое BadHost и почему ваш самописный AI-агент тоже под ударом

Источники

X41 D-Sec и OSTIF, координированное раскрытие уязвимости и сканер: badhost.org.

Описание Starlette 1.0.1, официальный changelog проекта Encode.

Обсуждение технического механизма, Hacker News от 22 мая 2026 года.

CSO Online и Cybersecurity News, расширенный разбор для специалистов.

Больше разборов: t.me/gorilla_under_hood

2