В конце 2025 года мир информационной безопасности столкнулся с новой масштабной угрозой, демонстрирующей хрупкость современных цепочек поставок программного обеспечения. Речь идет о вредоносной кампании Shai-Hulud, эволюционировавшей во вторую, более опасную волну под названием Shai-Hulud 2.0. Эта атака, нацеленная на экосистему NPM (менеджер пакетов Node.js), использует изощренные методы для кражи данных, обеспечения устойчивости и саморепликации, превращая доверенные инструменты разработки в оружие.
Описание
Shai-Hulud 2.0
История началась 26 августа 2025 года, когда злоумышленники воспользовались уязвимостью инъекции в GitHub Actions внутри рабочего процесса компании Nx. С помощью манипулированного названия пул-реквеста они выполнили shell-команды и извлекли токен для публикации пакетов в NPM. Получив доступ, атакующие опубликовали вредоносные версии доверенных пакетов Nx. После установки эти пакеты перехватывали локальные инструменты командной строки с искусственным интеллектом для сканирования систем жертв в поисках учетных данных, SSH-ключей и криптокошельков.
Однако на этом компрометация не закончилась. Уже в сентябре 2025 года несколько кибербезопасностных компаний и Агентство кибербезопасности и инфраструктурной безопасности США (CISA) сообщили о более широком заражении цепочки поставок, связанном с той же операцией. Вредоносное программное обеспечение, получившее название «Shai-Hulud», использовало возможности самораспространения, превращая популярные пакеты NPM в контейнеры для вредоносных скриптов. Основная цель Shai-Hulud - кража и эксфильтрация учетных данных с помощью инструмента trufflehog. Параллельно вредоносная программа пыталась скопировать себя в дополнительные пакеты NPM и сделать приватные репозитории GitHub публичными для утечки данных.
К ноябрю 2025 года аналитики GitGuardian зафиксировали мощную вторую волну заражений, названную «Shai-Hulud 2.0». Возможности вредоносного программного обеспечения расширились и теперь включают установку бэкдора и удаленный доступ. Используя скомпрометированный токен аутентификации GitHub жертвы, программа регистрирует хост в качестве самостоятельно размещенного раннера рабочих процессов GitHub Actions. Обычно такие раннеры автоматизируют задачи непрерывной интеграции (CI) и непрерывной поставки (CD). В этой кампании вредоносная программа злоупотребляет ими, а также функцией GitHub Discussions, используя их в качестве канала управления и контроля (Command and Control, C2). Это предоставляет злоумышленникам скрытный способ выполнения команд на скомпрометированных системах.
Тактики, техники и процедуры атаки
Начальный доступ был получен разными путями. По данным Trend Micro, злоумышленники использовали фишинговые письма, замаскированные под оповещения безопасности NPM, чтобы обманом заставить разработчиков раскрыть свои учетные данные. С помощью скомпрометированной учетной записи NPM они загружали вредоносные версии легитимных пакетов. Другой вектор доставки - пакет NPM со злонамеренным скриптом "preinstall", который выполняется автоматически в процессе установки.
Основная нагрузка (payload) начинается со скрипта "Setup_bun.js", который функционирует как загрузчик для "bun_environment.js" - основной логики выполнения вредоносной программы. Сначала скрипт проверяет наличие среды выполнения Bun и устанавливает ее при отсутствии. Затем выполняется "bun_environment.js", который приоритизирует цели, проверяя переменные окружения CI/CD. Вредоносная программа крадет аутентификационные токены и учетные данные для GitHub, NPM, AWS и Google Cloud Platform. Она перечисляет облачные переменные и информацию об учетных записях, извлекая данные на уровне файловой системы и злоупотребляя нативными интерфейсами командной строки (CLI) облачных провайдеров.
Для сбора дополнительных секретов программа использует "trufflehog". Она устанавливает последнюю версию, запрашивая GitHub API, распаковывает архив и выбирает правильный бинарный файл для Windows или Linux. После установки прав на выполнение "trufflehog" готов сканировать систему. В конечном итоге, используя API GitHub Octokit, вредоносная программа создает новый репозиторий со случайным именем, используя учетные данные жертвы, и присваивает ему описание «Shai-Hulud: The Second Coming».
Обеспечение устойчивости и уклонение от защиты
Один из ключевых аспектов Shai-Hulud 2.0 - обеспечение устойчивости (persistence). Программа крадет токен GitHub жертвы и регистрирует зараженную систему как самостоятельно размещенный раннер с именем SHA1HULUD. Устойчивость достигается путем размещения уязвимого к инъекциям рабочего процесса в ".github/workflows/discussion.yaml". Поскольку этот workflow ограничен самостоятельно размещенными раннерами, злоумышленник может выполнять произвольные команды на скомпрометированном хосте, просто инициируя обсуждение (Discussion) в репозитории. Эта тактика обеспечивает скрытный, постоянный доступ, замаскированный под обычный трафик CI/CD.
Попытки повышения привилегий включают проверку возможности запуска "sudo" без пароля, а также эскалацию через Docker путем монтирования корневой файловой системы хоста и модификации файла "sudoers.d" для предоставления пользователю runner прав root.
Для уклонения от систем защиты вредоносная программа останавливает службу "systemd-resolved", заменяет легитимный конфигурационный файл модифицированной версией и перезапускает службу. Это заставляет систему использовать контролируемые злоумышленником DNS-серверы. Кроме того, программа сбрасывает все правила в цепочках "OUTPUT" и "DOCKER-USER" с помощью "iptables", отключая исходящую фильтрацию и политики сети для контейнеров.
Эксфильтрация данных и потенциальный ущерб
Собранные данные эксфильтрируются в двойном кодировании Base64 и в виде JSON-файлов в контролируемый злоумышленником репозиторий GitHub. Среди этих файлов - "Contents.json" с деталями о хосте, "Environment.json" с переменными окружения и "Cloud.json" с облачными секретами. Также наблюдались файлы "Trufflesecrets.json" и "actionSecrets.json".
Потенциальный ущерб значителен. Если программе не удается получить токен GitHub или создать репозиторий, она активирует механизм разрушения данных. На Windows она удаляет все содержимое в "%USERPROFILE%". На Unix-системах (включая macOS) она пытается удалить все в домашнем каталоге. Интересно, что исследователи отметили, что на macOS стандартная команда "find" (вариант BSD) не поддерживает опцию "-writable", а "xargs" не поддерживает опцию "-r", что делает команду не полностью работоспособной. Тем не менее, попытка выполнения фиксируется в логах, а пустые директории удаляются.
Почему это важно?
Самореплицирующийся червь, нацеленный на чрезвычайно популярную экосистему NPM, подвергает огромное число разработчиков и организаций значительному риску. Эта уязвимость создает критический пробел в поверхности атаки цепочки поставок, позволяя противникам скомпрометировать вышестоящие программные зависимости и повлиять на множество нижестоящих проектов. Атака демонстрирует, насколько быстро единичная компрометация может распространиться по всей программной цепочке поставок. Целенаправленно атакуя инструменты разработчиков, злоупотребляя доверенными процессами автоматизации и реплицируясь через пакеты NPM, вредоносная программа превращает повседневные рабочие процессы в эффективные пути доставки для злоумышленников.
Постоянный мониторинг подобных угроз, раннее выявление заражений и укрепление защитных механизмов в средах, которые ежедневно полагаются на эти инструменты, становятся критически важными задачами для обеспечения безопасности в современной цифровой экосистеме.
Индикаторы компрометации
SHA256
- 46faab8ab153fae6e80e7cca38eab363075bb524edd79e42269217a083628f09
- 768496fbdbbd05657d1cf858591480232313488831ad9a377a698aa1a6547f88
- cbb9bc5a8496243e02f3cc080efbe3e4a1430ba0671f2e43a202bf45b05479cd
- de0e25a3e6c1e1e5998b306b7141b3dc4c0088da9d7bb47c1c00c91e6e4f85d6
- f099c5d9ec417d4445a0328ac0ada9cde79fc37410914103ae9c609cbc0ee068