Самораспространяющийся червь Shai-Hulud вернулся в экосистему npm и за считанные дни превратился в одну из самых масштабных атак на цепочку поставок программного обеспечения. По оценкам аналитиков Wiz, меньше чем за три дня были скомпрометированы десятки тысяч разработчиков и их инфраструктура CI/CD.
Масштаб кампании Shai-Hulud 2.0 и затронутые проекты
Исследователи обнаружили сотни заражённых версий популярных npm-пакетов, в том числе связанных с такими экосистемами и сервисами, как Zapier, ENS Domains, PostHog, Postman, AsyncAPI и ряд других. Эти пакеты использовались как канал для кражи секретов разработчиков, токенов GitHub и npm, а также учётных данных облачных провайдеров.
По данным Wiz, на 24 ноября 2025 года более 25 000 репозиториев GitHub уже содержали украденные секреты, причём каждые 30 минут появлялось ещё около 1000 новых репозиториев. Издание BleepingComputer сообщало примерно о 27 600 результатов поиска, связанных с этой атакой, а эксперты Wiz зафиксировали около 350 уникальных npm-аккаунтов, задействованных в кампании.
Появление на GitHub большого числа новых репозиториев с компрометированными данными указывает на то, что владельцы этих аккаунтов ранее устанавливали троянизированные npm-пакеты и запускали их в средах разработки или CI/CD, предоставив малвари доступ к рабочим токенам и закрытым репозиториям.
Эволюция Shai-Hulud: от первой версии к 2.0
Червь Shai-Hulud впервые был зафиксирован в середине сентября 2025 года, когда он модифицировал 187 пакетов в npm. Тогда вредонос использовал легитимный инструмент TruffleHog — сканер для поиска секретов в кодовой базе, популярный среди разработчиков и специалистов по ИБ. Инструмент применялся для автоматического обнаружения и последующей кражи секретов в приватных репозиториях.
Первая версия червя создавала публичные клоны любых приватных репозиториев скомпрометированного пользователя. Все такие репозитории получали префикс «migration» в названии. Так злоумышленники получали доступ к жёстко закодированным ключам, токенам и исходному коду, увеличивая риск как прямого взлома, так и вторичных атак.
Дополнительно был реализован механизм самораспространения: малварь скачивала все пакеты мейнтейнера, модифицировала их package.json, внедряла скрипт bundle.js, после чего переупаковывала и повторно публиковала их в npm. Это приводило к «автоматической троянизации» всех зависимых (нижестоящих) пакетов и быстрому каскадному распространению заражения.
Технический разбор Shai-Hulud 2.0
Во второй версии, Shai-Hulud 2.0, вредоносный код начинает выполняться уже на стадии pre-install, то есть ещё до завершения установки пакета. Это существенно повышает риски для разработчиков и CI/CD-окружений, поскольку атака может сработать даже при неуспешной установке зависимости.
По анализу Step Security, малварь состоит из двух файлов: setup_bun.js (дроппер, замаскированный под установщик среды Bun) и объёмного (около 10 МБ) файла bun_environment.js. Второй файл интенсивно обфусцирован: используется hex-кодированная строка с тысячами элементов, отдельный цикл для противодействия анализу и запутанная функция для поочерёдного извлечения строк в процессе выполнения кода.
Текущая версия червя реализует пять стадий атаки, включая целенаправленный поиск и извлечение:
- токенов GitHub и npm;
- учётных данных AWS, Google Cloud Platform, Microsoft Azure;
- секретов, используемых в процессах CI/CD.
Особенностью Shai-Hulud 2.0 является деструктивное поведение: если одновременно не выполняются четыре условия (успешная аутентификация на GitHub, возможность создать репозиторий, обнаружение токена GitHub и токена npm), вредонос переходит к перезаписи всего домашнего каталога пользователя. Это превращает атаку из «тихой» операции по краже данных в потенциально разрушительный инцидент.
Украденные секреты публикуются в автоматически создаваемые репозитории GitHub с описанием «Sha1-Hulud: The Second Coming», что упрощает идентификацию следов атаки, но одновременно помогает злоумышленникам централизованно собирать и обрабатывать полученные данные.
Влияние на экосистему npm и рекомендации по защите
По оценкам Aikido Security, обнаружено около 500 скомпрометированных пакетов, тогда как Koi Security насчитала более 800 вредоносных пакетов с учётом всех версий. Это подчёркивает типичный для supply chain-атак эффект домино: поражение нескольких ключевых пакетов быстро затрагивает тысячи проектов и команд разработки.
Эксперты рекомендуют разработчикам предпринять немедленные шаги по снижению рисков:
- Очистить кеш npm и откатиться к версиям пакетов, выпущенным до 21 ноября 2025 года, если есть хоть малейшие сомнения в их целостности.
- Полностью заменить все секреты и токены CI/CD (GitHub, npm, облачные провайдеры), включая те, что используются в автоматизированных пайплайнах.
- Проверить репозитории на наличие подозрительных новых репозиториев и коммитов с упоминанием
huludили необычных описаний. - По возможности отключить postinstall- и preinstall-скрипты в средах непрерывной интеграции либо применять строгую политику доверенных пакетов.
На фоне атак Shai-Hulud и S1ngularity платформа GitHub объявила о планах усиления защиты: обязательная двухфакторная аутентификация для локальных публикаций, ограничение «срока жизни» PAT-токенов до семи дней, отказ от TOTP в пользу FIDO-аутентификации и другие меры. Однако эти изменения внедряются постепенно, поэтому ответственность за оперативную защиту по-прежнему лежит на командах разработки.
Инцидент с Shai-Hulud 2.0 демонстрирует уязвимость современной цепочки поставок ПО: один скомпрометированный npm-пакет способен привести к массовой утечке секретов и разрушительным последствиям для инфраструктуры. Практика минимизации прав, регулярная ротация токенов, отказ от хранения секретов в коде и тщательный контроль зависимостей — уже не «хорошие практики», а необходимое условие выживания в текущем ландшафте киберугроз. Командам стоит использовать этот инцидент как отправную точку для пересмотра своих практик безопасности и внедрения более жёсткой модели доверия к внешним пакетам.