Новая волна атак через PyPI: вредоносные пакеты Hades крадут учетные данные разработчиков через загрузку среды Bun

security

Специалисты компании Socket обнаружили масштабную атаку на реестр пакетов Python PyPI. Они выявили 37 вредоносных сборок (wheel-артефактов) в составе 19 пакетов. Как сообщается в аналитическом материале, злоумышленники использовали механизм запуска кода при старте интерпретатора Python. Этот подход позволяет выполнить вредоносную нагрузку без явного импорта скомпрометированного пакета.

Описание

Кампания получила кодовое имя Hades. Она продолжает линию атак, известных как Mini Shai-Hulud и Miasma. Отличие новой волны в том, что она нацелена именно на экосистему Python. Вредоносные пакеты содержат файл с расширением .pth. Этот файл обрабатывается модулем site во время инициализации Python. Внутри находится одна исполняемая строка на Python, которая срабатывает автоматически. Таким образом, после установки пакета в системе создаётся зацепка: при любом следующем вызове Python (будь то запуск скрипта, работа в Jupyter, выполнение тестов или команда pip) злоумышленный код может активироваться.

Специалисты Socket обнаружили кластер вредоносных артефактов в течение нескольких минут после публикации. Их система на основе искусственного интеллекта мгновенно распознала подозрительные шаблоны. Анализ показал, что атака межплатформенная: пакеты Python служат лишь средством доставки, а основная нагрузка работает под управлением среды выполнения Bun. Злоумышленники не полагаются на наличие Node.js или других предустановленных сред. Bun скачивается прямо из официального репозитория GitHub версии 1.3.13 и используется как исполнительный движок для скрытого JavaScript-кода. Почерк соответствует семейству Shai-Hulud, которое ранее компрометировало пакеты npm и Packagist.

Среди поражённых проектов оказались реальные и широко используемые биоинформатические инструменты. Наибольший ущерб пришёлся на пакет dynamo-release (инструмент для анализа одноядерной РНК), spateo-release (пространственная транскриптомика), coolbox (визуализация геномных данных) и ufish с napari-ufish (детекция FISH-пятен с помощью глубокого обучения). Суммарное количество загрузок этих пакетов исчисляется сотнями тысяч. Остальные 15 пакетов оказались малопосещаемыми утилитами, которые пострадали за компанию из-за того, что их авторский аккаунт был скомпрометирован. Вредоносные сборки охватывают последовательные патч-релизы по всему портфолио разработчика.

Внутри каждого вредоносного wheel-файла находится скрытый файл _index.js и файл *-setup.pth. Загрузчик проверяет, существует ли файл-маркер /tmp/.bun_ran. Если его нет, он ищет _index.js рядом с пакетом или на один уровень вложенности ниже. Затем он скачивает Bun из архива на GitHub, распаковывает его во временную директорию и запускает команду bun run _index.js. После успешного запуска создаётся маркер, чтобы избежать повторного выполнения. Исследователи отмечают, что в некоторых конфигурациях CPython автоматическое разрешение пути может не сработать, но сам факт наличия в пакете крадущего учётные данные кода и попытка загрузки Bun делает эти артефакты однозначно вредоносными.

Расшифрованный вредоносный скрипт _index.js представляет собой многослойную обфусцированную программу. Первый слой - это eval-обёртка с массивом символьных кодов и ROT-подстановкой. Второй слой расшифровывает два встроенных блока AES-GCM и записывает основную нагрузку во временный файл. Третий слой - загрузчик Bun. Четвёртый слой - основная рабочая нагрузка, в которой применяются вращаемая таблица строк, собственный декодер на основе PBKDF2 и дополнительные слои AES-256-GCM с gzip. Конечная цель - кража широкого спектра учётных данных разработчиков и инфраструктуры.

Скрипт целенаправленно собирает токены GitHub (включая ghs_*), ключи доступа к npm, PyPI, RubyGems, JFrog, CircleCI, Anthropic. Он также извлекает учётные данные AWS (включая STS и Secrets Manager), GCP, Azure, Kubernetes (токены сервисных аккаунтов и секреты), Vault, SSH-ключи, Docker config, shell-истории, файлы .env, .npmrc, .pypirc, конфигурации Claude/MCP и другие секреты, доступные на машине разработчика или в раннере CI/CD. Вредоносная программа проверяет, не запущена ли она в изолированной среде с индикаторами StepSecurity или русского региона, и старается обходить такие окружения.

Вывод учётных данных организован несколькими способами. Прямой HTTPS-канал настроен на api.anthropic.com, но этот путь оказался нерабочим. Настоящий канал - создание публичных репозиториев на GitHub. Скрипт может создать репозиторий с описанием "Hades - The End for the Damned" и записать зашифрованный файл с результатами в папку results. Также используется загрузка артефактов в GitHub Actions под именем "format-results". Следы кампании включают коммит-маркер "IfYouYankThisTokenItWillNukeTheComputerOfTheOwnerFully" и рабочие процессы с названием "Run Copilot".

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

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

Malicious PyPI

  • bramin@0.0.2
  • bramin@0.0.3
  • bramin@0.0.4
  • cmd2func@0.2.2
  • cmd2func@0.2.3
  • coolbox@0.4.1
  • coolbox@0.4.2
  • dynamo-release@1.5.4
  • executor-engine@0.3.4
  • executor-engine@0.3.5
  • executor-http@0.1.3
  • executor-http@0.1.4
  • funcdesc@0.2.2
  • funcdesc@0.2.3
  • magique@0.6.8
  • magique@0.6.9
  • magique-ai@0.4.4
  • magique-ai@0.4.5
  • mrbios@0.1.1
  • mrbios@0.1.2
  • napari-ufish@0.0.2
  • napari-ufish@0.0.3
  • nucbox@0.1.2
  • nucbox@0.1.3
  • okite@0.0.7
  • okite@0.0.8
  • pantheon-agents@0.6.1
  • pantheon-agents@0.6.2
  • pantheon-toolsets@0.5.5
  • pantheon-toolsets@0.5.6
  • spateo-release@1.1.2
  • synago@0.1.1
  • synago@0.1.2
  • ufish@0.1.2
  • ufish@0.1.3
  • uprobe@0.1.3
  • uprobe@0.1.4

SHA256

  • c539766062555d47716f8432e73adbe3a0c0c954a0b6c4005017a668975e275c
  • dc48b09b2a5954f7ff79ab8a2fd80202bd3b59c08c7cdbc6025aa923cb4c0efe
  • e1342a80d4b5e83d2c7c22e1e0aaa95f2d88e3dbf0d853a4994b180c93a4b17d

Комментарии: 0