Новый вариант червя Shai-Hulud атакует npm и инструменты разработчиков: кража токенов и самовоспроизведение

APT

Экосистема пакетов npm переживает очередную серьёзную атаку на цепочку поставок. Исследователи из Unit 42 (подразделение Palo Alto Networks) обнаружили вредоносный пакет @bitwarden/cli версии 2026.4.0, который маскируется под официальный менеджер паролей Bitwarden. При установке он не только похищает учётные данные из облачных провайдеров, систем CI/CD и рабочих станций разработчиков, но и автоматически заражает другие пакеты, которыми может управлять жертва. Этот инцидент продолжает серию атак, начатую червём Shai-Hulud в сентябре 2025 года, и показывает, что угроза supply-chain атак перешла в новую фазу - с самораспространяющимися вредоносными нагрузками и многоступенчатой инфраструктурой.

Описание

Атака не ограничилась одним пакетом. В рамках одной кампании злоумышленники (группировка TeamPCP, известная как @pcpcats) одновременно скомпрометировали несколько каналов распространения компании Checkmarx - поставщика инструментов для тестирования безопасности. Под удар попали образы Docker Hub (checkmarx/kics), расширения VS Code (checkmarx/ast-results, checkmarx/cx-dev-assist), а также компонент GitHub Actions (checkmarx/ast-github-action). Все эти артефакты используют один и тот же командный центр (C2) audit.checkmarx[.]cx, одинаковые методы обфускации и общую логику кражи данных и распространения. Вредоносное расширение VS Code, например, загружало свою полезную нагрузку (mcpAddon.js) из сиротского коммита в собственном репозитории Checkmarx на GitHub, что делало URL загрузки внешне легитимным.

Как именно работает этот червь?

Вредоносный npm-пакет @bitwarden/cli инициируется через скрипт предустановки (preinstall) в файле package.json, который запускается автоматически. Даже если отключить скрипты (через --ignore-scripts), он срабатывает при вызове команды bw, так как подменяет одноимённый бинарник. На первом этапе загружается среда выполнения Bun (версия 1.3.13) с официального репозитория на GitHub - это необходимо, поскольку основная нагрузка использует специфические API, недоступные в Node.js. Затем выполняется сам полезный код - файл размером около 10 мегабайт, содержащий около 285 тысяч строк, в котором смешаны легитимные SDK (AWS, Google Cloud, Azure, Octokit) и вредоносная логика.

Злоумышленники применили многослойную обфускацию. Например, чувствительные строки (домены, пути к файлам, команды) закодированы как массивы индексов в перетасованном наборе ASCII-символов (алгоритм Фишера - Йетса с детерминированным сидем). Встроены сжатые и закодированные в Base64 фрагменты, включая открытый ключ RSA, YAML-файл для GitHub Actions, загрузчик червя и даже "манифест" с угрозами. Все имена переменных заменены на шестнадцатеричные последовательности.

После запуска червь занимается кражей учётных данных. Специализированные модули сканируют системы разработчика: файлы .ssh, .npmrc, конфигурации Git, .env, а также хранилища секретов в AWS Systems Manager Parameter Store, Azure Key Vault и Google Cloud Secret Manager. Отдельные провайдеры работают с окружением CI/CD (определяют GitHub Actions и извлекают секреты из контекста раннера). Все собранные данные шифруются: сначала сжимаются gzip, затем шифруются AES-256-GCM со случайным ключом, который, в свою очередь, шифруется встроенным открытым ключом RSA 4096 бит. Зашифрованный конверт отправляется через HTTPS на C2-сервер.

Но это не единственный канал утечки. Если командный центр недоступен, червь использует публичные репозитории GitHub как резервный канал. Он создаёт новый репозиторий с именем в стиле "Дюны" (например, gesserit-melange-813) и описанием "Checkmarx Configuration Storage", затем коммитит в него зашифрованные файлы результатов, а сами украденные токены прячет в сообщении к коммиту. Более того, реализован механизм инъекции вредоносных workflow-файлов GitHub Actions: если червь получает GitHub-токен с правами на репозиторий и workflow, он создаёт новый бранч, добавляет workflow format-check.yml, который дампит все секреты, а затем скачивает артефакт, после чего удаляет бранч и запись о запуске - заметает следы.

Главная опасность - способность к самораспространению.

Обнаружив npm-токен с правами публикации и отключённой двухфакторной аутентификацией, червь скачивает последнюю версию любого пакета, который может изменить жертва, внедряет в него setup.mjs (полную копию себя), перезаписывает package.json, добавляя скрипт предустановки, и публикует новую версию с увеличенным номером патча. Каждый новый установщик этого пакета вновь активирует цепочку заражения - так атака распространяется экспоненциально.

Для противодействия обнаружению червь проверяет локаль системы: если она русская, сразу завершает работу (killswitch). Он демонизируется, чтобы скрыть свой процесс, использует блокировку на основе PID, чтобы избежать дублирования, и перехватывает сигналы прерывания. Все временные файлы удаляются.

В официальном отчёте Unit 42 подчёркивается, что инцидент с Shai-Hulud в сентябре 2025 года не был единичным всплеском, а стал новым стандартом для атак на цепочки поставок. Теперь злоумышленники нацелены не просто на кражу данных, а на внедрение в инфраструктуру CI/CD с долгосрочным необнаруживаемым доступом. Аналитики отмечают, что кампания TeamPCP затронула не только Checkmarx, но и ранее атаковала инструменты Trivy и LiteLLM, что указывает на систематическую охоту за средствами разработки и безопасности.

Последствия такой атаки могут быть катастрофическими. Скомпрометированные учётные записи разработчиков, токены облачных провайдеров, ключи шифрования - всё это позволяет злоумышленникам получить доступ к внутренним системам компаний, которые используют скомпрометированные пакеты. А поскольку червь самостоятельно публикует новые заражённые версии, цепочка заражения может затронуть тысячи проектов за считанные часы.

Что делать специалистам по безопасности? Прежде всего, необходимо заблокировать на сетевом периметре указанные C2-домены и IP-адреса (audit.checkmarx[.]cx, 94.154.172[.]43). Следует немедленно сменить все токены, которые могли быть украдены: npm-токены, GitHub PAT, ключи AWS, Azure, Google Cloud, SSH-ключи и секреты CI/CD. Важно проверить все npm-пакеты, которые вы поддерживаете, на предмет несанкционированного увеличения версии или появления новых скриптов предустановки. В GitHub стоит проанализировать неожиданные репозитории, незнакомые workflow-файлы и артефакты (например, format-results). Также нужно искать процессы Bun в аудите выполнения и исходящие соединения к подозрительным адресам.

Ключевой урок этой атаки - статические защита больше не работает.

Необходимо внедрять меры проактивной защиты: использовать частные реестры с временным лагом (не загружать пакеты, опубликованные менее 24-72 часов назад), отключать скрипты жизненного цикла в .npmrc (ignore-scripts=true), фиксировать версии через package-lock.json и применять npm ci вместо npm install в CI/CD. Проверка происхождения пакетов (верификация верификации через SLSA) и строгая фильтрация исходящего трафика из среды сборки помогут снизить риск. Генерация SBOM (software bill of materials) для каждого релиза позволит быстро оценить ущерб при обнаружении новой уязвимости.

Атака показала, что цепочка поставок стала главной мишенью для злоумышленников. Единственный способ противостоять - постоянная верификация и прозрачность всех компонентов, которые попадают в разрабатываемое программное обеспечение.

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

IPv4

  • 91.195.240.123
  • 94.154.172.43

Domains

  • audit.checkmarx.cx
  • checkmarx.cx

SHA256

  • 167ce57ef59a32a6a0ef4137785828077879092d7f83ddbc1755d6e69116e0ad
  • 18f784b3bc9a0bcdcb1a8d7f51bc5f54323fc40cbd874119354ab609bef6e4cb
  • f35475829991b303c5efc2ee0f343dd38f8614e8b5e69db683923135f85cf60d
Комментарии: 0