Кратко о главном

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.pth12 байтСодержит 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 признаны чистыми.

Что делать прямо сейчас

💡 Порядок действий при заражении
  1. Изолируйте хост — отключите его от сети.
  2. Удалите файлы cook.pth, cook.py и sitecustomize.py из site-packages до следующего запуска Python.
  3. Смените все учётные данные, к которым у хоста был доступ: API-ключи, облачные credentials, SSH-ключи, токены CI/CD и AI-инструментов.
  4. Обновите LiteLLM до версии 1.107.1 или выше (либо откатитесь на 1.106.2).
  5. Проверьте логи на предмет запросов к домену 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-запросов требуют такого же уровня безопасности, как и любая другая критическая инфраструктура.