Уязвимость в популярной библиотеке litellm: злоумышленники внедрили сложный бэкдор в пакеты PyPI

APT

Атаки на цепочку поставок программного обеспечения продолжают эволюционировать, переходя от точечных инцидентов к скоординированным кампаниям, охватывающим несколько экосистем. Новый тревожный пример - компрометация популярной библиотеки litellm, инструмента для унификации доступа к различным большим языковым моделям через единый API. Эксперты компании Endor Labs обнаружили, что версии 1.82.7 и 1.82.8, опубликованные в реестре PyPI, содержат тщательно замаскированный вредоносный код, отсутствующий в официальном репозитории на GitHub. Библиотека пользуется огромной популярностью с ежемесячным числом загрузок, превышающим 95 миллионов, что делает этот инцидент критически важным для тысяч разработчиков и компаний, использующих LLM в своих продуктах.

Описание

Компрометация носит системный характер. В пакет была внедрена специально созданная уязвимость - бэкдор, который активируется в момент импорта одного из файлов библиотеки. При этом версия 1.82.8 представляет ещё большую опасность: она дополнительно устанавливает специальный ".pth"-файл, который гарантирует выполнение вредоносной нагрузки при любом запуске интерпретатора Python в среде, даже если litellm явно не импортируется. Последней чистой версией считается litellm@1.82.6. По данным исследования, проведённого Endor Labs, вредоносный код был искусственно встроен в файл "proxy_server.py" на этапе сборки пакета для публикации, что усложняет его обнаружение при поверхностной проверке.

Полезная нагрузка атаки реализует сложный трёхэтапный сценарий. После активации она начинает агрессивный сбор критически важных учётных данных: SSH-ключей, токенов облачных провайдеров, секретов Kubernetes, файлов криптовалютных кошельков и конфигурационных файлов ".env". Далее, используя обнаруженные токены доступа к Kubernetes, вредоносная программа пытается переместиться по кластеру, развёртывая привилегированные поды на каждом узле. Финальным этапом становится установка постоянного бэкдора в системе, реализованного как служба systemd, которая периодически опрашивает командный сервер злоумышленников для загрузки и выполнения дополнительных двоичных файлов. Все собранные данные шифруются гибридной схемой RSA+AES и отправляются на контролируемый атакующими домен.

Примечательно, что инфраструктура и методы атаки позволили экспертам с высокой степенью уверенности атрибутировать этот инцидент группе TeamPCP. Этот актор стоит за масштабной кампанией по компрометации цепочки поставок, которая за последний месяц затронула уже пять экосистем: GitHub Actions, Docker Hub, npm, OpenVSX и теперь PyPI. Особенностью тактики TeamPCP стал целенаправленный выбор целей - инструментов, смежных с безопасностью. Ранее под удар попали сканер уязвимостей Trivy от Aqua Security и анализатор инфраструктуры как кода KICS от Checkmarx. Теперь целью стал прокси для LLM. Логика злоумышленников очевидна: подобные инструменты по умолчанию работают в средах с высоким уровнем привилегий и имеют доступ к ценным секретам, что делает их компрометацию чрезвычайно эффективной.

С технической точки зрения, внедрение было выполнено мастерски. Вредоносный код из 12 строк был помещён между легитимными блоками в исходном файле, что затрудняет его визуальное обнаружение при code review. Для выполнения используется не прямой вызов "exec()", а запись декодированного скрипта во временный файл и его запуск через "subprocess", что часто обходит статические анализаторы. В версии 1.82.8 механизм активации через ".pth"-файл гарантирует срабатывание бэкдора даже при запуске простейших скриптов или тестов, что резко увеличивает радиус поражения. Интересно, что злоумышленники допустили оперативную ошибку, оставив в коде закомментированные более ранние версии полезной нагрузки, что позволило аналитикам проследить эволюцию атаки.

Последствия установки скомпрометированных версий litellm могут быть катастрофическими. Программа-сборщик проводит тотальный поиск конфиденциальной информации в файловой системе, включая доступ к облачным метаданным, дампам всех секретов Kubernetes через API и сканирование истории команд оболочки. Способность к латеральному перемещению внутри кластера Kubernetes превращает инцидент из локального в общесистемный, позволяя атакующему получить контроль над всей инфраструктурой. Установленный персистентный механизм обеспечивает долгосрочное присутствие, периодически запрашивая новые инструкции с командного сервера.

Данный инцидент ярко демонстрирует новую опасную тенденцию. Группы злоумышленников перестали ограничиваться случайными атаками на отдельные пакеты. Вместо этого они ведут целенаправленные кампании, где каждая успешная компрометация предоставляет доступ к учётным данным, которые используются для атаки на следующую, часто более ценную цель. Начав с уязвимости в CI/CD-пайплайне сканера Trivy, TeamPCP последовательно расширяла доступ, захватывая аккаунты в npm, Docker Hub и теперь PyPI. Это создаёт эффект домино, когда одна первоначальная брешь приводит к лавинообразной эскалации.

В свете произошедшего, организациям, использующим litellm, необходимо срочно проверить установленные версии и откатиться до 1.82.6. Также критически важно провести аудит сред, где могли выполняться скомпрометированные версии, на предмет признаков активности, включая проверку системных служб и сетевых подключений к подозрительным доменам. В случае обнаружения индикаторов компрометации следует исходить из предположения о полном захвате среды и немедленно ротировать все потенциально доступные злоумышленникам учётные данные - от облачных токенов до SSH-ключей и паролей баз данных. В долгосрочной перспективе единственным надёжным способом защиты остаётся строгий контроль целостности зависимостей, включающий верификацию собранных артефактов по сравнению с исходным кодом в репозитории, а не только проверку хэшей в реестре.

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

Domains

  • checkmarx.zone
  • models.litellm.cloud

SHA256

  • 71e35aef03099cd1f2d6446734273025a163597de93912df321ef118bf135238
  • 8395c3268d5c5dbae1c7c6d4bb3c318c752ba4608cfcd90eb97ffb94a910eac2
  • a0d229be8efcb2f9135e2ad55ba275b76ddcfeb55fa4370e0a522a5bdee0120b
  • d2a0d5f564628773b6af7b9c11f6b86531a875bd2d186d7081ab62748a800ebb
Комментарии: 0