Разбор инцидента LiteLLM 1.107.0: взлом релизного конвейера за 1,5 часа, подпись не спасла
Разбор инцидента с LiteLLM 1.107.0 показывает, как злоумышленники за полтора часа прошли через укреплённый релизный конвейер открытого LLM-шлюза, и даже криптографическая подпись не помогла, потому что конвейер сам собрал и подписал чужой код.

LiteLLM хранит ключи ко всем провайдерам моделей, которыми пользуется команда: OpenAI, Anthropic, облачные сервисы. Один заражённый пакет открывает доступ ко всем этим ключам сразу, а стилер (программа для кражи данных) запускался без единого import, при любом вызове Python в том же окружении.
21 октября 2026 года на PyPI (главный репозиторий пакетов Python) появилась версия litellm==1.107.0 со встроенным стилером учётных данных. Заражёнными оказались и образы Docker с тем же тегом. По данным отчёта BerriAI (разработчик LiteLLM), заражённый пакет пролежал на PyPI около 1 часа 45 минут, а образы Docker Hub под плавающими тегами были доступны около 2 часов 30 минут. Для LiteLLM это второй подобный случай за год: в марте 2026 были скомпрометированы версии 1.82.7 и 1.82.8.
Ниже разбираю инцидент пошагово: как проверить, затронуты ли вы, и что делать прямо сейчас. Факты взяты из отчёта BerriAI (обновление 21.10, 20:30 UTC), разборов StepSecurity, Wiz и Socket.
Что понадобится
- Доступ к серверам и CI-раннерам (средам автоматической сборки), где установлен LiteLLM
- Терминал с правами на чтение файловой системы и просмотр Docker-образов
- Доступ к DNS-настройкам или сетевому фильтру на выходе из сети
- Около 30 минут на проверку одного хоста, плюс время на ротацию ключей по числу сервисов
Как атака прошла через защиту?
После мартовского инцидента BerriAI перестроила выпуск релизов. Появились:
- Релизный кандидат, тесты, сборка артефактов в приватном репозитории, повторные тесты
- Публикация через Trusted Publishers (механизм PyPI, который привязывает публикацию к конкретному репозиторию) с отдельного аккаунта
- Неизменяемые теги Docker для релизов
- Подписанные образы Docker
По оценке авторов разбора, это заметно лучше среднего по опенсорсу. И всё равно атака прошла.
Пошаговая инструкция: проверка и реагирование
-
Не запускайте Python на подозрительном хосте. Стилер срабатывает при любом вызове интерпретатора в заражённом окружении, даже команда
pip show litellmзапустит вредоносный код заново. -
Проверьте lock-файлы и зависимости на наличие версии 1.107.0:
grep -rn "litellm.*1\.107\.0" --include="requirements*.txt" --include="*.lock" --include="pyproject.toml" .
- Найдите файлы стилера в файловой системе:
find / \( -name cook.pth -o -name cook.py -o -name 'cook*.pyc' -o -name 'sitecustomize*.pyc' \
-o -name 'litellm-1.107.0*' \) 2>/dev/null
ls -l /tmp/remote_code_loader.lock /tmp/.pc_once_* 2>/dev/null
- Проверьте Docker-образы по дайджесту (уникальному хешу образа):
docker images --digests | grep -i litellm
# заражённый дайджест: sha256:1bbcb1443bc962e45f5aad53fe3d2c30600e0379715fb6c664cdd3ac126c339e
-
Убейте процесс, который держит
/tmp/remote_code_loader.lock, и заблокируйте доменыlitellm.devиwww.litellm.devна уровне DNS или сетевого фильтра. -
Пересоберите образы и виртуальные окружения с нуля. Не пытайтесь просто удалить три файла: стилер мог уже выгрузить данные и установить загрузчик второго этапа.
-
Закрепите версию
litellm==1.106.2или используйте образ по дайджесту. Удалите 1.107.0 из внутренних зеркал и реестров. -
Ротируйте все секреты, к которым хост имел доступ. По данным StepSecurity, стилер собирал пароли и cookies браузеров, SSH-, GPG- и TLS-ключи, учётные данные AWS, Azure, gcloud, Kubernetes, Docker, GitHub, реестров пакетов, файлы
.env, секреты CI-инфраструктуры (Vault, Jenkins, Terraform), конфигурации и токены более 20 ИИ-инструментов для разработки, а при заданномDATABASE_URLвыгружал базу прокси LiteLLM целиком. -
Проверьте сетевые логи на предмет запросов к
litellm.dev. Запрос на путь/codepyозначает, что выполнялся второй этап атаки. Но отсутствие следов не доказывает чистоту хоста, потому что архив с украденными данными шифровался AES-256-CBC и уходил обычным HTTP POST.
Пять шагов атакующего: почему подпись не помогла
Атака заняла полтора часа и прошла так.
- Окно расширенных прав. За день до атаки двум инженерам временно выдали права на публикацию, чтобы выпустить бэкпорты исправлений.
- Три набора токенов. У атакующего были OAuth-токены GitHub CLI трёх разработчиков. Одним он запустил workflow (скрипт автоматической сборки), вторым прошёл шаг ручного одобрения, третьим стёр записи о запусках.
- Обход защиты веток. Первая попытка правки релизного workflow была отклонена. Через пять секунд токеном владельца организации защиту отключили и принудительно запушили изменение.
- Подмена источника. Изменённый workflow собирал код не из
BerriAI/litellm, а из двойникаBerri-AI/litellm, отличающегося одним дефисом. - Легитимная подпись. Конвейер подписал и опубликовал артефакты штатным образом. Проверка подписи показала бы легитимный релиз.
Официальный тег v1.107.0 в исходном репозитории чистый: артефакты были собраны из чужого кода. Клиентов приватного enterprise-реестра, по словам BerriAI, инцидент не затронул.
По версии BerriAI, атакующий попал во внутренний деплой LiteLLM, открытый в интернет, вероятно через недавно закрытую уязвимость. Этот деплой записывал в логи тела ответов, и в них могли оказаться OAuth-токены GitHub CLI разработчиков. Расследование продолжается.
Допустим, вы используете LiteLLM как прокси для доступа к моделям через единый API. Утром 21 октября ваш CI-раннер обновил зависимости автоматически, и pip install litellm без закреплённой версии поставил 1.107.0. С этого момента любой вызов Python в этом окружении запускал стилер. Результат: на сервер атакующего ушли все ключи из переменных окружения, конфиги Kubernetes, токены Docker и GitHub, cookies браузеров, а если был задан DATABASE_URL, то и вся база прокси с мастер-ключом и ключами всех подключённых провайдеров моделей.
Думать, что проверка подписи защищает от подмены источника. Подпись удостоверяет, что артефакт собран конвейером. Но если конвейер сам скомпрометирован и собирает код из подменённого репозитория, подпись будет настоящей, а код чужим.
Чистить три файла вместо пересборки. На Linux и macOS стилер запускал отдельный демон (фоновый процесс), который раз в час обращался к «тайнику» на GitHub и выполнял оттуда произвольный код. Удаление cook.py не убивает демон и не закрывает этот канал.
Проверять хост, запуская Python. Команда pip show litellm сама запускает интерпретатор, а значит, снова запускает стилер. Используйте grep и find напрямую.
Не блокировать домен litellm.dev. Домен зарегистрировали 13 октября, за восемь дней до атаки. Даже после удаления пакета заражённые хосты с демоном продолжают обращаться туда.
Игнорировать плавающие теги Docker. Затронуты не только образы с тегом v1.107.0, но и latest, main-latest, main-stable, скачанные с 11:46 до 14:20 UTC 21 октября.
Что делать прямо сейчас, по ролям
Разработчику и DevOps-инженеру. Проверьте все среды по инструкции выше. Закрепляйте версии зависимостей и Docker-образы по дайджесту, не по плавающим тегам. Если используете LiteLLM, зафиксируйте 1.106.2 до выхода подтверждённо чистой версии.
Руководителю команды и предпринимателю. Инцидент показывает: LLM-шлюз (система, через которую проходят запросы ко всем моделям) это точка концентрации секретов. Один скомпрометированный пакет даёт доступ ко всем подключённым провайдерам. Проведите аудит: какие ключи хранятся в переменных окружения, кто имеет доступ к CI, есть ли мониторинг зависимостей.
Автору Дзена и маркетологу. Если вы работаете с ИИ-инструментами через API и используете Python-обёртки, проверьте, нет ли LiteLLM в цепочке зависимостей ваших инструментов. Многие SaaS-сервисы для работы с нейросетями строят интеграцию поверх LiteLLM.
Пользователям из РФ и СНГ. Из открытых LLM-шлюзов в российском контексте чаще используют прямые SDK провайдеров (YandexGPT SDK, GigaChat API). Если вы подключены к зарубежным моделям через LiteLLM, вся инструкция выше применима полностью.
Этот инцидент ценен не стилером, а уроком о доверии к конвейеру. Команда BerriAI после мартовской атаки сделала больше, чем большинство опенсорс-проектов: Trusted Publishers, подписанные образы, неизменяемые теги. Я считаю эту подготовку добросовестной. И всё равно атака прошла, потому что подпись удостоверяет «собрано нашим конвейером», а не «собрано из нашего кода». Конвейер стал оружием против самого себя.
Практический вывод для любого, кто работает с открытыми моделями и инструментами: закрепляйте версии по хешу, не по тегу. Тег можно подменить, хеш нельзя. Мониторьте зависимости автоматически, а каждый внутренний деплой инструмента, особенно с доступом к ключам, закрывайте от интернета даже «на время тестирования». Именно через такой открытый деплой, по версии BerriAI, утекли токены разработчиков.
Проверьте свою работу с нейросетями
Если вы автор на Дзене и используете ИИ-инструменты, убедитесь, что ваши API-ключи хранятся безопасно. В dzen.guru мы разбираем, как работать с нейросетями без лишних рисков.
Узнать большеИнцидент с LiteLLM 1.107.0 напоминает: между «мы внедрили лучшие практики» и «мы в безопасности» лежит пропасть размером в один дефис в названии репозитория. Расследование продолжается, и перед применением рекомендаций стоит свериться с последним обновлением отчёта BerriAI.

Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».
Читайте также

Что такое ИИ-агент на заводе: ТЕХНОНИКОЛЬ назвала 5 барьеров, убивающих пилоты при масштабировании
Почему это важно Впервые крупная российская промышленная компания публично описала, почему ИИ-пилоты гибнут при масштабировании и что конкретно нужно менять в…

Smart Forms Pro: 10 преимуществ инструмента для подготовки отчётности без переделки Excel-шаблонов
Компания Visiology выпустила Smart Forms Pro, веб-систему сбора отчётности с Excel-подобным интерфейсом, которая позволяет перенести годами отлаженные…

Kling AI 4.0 молча рендерит 1080p вместо 720p: счёт растёт в полтора раза
Kling AI нейросеть, которую используют, чтобы оживить фото, с выходом версии 4.0 получила единый API (программный интерфейс, через который приложения общаются…
Комментарии