LiteLLM 1.107.0 на PyPI оказался заражён вирусом
LiteLLM 1.107.0 на PyPI содержал стилер учётных данных и бэкдор. Пакет был доступен около 2 часов и мог заразить миллионы систем.
Кратко о главном
21 октября 2026 года злоумышленники опубликовали вредоносный релиз популярной Python-библиотеки LiteLLM — пакета для работы с LLM-провайдерами. Версия 1.107.0 была доступна на PyPI примерно два часа, после чего была удалена. За это время она устанавливала стилер учётных данных, запускавшийся при каждом старте Python, а также бэкдор (backdoor) с возможностью удалённого выполнения кода.
litellm==1.107.0 или использовали Docker-образы с тегами v1.107.0, latest, main-latest или main-stable в период с 11:39 до ~14:20 UTC 21 октября 2026 года — считайте, что ваши учётные данные скомпрометированы.Как атака попала в релиз
Релиз LiteLLM 1.107.0 на PyPI нёс в себе стилер учётных данных и бэкдор для удалённого выполнения кода. Все семь wheel-пакетов (Linux, macOS, Windows) устанавливали их в виде трёх файлов в директорию site-packages. Оба вредоносных компонента запускались при старте любого Python-процесса на хосте — даже если тот ни разу не импортировал litellm. Исходный код на GitHub не содержал этих файлов.
По оценке компании SafeDep с умеренно высокой степенью уверенности, вредоносные wheel-файлы были собраны собственным release pipeline компании BerriAI из изменённого злоумышленником git-источника.
В файл pyproject.toml внутри дистрибутива была добавлена единственная строка в секции maturin:
[tool.maturin]
python-source = "."
data = "cook" # <-- внедрено злоумышленником
python-packages = ["litellm_cli"]
Настройка data = "cook" заставляла утилиту maturin скопировать папку cook/ в wheel-пакет, а pip затем устанавливал её содержимое в site-packages.
graph TD
A[Атакующий меняет pyproject.toml] --> B[Добавляет папку cook/ в сборку]
B --> C[maturin собирает wheel с вредоносными файлами]
C --> D[Пакет публикуется на PyPI]
D --> E[pip install litellm==1.107.0]
E --> F[cook.pth + cook.py + sitecustomize.py в site-packages]
F --> G[Стилер запускается при каждом старте Python]
F --> H[Бэкдор каждый час получает команды с сервера]
Три вредоносных файла
Все семь wheel-пакетов помещали три файла в директорию site-packages:
| Файл | Размер | Функция |
|---|---|---|
cook.pth | 12 байт | Содержит import cook — автозапуск стилера при старте Python |
cook.py | ~22 КБ | Стилер учётных данных (обфусцирован через zlib+base64) |
sitecustomize.py | ~25 КБ | Бэкдор: каждый час загружает и выполняет код с удалённого сервера |
Payload 1: стилер cook.py
Стилер похищал SSH-ключи, облачные учётные данные, CI/CD-секреты, токены AI-инструментов, пароли браузера и ключи LLM-провайдеров из базы LiteLLM-прокси, после чего отправлял их на www.litellm[.]dev.
Данные шифровались по схеме AES-256-CBC с RSA-OAEP-обёрткой над сессионным ключом и отправлялись POST-запросом. Один раз украв данные, вредонос записывал флаг в /tmp/, чтобы не повторять кражу снова на том же хосте.
- SSH-ключи (
~/.ssh/*) - Облачные credentials: AWS, Azure, GCP, Kubernetes, Docker
- Секреты CI/CD: GitLab, Jenkins, Vault, Terraform
- Пароли браузера (Chrome/Chromium через DPAPI, Firefox)
- Токены AI-инструментов: Claude Code, Cursor, Copilot, Gemini CLI, Codex, Windsurf и другие
- Переменные окружения всех запущенных процессов (через
/proc/<pid>/environ) - Ключи LLM-провайдеров из базы данных LiteLLM-прокси
Payload 2: бэкдор sitecustomize.py
Бэкдор-демон ежечасно обращался к размещённому на GitHub файлу с адресом сервера и выполнял произвольный код, загруженный с этого сервера. Это обеспечивало злоумышленнику постоянный и обновляемый канал удалённого управления (RAT — Remote Access Trojan).
Сколько времени пакет был в открытом доступе
Вредоносный пакет litellm==1.107.0 оставался доступным на PyPI примерно два часа — с 11:39 до ~13:23 UTC. Примечательно, что система сканирования Chainguard обнаружила угрозу уже через 16 минут после публикации.
Это уже второй случай компрометации LiteLLM за семь месяцев — прецедент, указывающий на системные проблемы с безопасностью release pipeline.
Официальная реакция BerriAI
Команда LiteLLM подтвердила, что ранним утром 21 октября release pipeline был скомпрометирован и версия 1.107.0 с вредоносным кодом была загружена в Docker-реестр и PyPI. Все предыдущие версии объявлены безопасными, затронутые релизы удалены.
«Customers running the private enterprise release of LiteLLM were not impacted» — LiteLLM Team
Версии 1.106.2, 1.107.0rc1 и 1.107.0rc2, а также сопутствующие пакеты litellm-proxy-extras==0.4.110 и litellm-enterprise==0.1.78 признаны чистыми.
Что делать прямо сейчас
- Изолируйте хост — отключите его от сети.
- Удалите файлы
cook.pth,cook.pyиsitecustomize.pyизsite-packagesдо следующего запуска Python. - Смените все учётные данные, к которым у хоста был доступ: API-ключи, облачные credentials, SSH-ключи, токены CI/CD и AI-инструментов.
- Обновите LiteLLM до версии 1.107.1 или выше (либо откатитесь на 1.106.2).
- Проверьте логи на предмет запросов к домену
www.litellm[.]dev.
Значение для индустрии
LiteLLM — это прокси и SDK, стоящий перед API LLM-провайдеров, поэтому процессы, использующие его, как правило, хранят API-ключи провайдеров, облачные идентификаторы и строки подключения к базам данных. Это делает LiteLLM особенно привлекательной целью для атак на цепочку поставок (supply chain attack).
Инцидент наглядно демонстрирует риски, связанные с отсутствием аттестации провенанса (provenance attestation) у PyPI-пакетов. Примерно через 10 минут после загрузки на PyPI бот litellm-dispatcher[bot] опубликовал GitHub-релиз v1.107.0 — автоматика сработала штатно, и ничто внешне не указывало на компрометацию.
Для AI-разработчиков этот случай — напоминание о том, что инструменты оркестрации LLM-запросов требуют такого же уровня безопасности, как и любая другая критическая инфраструктура.