24 марта 2026 года две версии Python-библиотеки litellm (1.82.7 и 1.82.8) на PyPI были опубликованы с вредоносным кодом, выполняющим кражу SSH-ключей, облачных credentials, секретов Kubernetes и API-ключей. Библиотека используется как единый шлюз к LLM-провайдерам (OpenAI, Anthropic, Bedrock и др.) и набирает около 97 млн загрузок в месяц.


Как это обнаружили

Атаку выявили при анализе инцидента: у разработчика litellm оказался транзитивной зависимостью MCP-плагина в Cursor. Хост стал недоступен из-за форк-бомбы — бага в самой малвари: .pth-файл рекурсивно порождал дочерние процессы, что привело к исчерпанию ресурсов системы. По оценке исследователей FutureSearch, без этого бага атака могла бы дольше оставаться незамеченной.

Обе версии опубликованы на PyPI в 10:39–10:52 UTC без соответствующих тегов и релизов в GitHub. Исходный код репозитория остался чистым — вредоносный код был внедрён в артефакт при публикации, что делает его невидимым при стандартном code review.

Как работает малварь

Версия 1.82.8 содержит файл litellm_init.pth (34 628 байт). Python автоматически исполняет .pth-файлы при каждом запуске интерпретатора — срабатывание происходит без какого-либо import litellm. Версия 1.82.7 использует обфусцированный payload в proxy/proxy_server.py, исполняемый при импорте модуля.

Payload работает в три стадии:

1. Сбор данных. Скрипт извлекает SSH-ключи и конфиги, .env-файлы, credentials AWS/GCP/Azure, kubeconfig, пароли БД, историю shell, файлы крипто-кошельков, переменные окружения. Дополнительно выполняются запросы к cloud metadata endpoints (IMDS).

2. Эксфильтрация. Данные шифруются (AES-256-CBC + RSA-4096, hardcoded публичный ключ) и отправляются на models.litellm[.]cloud — домен, не относящийся к официальной инфраструктуре litellm.

3. Закрепление и латеральное движение. При наличии Kubernetes service account token малварь читает все секреты кластера и создаёт привилегированные поды alpine:latest в kube-system с монтированием хост-ФС. Бэкдор устанавливается как ~/.config/sysmon/sysmon.py с регистрацией systemd user service — локально и на каждой ноде кластера.

Что проверить и сделать

# Проверить установленную версию
pip show litellm

# Найти следы в кеше uv
find ~/.cache/uv -name "litellm_init.pth"

# Проверить наличие бэкдора
ls ~/.config/sysmon/sysmon.py
ls ~/.config/systemd/user/sysmon.service

В Kubernetes: проверить поды с именем node-setup-* в namespace kube-system.

Если установлена версия 1.82.7 или 1.82.8 — удалить пакет и очистить кеш:

pip uninstall litellm
rm -rf ~/.cache/uv   # или: pip cache purge

Версия для отката: 1.82.6 (опубликована 22 марта; согласно отчёту Endor Labs, является последней незатронутой версией).

Все credentials на затронутой машине следует считать скомпрометированными и ротировать: SSH-ключи, токены AWS/GCP/Azure, kubeconfig, API-ключи из .env, пароли БД. Отдельно рекомендуется проверить CI/CD-пайплайны и Docker-образы, собиравшиеся с pip install litellm без пина версии за последние двое суток.

Контекст: кампания TeamPCP

Согласно отчётам Wiz и Endor Labs, атака на litellm предположительно является частью продолжающейся кампании группировки TeamPCP. По данным Endor Labs, каждый скомпрометированный инструмент открывал доступ к credentials, использованным в следующей атаке:

  • 19 марта — компрометация Trivy (Aqua Security), 75 из 76 тегов trivy-action перезаписаны

  • 21–23 марта — компрометация KICS/Checkmarx GitHub Action, OpenVSX-расширений; распространение CanisterWorm в npm (64+ пакета)

  • 24 марта — litellm на PyPI

Во всех задокументированных инцидентах фигурирует одна схема шифрования (AES-256 + RSA-4096) и один RSA-публичный ключ. По данным профиля группировки, опубликованного компанией Flare, TeamPCP действует как минимум с декабря 2025 года.

GitHub Issue #24512 в репозитории litellm был закрыт мейнтейнером как «not planned»; ветка обсуждения заполнена сотнями однотипных комментариев. По оценке исследователей FutureSearch, подобное поведение может свидетельствовать о компрометации аккаунта мейнтейнера.

Индикаторы компрометации (IoC)

  • Домен C2: models.litellm[.]cloud

  • Вредоносный файл: litellm_init.pth

  • SHA-256: ceNa7wMJnNHy1kRnNCcwJaFjWX3pORLfMh7xGL8TUjg

  • Бэкдор: ~/.config/sysmon/sysmon.py

  • K8s-поды: node-setup-* в namespace kube-system


Источники