Группировка TeamPCP 24 марта 2026 года внедрила вредоносный код (бэкдор) в Python-библиотеку LiteLLM, опубликовав на PyPI заражённые версии 1.82.7 и 1.82.8. Вредоносный код похищал SSH-ключи, данные облачных учётных записей, секреты Kubernetes и криптовалютные кошельки. LiteLLM, популярный прокси для работы с языковыми моделями, загружается около 97 млн раз в месяц.
По данным Wiz, библиотека используется в 36% облачных сред.
Атака стала прямым продолжением компрометации Trivy 19 марта. TeamPCP использовала учётные записи, украденные из CI/CD-конвейера Trivy, чтобы получить токен публикации LiteLLM на PyPI. Заражённые пакеты загрузили напрямую в репозиторий, минуя GitHub. На GitHub LiteLLM не появилось ни тегов, ни новых версий.
Конвейер сборки LiteLLM подтягивал Trivy из apt без фиксированной версии. Когда TeamPCP скомпрометировала конвейер Trivy в GitHub Actions 19 марта, заражённый скрипт выкрал токен PYPI_PUBLISH из переменных окружения GitHub Actions. С этим токеном TeamPCP опубликовала litellm 1.82.7 в 10:39 UTC и 1.82.8 в 10:52 UTC. PyPI заблокировал пакеты примерно в 11:25 UTC. Окно составило около трёх часов. Весь пакет LiteLLM на PyPI заблокирован.
В LiteLLM 1.82.7 файл litellm/proxy/proxy_server.py содержал двенадцать строк обфусцированного кода. Код раскодировал base64-строку, записал результат во временный файл и запустил его как отдельный процесс. Вредоносная нагрузка срабатывала при любом импорте litellm.proxy.
LiteLLM 1.82.8 использовала другую технику. В каталог site-packages попал файл litellm_init.pth размером 34 628 байт. Python обрабатывает .pth-файлы при запуске интерпретатора. Строки, начинающиеся с import, выполняются как код.
Вредоносная нагрузка запускалась при каждом запуске любого Python-процесса в среде, а не только при импорте LiteLLM. Jupyter-блокноты, Ansible-плейбуки, юнит-тесты — всё запускало кражу данных.
Snyk подтвердила: файл был корректно прописан в RECORD-файле колеса (wheel) с совпадающим хешем. Команда pip install --require-hashes прошла бы без предупреждений. Стандартные проверки целостности бесполезны, когда злоумышленник использует настоящий токен публикации.
Читайте также: Российский хакер получил 6 лет и 9 месяцев за продажу доступа к сетям группировке Yanluowang
Похититель данных работал в три этапа. На первом он собирал SSH-ключи (RSA, Ed25519, ECDSA, DSA) и учётные записи AWS. Для AWS использовались IMDS v2 и Secrets Manager через самодельную реализацию SigV4. Конфигурации GCP и Azure тоже попадали в сбор.
Отдельно похищались токены Kubernetes-сервисов, kubeconfig, Docker-авторизация, состояние Terraform, конфигурации CI/CD (GitLab, Travis, Jenkins, Drone). Криптовалютные кошельки (Bitcoin, Ethereum, Solana с ключами валидаторов, Cardano, Monero), SSL/TLS-сертификаты, история командных оболочек, /etc/shadow и последние 200 записей авторизации тоже попадали в выгрузку.
На втором этапе данные шифровались случайным 32-байтовым ключом AES-256-CBC (через PBKDF2), а затем этот ключ оборачивался открытым ключом RSA-4096 (OAEP). Результат упаковывался в tar.gz и отправлялся на models.litellm[.]cloud (версия 1.82.8) или checkmarx[.]zone (версия 1.82.7). Расшифровать мог только владелец закрытого RSA-ключа.
Третий этап атаки был нацелен на Kubernetes. Если RBAC-разрешения позволяли, вредоносная программа перечисляла все узлы кластера через Kubernetes API и разворачивала привилегированный pod на каждом узле в служебном пространстве имён kube-system. Каждый pod работал на образе alpine:latest с hostPID: true, hostNetwork: true и смонтированной корневой файловой системой хоста.
С помощью chroot вредоносный код закреплялся на узле Kubernetes. Для закрепления в системе использовался systemd-сервис ~/.config/systemd/user/sysmon.service. Бэкдор отправлял запросы на checkmarx[.]zone/raw каждые 50 минут. Если ответ содержал «youtube.com», бэкдор засыпал. Тот же механизм и аварийный выключатель ранее обнаружены в заражённых версиях Trivy и Checkmarx KICS.
Читайте также: VoidStealer научился обходить защиту Chrome: что известно
По сведениям BleepingComputer, зафиксировано около 500 000 случаев передачи похищенных данных (с учётом повторов). Snyk оценивает ежедневные загрузки LiteLLM в 3,4 млн. Библиотека входит как зависимость в ИИ-агенты, MCP-серверы и платформы оркестрации языковых моделей. По объёму загрузок это крупнейшая атака на отдельный Python-пакет в 2026 году.
Цепочка поставок с открытым исходным кодом схлопывается внутрь себя. Trivy скомпрометирован, LiteLLM скомпрометирован, учётные записи из десятков тысяч сред утекли.
— Гал Нагли (Gal Nagli), руководитель отдела угроз, Wiz
LiteLLM стала четвёртой целью в кампании TeamPCP. 19 марта группировка скомпрометировала конвейер Trivy в GitHub Actions и запустила npm-червь CanisterWorm (64+ пакетов). 22 марта группировка подменила названия 44 внутренних репозиториев Aqua Security. 23 марта TeamPCP перезаписала 35 тегов версий Checkmarx KICS. 24 марта пришла очередь LiteLLM.
Кампания почти наверняка не окончена. TeamPCP демонстрирует устойчивый подход: каждая скомпрометированная среда даёт учётные записи, которые открывают следующую цель. Переход от CI/CD к рабочим средам, намеренная эскалация.
— исследовательская группа Endor Labs
В GitHub-обращении #24512 пользователи сообщили о заражении. TeamPCP организовала спам-атаку, опубликовав 88 комментариев с 73 аккаунтов за 102 секунды. По данным Snyk, 76% аккаунтов совпали с ботнетом из раскрытия Trivy. Используя взломанный аккаунт сопровождающего krrishdholakia, группировка закрыла обращение как «not planned» и отправила коммит «teampcp owns BerriAI».
TeamPCP заявила в Telegram о сотрудничестве с LAPSUS$ (группировка, атаковавшая Uber, Rockstar Games, Microsoft и Okta в 2022 году). «Эти компании создавались для защиты ваших цепочек поставок, но не могут защитить свои собственные», написала TeamPCP. Связь с LAPSUS$ не подтверждена независимыми исследователями.
LiteLLM (BerriAI) подтвердила компрометацию и приостановила публикацию новых версий «до завершения полной проверки цепочки поставок». К расследованию привлечена команда Mandiant (Google). Официальный Docker-образ LiteLLM Proxy не пострадал, потому что зависимости в нём зафиксированы в requirements.txt.
Вредоносная нагрузка представляет собой трёхэтапную атаку: сборщик учётных записей (SSH-ключи, облачные сведения, секреты Kubernetes, криптокошельки, .env-файлы), инструмент горизонтального перемещения по инфраструктуре Kubernetes с развёртыванием привилегированных pod на каждом узле, и постоянный бэкдор через systemd, опрашивающий checkmarx[.]zone/raw.
— Киран Радж (Kiran Raj), исследователь, Endor Labs
PyPA (Python Packaging Authority) выпустила предупреждение: «Любой, кто установил и запустил этот пакет, должен считать все учётные записи в среде LiteLLM скомпрометированными».
Если LiteLLM 1.82.7 или 1.82.8 была установлена между 10:39 и ~14:00 UTC 24 марта 2026 года, все учётные записи в среде следует считать скомпрометированными. Перевыпустите ключи API для языковых моделей, облачные учётные записи, SSH-ключи, конфигурации Kubernetes, пароли баз данных и токены CI/CD. Механизм доставки через .pth-файл в версии 1.82.8 означает, что вредоносный код запускался при каждом запуске Python, а не только при импорте LiteLLM.
Сканер безопасности, который запускали с повышенными привилегиями в CI/CD, оказался скомпрометирован. Его компрометация дала токен публикации самого популярного прокси для языковых моделей в Python. Этот прокси работает в рабочих кластерах Kubernetes с доступом ко всем ключам API. Каждое звено цепочки по отдельности считалось доверенным.
LiteLLM заблокирована на PyPI. TeamPCP в Telegram обещает атаковать «многие из ваших любимых инструментов безопасности и проектов с открытым исходным кодом».
Есть новость? Станьте автором.
Мы сотрудничаем с независимыми исследователями и специалистами по кибербезопасности. Отправьте нам новость или предложите статью на рассмотрение редакции.