Обычного запуска Python после установки LiteLLM хватало, чтобы заражённая библиотека начала красть секреты, даже если приложение к ней не обращалось. 21 октября атакующие внедрили шпионский код в релиз 1.107.0 популярного ИИ-шлюза. Разработчики подтвердили компрометацию всех семи wheel-сборок для PyPI и контейнерных образов Docker, опубликованных через штатную систему выпуска.
Главной ловушкой стал файл cook.pth, который установщик помещал в каталог site-packages. При запуске Python автоматически обрабатывает такие файлы, поэтому строка import cook активировала спрятанный в cook.py похититель данных. Аналитики Upwind выяснили, что компонент sitecustomize.py тоже запускался автоматически и создавал фоновый процесс для выполнения чужих команд.
Шпион искал пароли и cookie браузеров, SSH-ключи, токены GitHub, AWS, Azure и Google Cloud, конфигурации ИИ-инструментов. В средах с LiteLLM вредонос мог выгрузить из базы ключи подключённых поставщиков моделей. Собранные сведения программа шифровала и отправляла на адрес litellm.dev, не принадлежащий проекту. Фактическое число пострадавших пока не установлено.
Отдельный механизм закрепления раз в час проверял файл на GitHub, чтобы получить адрес управляющего сервера и выполнить загруженные оттуда команды. На момент разбора файл оставался пустым, поэтому работу второй стадии через этот канал не подтвердили. В Windows часть механизма не работала, однако похититель учётных данных сохранял работоспособность.
Код появился не в публичном репозитории LiteLLM. Злоумышленники заменили источник сборки на Berri-AI/litellm, подделку официального BerriAI/litellm с лишним дефисом. Для выпуска использовали токены GitHub CLI трёх разработчиков: одним обошли защиту ветки, другим одобрили публикацию, третьим удалили журналы сборки. В результате штатный релиз выглядел законным.
Команда LiteLLM предполагает, что токены попали к атакующим через журналы внутреннего шлюза, доступного из интернета. Разработчики обнаружили случаи, когда Claude Code включал OAuth-токен GitHub CLI в текст ответа, который затем попадал в логи LiteLLM. На сервере нашли неизвестную учётную запись, но путь первоначального проникновения ещё не подтверждён.
На PyPI заражённая версия находилась с 11:39 до 13:23 UTC, а вредоносные Docker-образы оставались доступны до 14:20 UTC. Команда отозвала сборки, вернула чистые теги и ограничила доступ к GitHub. Клиенты закрытого корпоративного реестра не пострадали. LiteLLM скачивают около 23 млн раз в неделю, но число загрузок вредоносного релиза пока не раскрыто.
Разработчики советуют сначала удалить вредоносные файлы без запуска Python, потому что даже команда pip может повторно активировать шпиона. Затем следует пересоздать окружения, перейти на проверенную версию 1.106.2 и сменить доступные машине ключи. В марте LiteLLM уже атаковали через цепочку поставок, но доказательств связи нынешнего инцидента с прежней кампанией нет.
