Shai-Hulud 2.0: как червь превратил npm в оружие массового поражения

За 18 дней после релиза @bitwarden/cli версии 2026.4.0 червь Shai-Hulud 2.0 скомпрометировал npm-токены в 47 странах — и это только те случаи, которые Checkmarx успела задокументировать. TeamPCP доказала, что npm-экосистема стала платформой для самовоспроизводящегося малвара корпоративного уровня.

Возвращение песчаного червя

TeamPCP (@pcpcats) — группировка, которая в сентябре 2025 года запустила первую версию червя Shai-Hulud и навсегда изменила ландшафт npm-атак. Если раньше тайпосквоттинг был скорее неприятностью, то после Shai-Hulud началась эра высокоуровневых угроз supply chain.

Масштаб апрельской операции 2026 года впечатляет: одновременная компрометация четырёх каналов дистрибуции Checkmarx — Docker Hub (образы checkmarx/kics v2.1.20, v2.1.21), GitHub Actions (checkmarx/ast-github-action v2.3.35), VS Code расширения (checkmarx/ast-results v2.63, v2.66) и npm-пакет @bitwarden/cli. Все артефакты используют единую C2-инфраструктуру audit.checkmarx[.]cx (94.154.172[.]43) и идентичную логику кражи credentials.

Финансирование группировки остаётся загадкой, но координированность атаки на вендора security tooling указывает на серьёзные ресурсы. Socket зафиксировала, что TeamPCP атаковала Checkmarx ещё в марте 2026, параллельно компрометируя Trivy и LiteLLM — это системная кампания против инструментов безопасности.

Три хода до полного контроля

Kill chain Shai-Hulud 2.0 состоит из трёх этапов, каждый из которых демонстрирует эволюцию npm-угроз.

Этап 1: Bootstrap через bw_setup.jsПакет @bitwarden/cli@2026.4.0 маскируется под легитимный Bitwarden CLI и запускается двумя способами: через preinstall lifecycle script (автоматически при npm install) или через bin-поле, которое регистрирует bw_setup.js как команду bw в PATH пользователя. Даже если preinstall заблокирован флагом --ignore-scripts, малвар сработает при следующем вызове команды bw.

Bootstrap скачивает Bun runtime v1.3.13 с github.com/oven-sh/bun (легитимный источник), определяет архитектуру системы и запускает основной payload bw1.js. Использование Bun вместо Node.js критично — payload использует Bun-специфичные API для shell execution и gzip-сжатия.

Этап 2: Многоуровневая обфускацияФайл bw1.js весит 10 МБ и содержит 285,000 строк после форматирования. Обфускация включает:- String table rotation через функцию _0x214e с hex-индексами- Seeded ASCII shuffle cipher с PRNG, засеянным 0x3039 (12345)- Gzip+Base64 embedded payloads для RSA-ключей и GitHub Actions workflow- Mangled identifiers типа _0x3865d8

C2-домен audit.checkmarx[.]cx хранится как массив [0x42, 0x6e, 0x36, 0x4b, 0x2b, 0x5c, 0xd, 0x57, 0x0, 0xd, 0x7, 0x26, 0x42, 0x3, 0x2a, 0x5c, 0xd, 0x2a], который декодируется через детерминированную таблицу подстановки.

Этап 3: Credential harvesting и worm propagationЧервь развёртывает пять provider-классов:- File System Provider: читает ~/.npmrc, ~/.ssh/id_*, .git/config, .env файлы- Shell Provider: выполняет `gh auth token` для кражи GitHub CLI токена- GitHub Actions Provider: парсит {"value":"...","isSecret":true} из runner context- AWS SSM Provider: через SSMClient читает Parameter Store- Azure Key Vault и Google Cloud Secret Manager: полный доступ к секретам

Все результаты сканируются regex-паттернами для извлечения npm-токенов (npm_[A-Za-z0-9]{36}) и GitHub PAT (gh[pousr]_[A-Za-z0-9]{36,255}).

Двойная эксфильтрация и GitHub-бэкдоры

Shai-Hulud 2.0 использует двухуровневую систему эксфильтрации, которая гарантирует доставку данных даже при блокировке C2.

Primary channel: данные сжимаются gzip, шифруются AES-256-GCM случайным ключом, ключ шифруется RSA-4096 и отправляется POST-запросом на hxxps://audit.checkmarx[.]cx:443/v1/telemetry.

Secondary channel: используя украденные GitHub-токены, червь создаёт публичные репозитории под аккаунтом жертвы с описанием "Checkmarx Configuration Storage" и Dune-тематическими именами (gesserit-melange-813). Зашифрованные файлы коммитятся в директорию results/, а токены встраиваются в commit messages в формате LongLiveTheResistanceAgainstMachines:.

Самая опасная функция — GitHub Actions workflow injection. При наличии токена с repo и workflow scopes червь:1. Перечисляет репозитории с push-доступом, приоритизируя активные2. Проверяет наличие GitHub Actions secrets3. Создаёт новую ветку и коммитит .github/workflows/format-check.yml

Этот workflow запускается на каждом push и pull request, обеспечивая persistence в CI/CD pipeline. Время от компрометации до обнаружения составляет в среднем 12-15 дней — достаточно для массового распространения.

Как их узнать в своей сети

Network indicators:- C2: audit.checkmarx[.]cx:443 (94.154.172[.]43)- HTTP POST /v1/telemetry с gzip-сжатыми данными- Загрузки с github.com/oven-sh/bun/releases/download/bun-v1.3.13/

File system artifacts:- Временные файлы bun-* в /tmp или %TEMP%- Файлы с именами _0x[hex] в node_modules/.bin/- Новые .github/workflows/format-check.yml в репозиториях

Process indicators:- Процессы bun с аргументами bw1.js- Выполнение `gh auth token` из npm-контекста- Массовые обращения к AWS SSM, Azure Key Vault, Google Secret Manager

GitHub activity patterns:- Создание репозиториев с описанием "Checkmarx Configuration Storage"- Commit messages с паттерном LongLiveTheResistanceAgainstMachines:- Новые workflow файлы с trigger на push/pull_request

Registry indicators:Пакеты с preinstall scripts, скачивающие бинарные файлы, особенно если:- Размер package.json превышает обычный для типа пакета- Присутствуют обфусцированные строки или hex-массивы- bin-поля конфликтуют с популярными CLI-утилитами

Что делать российским командам прямо сейчас

Этот кейс критичен для российских SOC по трём причинам. Во-первых, многие российские компании используют Checkmarx для SAST-анализа — компрометированные образы могли попасть в production. Во-вторых, техники TeamPCP уже копируют другие группировки, включая те, что специализируются на российских targets. В-третьих, блокировки GitHub и npm в России создают теневые mirror-репозитории, где такие пакеты могут циркулировать месяцами без обнаружения.

Немедленные действия:1. Проверить все Checkmarx-образы: docker images | grep checkmarx и сверить с официальными хэшами2. Аудит GitHub Actions workflows: найти все .github/workflows/ файлы, созданные после марта 20263. Ротация всех npm-токенов и GitHub PAT, особенно с repo/workflow scopes

Детекты для SOC:- Event ID 4688 (Windows): процессы bun.exe с CommandLine содержащим bw1.js- Sysmon Event ID 1: Image содержит bun и CommandLine содержит node_modules- Event ID 5156 (Windows Firewall): исходящие соединения на 94.154.172.43:443- Auditd (Linux): execve syscalls с аргументами gh auth token из npm-процессов

Sigma-правило для GitHub API abuse:

title: Suspicious GitHub Repository Creation Patternlogsource: category: webserverdetection: selection: cs-uri-stem: '/user/repos' cs-method: 'POST' cs-user-agent|contains: 'octokit' keywords: - 'Checkmarx Configuration Storage' - 'gesserit-' - 'melange-'

Network signatures:

- Suricata: alert http any any -> any 443 (msg:"Shai-Hulud C2"; content:"POST"; http_method; content:"/v1/telemetry"; http_uri; sid:1001;)

- Snort: alert tcp any any -> 94.154.172.43 443 (msg:"Shai-Hulud C2 IP"; sid:1002;)

Добавить в мониторинг сегодня:

- Все исходящие HTTPS-соединения от npm/node процессов на нестандартные домены

- Создание файлов в node_modules/.bin/ с исполняемыми правами

- Массовые обращения к cloud secret managers из CI/CD окружений- GitHub API calls для создания репозиториев с automation tokens

Shai-Hulud 2.0 показывает, что npm превратился в платформу для enterprise-уровневых APT-атак. Группировки больше не ограничиваются кражей данных — они строят persistent backdoors в CI/CD pipelines, которые могут работать месяцами. Следующие 6-12 месяцев покажут, сколько других APT-групп освоят wormable propagation через package managers. Я ожидаю появления аналогичных червей для PyPI, RubyGems и Go modules — техники TeamPCP слишком эффективны, чтобы остаться уникальными. Самое тревожное: если группировка может одновременно компрометировать четыре канала дистрибуции одного вендора, то координированная атака на npm registry целиком — вопрос времени. В @kibergvardiola мы продолжаем отслеживать эволюцию supply chain угроз и их адаптацию под российские реалии. Подписывайтесь, чтобы не пропустить киберважное.

Начать дискуссию