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.pthSHA-256:
ceNa7wMJnNHy1kRnNCcwJaFjWX3pORLfMh7xGL8TUjgБэкдор:
~/.config/sysmon/sysmon.pyK8s-поды:
node-setup-*в namespacekube-system
