Атака на фреймворк Xinference: три версии пакета на PyPI содержали вредоносный код для кражи учётных данных

information security

Двадцать второго апреля две тысячи двадцать шестого года в репозитории PyPI были обнаружены три последовательные версии популярного фреймворка для инференса больших языковых моделей Xinference (Xorbits Inference), которые несли в себе вредоносную нагрузку для сбора учётных данных. Версии 2.6.0, 2.6.1 и 2.6.2 содержали вшитый прямо в инициализационный модуль "xinference/__init__.py" код, который активировался в момент любого импорта пакета в приложении, при запуске из командной строки или при инициализации сервиса. Это означает, что все пользователи, установившие одну из этих версий, автоматически подвергали свои системы риску утечки конфиденциальной информации.

Описание

Xinference - это фреймворк с открытым исходным кодом, который широко применяется в AI-разработке, MLOps-конвейерах и корпоративных развёртываниях LLM. Он поддерживает работу с моделями LLaMA, Mistral, Qwen и мультимодальными архитектурами, предоставляя как Python API, так и REST-интерфейс. Инфраструктуры, на которых развёрнут Xinference, обычно обладают повышенными привилегиями в облаке: ролями IAM для GPU-инстансов, токенами модельных реестров, ключами доступа к объектному хранилищу и токенами сервисных аккаунтов Kubernetes. Именно эта концентрация ценных учётных данных сделала Xinference привлекательной целью для злоумышленников.

Все три скомпрометированные версии были оперативно удалены из репозитория PyPI, однако вредоносный код успел попасть к неопределённому числу пользователей. Исследователи, проводившие статический анализ, обнаружили в первом этапе полезной нагрузки характерный маркер "# hacked by teampcp". Та же самая метка использовалась в предыдущих атаках на цепочки поставок пакетов litellm (24 марта 2026 года) и telnyx (27 марта 2026 года). Это позволяет с высокой вероятностью связать текущий инцидент с группой TeamPCP, которая, по-видимому, продолжает кампанию по компрометации популярных Python-библиотек.

Техника внедрения вредоносного кода в Xinference демонстрирует явную эволюцию подходов авторов на протяжении всего одного дня публикаций. В версии 2.6.0 инъекция располагалась на уровне модуля - сразу после блока импорта "intel_extension_for_pytorch", перед легитимной функцией "_install()". Код запускался через "subprocess.Popen", который срабатывал немедленно при импорте и подавлял все сообщения об ошибках. В версии 2.6.1 вредоносный код переместили внутрь самой функции "_install()", что сделало его менее заметным при просмотре диффов. Однако в этой версии злоумышленник заменил асинхронный запуск на синхронный вызов "exec()", что могло замедлить инициализацию приложения. Наконец, версия 2.6.2 оказалась самой изощрённой: код оставался внутри "_install()", но "subprocess.Popen" с подавлением вывода был восстановлен, а также добавлен импорт модуля "tempfile", необходимый для первого этапа полезной нагрузки. Такая быстрая итерация - от очевидной инъекции в область модуля до скрытой и асинхронной конструкции - является характерным почерком TeamPCP, ранее наблюдавшимся в их атаках на litellm и telnyx.

Первая стадия вредоносной нагрузки, закодированная в переменной "test" во всех трёх версиях, расшифровывается в скрипт, начинающийся с маркера "# hacked by teampcp". Этот скрипт определяет функцию "start()", которая создаёт временную директорию, раскодирует второй этап - сборщик учётных данных - и передаёт его на выполнение новому интерпретатору Python через стандартный ввод. Вывод второго этапа сохраняется во временный файл, после чего архивируется в "love.tar.gz" и отправляется на сервер злоумышленника "whereisitat.lucyatemysuperbox.space" с помощью "curl POST", используя кастомный заголовок "X-QT-SR: 14" в качестве идентификатора кампании. Вся временная директория автоматически удаляется после отправки, не оставляя следов на диске.

Второй этап, сам сборщик учётных данных, представляет собой полноценный скрипт на Python, который выполняет как системную разведку, так и извлечение множества типов чувствительной информации. Он собирает имя хоста, текущий каталог, переменные окружения, SSH-ключи из домашних каталогов и "/root", включая файлы "authorized_keys", "known_hosts" и конфигурацию. Для облачных провайдеров сборщик обращается к локальным файлам учётных данных AWS, GCP и Azure, а также выполняет живой запрос к IMDS (сервер метаданных инстансов EC2) для получения токенов ролей. Дополнительно скрипт делает прямые вызовы к AWS Secrets Manager и AWS SSM Parameter Store через доступные ключи. В сфере Kubernetes он извлекает токен сервисного аккаунта, файлы конфигурации и пытается выполнить "kubectl get secrets --all-namespaces". Сборщик также ориентирован на поиск файлов окружения в глубоких вложенных структурах (до шести уровней) в корневых директориях "/home/*", "/root", "/opt", "/srv", "/var/www", "/app", "/data" и других, находя файлы ".env", ".env.local" и подобные. Он собирает разработческие учётные данные из ".npmrc", ".pypirc", ".cargo/credentials.toml", а также историю команд оболочки, TLS-ключи, сертификаты Let's Encrypt, конфигурации CI/CD, файлы Terraform и криптовалютные кошельки Bitcoin, Ethereum, Cardano и Solana. Наконец, скрипт считывает "/etc/passwd" и "/etc/shadow", а также ищет вебхуки Slack и Discord.

Примечательно, что в этой кампании злоумышленники не использовали шифрование для украденных данных, в отличие от предыдущих атак TeamPCP на litellm и telnyx, где применялась комбинация AES-256-CBC и RSA-4096 OAEP. Отсутствие открытого ключа RSA, который был отличительным артефактом более ранних инцидентов, даёт основания предполагать, что текущая атака могла быть выполнена подражателями, хотя маркер "# hacked by teampcp", идентичная техника внедрения и быстрая смена версий указывают на ту же группу.

Последствия этой атаки могут быть серьёзными, особенно для организаций, использующих Xinference в облачных средах с повышенными привилегиями. Злоумышленник, получивший доступ к учётным данным IAM, токенам Kubernetes, ключам объектного хранилища и SSH-ключам, может не только похитить модели и данные, но и получить контроль над всей вычислительной инфраструктурой. Пользователям, установившим любую из скомпрометированных версий, следует немедленно проверить свои системы на наличие неавторизованного доступа, сменить все облачные учётные данные и провести аудит логов на предмет подозрительной активности. Данный инцидент вновь подчёркивает необходимость тщательного анализа любых обновлений пакетов в репозиториях с открытым исходным кодом, даже если они принадлежат к широко используемым проектам.

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

Domains

  • whereisitat.lucyatemysuperbox.space

URLs

  • https://whereisitat.lucyatemysuperbox.space/

SHA256

  • 4c5c589f543b1a02251451ab3baaeed7c82851de10fa33f87b95a85e3040c92e
  • 96007d4ee4171e383cecdf7a34b606bfcb78eff435182dc86daa49a17153dcd3
  • f677cd06e0dfbd23b6feb47f31d49cb8fcc88ed0487d30143d36d4f54261e3de
Комментарии: 0