Утечка ключа LiteLLM привела к компрометации релиза Python-пакета

LiteLLM сообщила, что случайно опубликованный в мае 2026 года мастер-ключ платформы Agent Platform позволил неизвестному атакующему получить доступ к GitHub и 21 октября выпустить вредоносную версию Python-пакета LiteLLM 1.107.0. PyPI поместил эту версию в карантин в 13:23 UTC, а теги образов Docker Hub и GHCR были удалены либо переназначены на проверенные образы.
Как утечка ключа привела к захвату релизного конвейера
27 мая в публичный репозиторий LiteLLM-Labs/lite-harness попал конфигурационный файл с мастер-ключом развёртывания LiteLLM Agent Platform. Коммит быстро переписали, а скомпрометированные ключи признали подлежащими отзыву. Однако сам мастер-ключ отозван не был.
10 октября злоумышленник использовал этот ключ для доступа к Agent Platform и извлёк OAuth-токен GitHub CLI. Сервис применял его, чтобы самостоятельные облачные агенты могли создавать pull request в репозиториях. Токен не был ограничен по правам и принадлежал владельцу GitHub-организации, поэтому давал доступ уровня владельца ко всем её репозиториям.
После этого атакующий создавал короткоживущие ветки в BerriAI/litellm и BerriAI/litellm-auto. В них добавлялись workflow-файлы .github/workflows/cache.yml, замаскированные под изменение конфигурации кэша. Ветки запускали процессы, передавали собранные данные на контролируемые webhook.site адреса и вскоре удалялись.
Какие секреты пытались собрать workflow
Исследователь Socket Карло Занки установил, что два коммита опирались на легитимные изменения и использовали ветки вида ci-tmp-<hex>, существовавшие считаные минуты. Первый workflow собирал токены GitHub, ключи Linear, LiteLLM и Together AI, а также идентификатор и ключ подписи GitHub App.
Запуск от 12 октября расширил перечень на ключи Anthropic, OpenAI, AWS Bedrock, Tavily и GitGuardian. В него также вошли состояние браузерной сессии Playwright, параметры PostgreSQL и данные Redis. Socket отдельно отметила, что сохранённое состояние Playwright может дать аутентифицированный доступ к связанному аккаунту Linear без пароля и прохождения многофакторной аутентификации.
21 октября атакующий обошёл защиту веток и изменил конвейер релизов: источником стал похожий репозиторий Berri-AI/litellm вместо BerriAI/litellm. Затем была опубликована версия 1.107.0, а позже — контейнерные образы. LiteLLM пояснила, что в тот период правило выпуска временно смягчили: вместо запуска уполномоченным инженером и одобрения специальным аккаунтом на физическом устройстве достаточно было двух инженеров.
Что делала вредоносная версия
По оценке Microsoft Security Research, файлы из LiteLLM 1.107.0 автоматически исполнялись при запуске Python, даже если приложение не импортировало LiteLLM. Один механизм собирал учётные данные из инструментов разработчика, ИИ-приложений, облачных сред и браузеров; другой работал как Unix-бэкдор и раз в час получал код для исполнения.
Вредоносный компонент также искал системные сведения, SSH-файлы, учётные данные Git и GitLab, переменные окружения и токены npm, PyPI, pip, Yarn, Maven, Gradle, Composer, RubyGems и Cargo. Собранное архивировалось и отправлялось HTTP POST-запросом на домен litellm.dev/healthcheck, зарегистрированный 13 октября.
LiteLLM начала отзыв токенов всех внутренних систем и поставщиков. Для бизнеса инцидент показывает, что удаления ошибочного коммита недостаточно: секрет нужно немедленно отозвать, токены следует ограничивать минимальными правами, а релизные workflow и опубликованные зависимости необходимо проверять как часть защиты цепочки поставки.

