BadHost: дыра в Starlette угрожает миллионам ИИ-агентов

Одна буква - и вся защита рухнула
Представьте: вы строите сложную систему ИИ-агентов, тщательно настраиваете авторизацию, выбираете проверенные фреймворки - и все это рассыпается из-за одного символа в HTTP-заголовке. Именно так работает уязвимость BadHost, которая на этой неделе взорвала сообщество разработчиков Python и безопасников по всему миру. Это не теоретическая угроза в духе "когда-нибудь кто-нибудь может попробовать" - это уже активно эксплуатируемая дыра в одном из самых популярных open source пакетов планеты.
Что такое Starlette и почему это важно именно сейчас
Starlette - это ASGI-фреймворк для Python, который скачивают 325 миллионов раз в неделю. Для сравнения: это примерно как если бы каждый Python-разработчик на Земле скачивал его несколько раз в день. На его основе построен FastAPI - один из самых любимых инструментов для создания backend-сервисов в мире машинного обучения. Кроме него в зону риска попали vLLM, LiteLLM, Text Generation Inference, большинство OpenAI-совместимых прокси и - что особенно болезненно - серверы на базе MCP (Model Context Protocol).
MCP - это протокол, который позволяет ИИ-агентам от крупных провайдеров подключаться к внешним ресурсам: базам данных пользователей, почте, календарям, корпоративным системам. Грубо говоря, это "нервная система" современного агентного ИИ. И именно там хранятся учетные данные для всех этих подключений - настоящий Клондайк для злоумышленника.
Как это работает: элегантная простота атаки
Технически суть BadHost (CVE-2026-48710) выглядит почти издевательски просто. Starlette восстанавливает полный URL запроса на основе HTTP-заголовка Host и пути - но при этом никак не валидирует значение Host. Приложения, которые используют объект `request.url` для авторизации, получают на вход подделанные данные и радостно пропускают злоумышленника.
Один символ в заголовке - и path-based авторизация обходится полностью. Помимо этого, уязвимость открывает возможности для SSRF-атак (подделка запросов на стороне сервера) и в ряде конфигураций - для удаленного выполнения кода. Это уже не просто "утечка данных", это потенциальный полный захват сервера.
Исследователи из X41 D-Sec, которые обнаружили уязвимость, уже провели сканирование и зафиксировали реально открытые данные: клинические базы данных биофармацевтических компаний с данными об M&A-сделках, системы верификации личности с живыми биометрическими данными, SSH-доступ к промышленным IoT-устройствам, полный доступ к корпоративным почтовым ящикам вплоть до удаления писем, базы кандидатов HR-систем и даже доступ к AWS-топологии облачных инфраструктур.
Рейтинг 7/10 - это преступная скромность
Формально BadHost получила оценку 7 из 10 по шкале CVSS. Сами исследователи из Secwest прямо назвали эту классификацию "существенно занижающей реальную угрозу". X41 D-Sec присвоили ей статус критической - и я с ними согласен полностью.
Дело в том, что CVSS оценивает уязвимость в вакууме, без учета экосистемного контекста. А здесь контекст - это миллионы MCP-серверов, которые сейчас разворачиваются с космической скоростью по всему миру на волне агентного ИИ-бума. Каждый такой сервер - это потенциально открытый сейф с ключами от десятков корпоративных систем.
Кто под ударом и что делать прямо сейчас
Если вы используете FastAPI, vLLM, LiteLLM или любой другой пакет, который тянет Starlette как зависимость - у вас проблема, если вы не обновились. Патч вышел в пятницу в версии Starlette 1.0.1. Обновление занимает минуты, откладывать его - значит осознанно рисковать.
X41 D-Sec совместно с Nemesis запустили онлайн-сканер для проверки конкретного сервера на уязвимость. Это хороший первый шаг, но не заменяет полноценный аудит конфигурации firewall. Серверы за корректно настроенным брандмауэром защищены лучше, но большинство дев-инстансов и стейджинг-окружений - нет, и именно там утечки случаются чаще всего.
Российский контекст: двойной удар
Для российских разработчиков и компаний ситуация имеет дополнительное измерение. Значительная часть отечественных ИИ-стартапов строит свои решения на FastAPI и vLLM - это де-факто стандарт индустрии, который не обходит стороной никакие географические границы. При этом многие команды работают в режиме "запустить быстро, С безопасностью потом" - и BadHost - это именно тот сценарий, где такой подход оборачивается катастрофой.
Обновить Starlette можно без VPN и без зарубежных карт - PyPI работает в России в штатном режиме. Команда `pip install starlette --upgrade` решает проблему мгновенно. Нет ни одной причины тянуть.
Системная проблема глубже, чем один пакет
BadHost - это симптом более широкой болезни. Экосистема агентного ИИ развивается так стремительно, что security-аудит просто не успевает за скоростью внедрения. MCP-серверы разворачиваются тысячами в день, разработчики копируют примеры из документации и туториалов, не задумываясь о том, что авторизация через `request.url` в Starlette - это ловушка.
Антропик, OpenAI и другие крупные провайдеры активно продвигают MCP как стандарт агентного взаимодействия. Это правильно и неизбежно - но вместе с ростом экосистемы растет и поверхность атаки. Индустрии нужен серьезный разговор о том, как встраивать security-проверки прямо в процесс разработки агентных систем, а не добавлять их постфактум.
Patch сейчас. Аудит конфигураций - сегодня. Разговор с командой о security-гигиене в agenttic AI - на этой неделе.
Источники
Похожие новости
Crusoe привлек $3,9 млрд: заводские ИИ-фабрики против гигантских дата-центров
Денверская компания Crusoe закрыла раунд Series F на $3,9 млрд, оценив себя в $30,9 млрд - втрое дороже, чем год назад. Деньги пойдут на модульные ИИ-фабрики Spark и мегакампусы в Техасе.
Claude Code перезапустил Projects: несколько агентов в облаке под одной крышей
Anthropic обновила Projects в Claude Code: теперь команда агентов работает параллельно, делит память и файлы, а координатор следит за порядком.
GitHub переписал движок Copilot на Rust с помощью самого Copilot
GitHub перевел runtime Copilot CLI на нативный Rust, задействовав агентов Copilot для миграции 800 000 строк кода - масштаб, который раньше был просто нерентабелен.