Современная разработка программного обеспечения практически немыслима без использования сторонних модулей и библиотек. Хотя этот подход значительно ускоряет процесс создания приложений, он же создает и огромную поверхность для атак, поскольку любой желающий может публиковать такие компоненты в открытых репозиториях. Неудивительно, что вредоносные (malicious) пакеты становятся все более распространенным явлением. Компрометация учетной записи maintainer популярных модулей или единственной важной зависимости может быстро превратиться в полноценную атаку на цепочку поставок. Подобные инциденты стали частым вектором атак, привлекающим внимание киберпреступников. Ярким подтверждением этой тенденции стала волна заражений, обнаруженная 16 сентября 2025 года в репозитории npm, которую вызвал самораспространяющийся червь под названием Shai-Hulud.
Описание
Червь Shai-Hulud был создан для кражи конфиденциальных данных, раскрытия приватных репозиториев организаций и перехвата учетных данных жертв с целью заражения других пакетов и дальнейшего распространения. В результате этого инцидента было инфицировано более 500 пакетов, включая библиотеку с еженедельным количеством загрузок, превышающим два миллиона. Разработчики, интегрировавшие эти вредоносные пакеты в свои проекты, рискуют потерей чувствительной информации, а их собственные библиотеки могут быть заражены Shai-Hulud. Этот саморазмножающийся червь захватывает учетные записи и похищает секреты для создания новых зараженных модулей, распространяя угрозу по цепочке зависимостей.
Технический механизм работы червя заключается в выполнении вредоносного кода в момент установки инфицированного пакета. После успешной установки из реестра npm на системе жертвы автоматически выполняется специальная команда, которая запускает вредоносный скрипт bundle.js размером более 3 МБ. Этот файл содержит несколько легитимных модулей с открытым исходным кодом, включая библиотеки для взаимодействия с облачными сервисами AWS и Google Cloud Platform (GCP), инструменты для работы с GitHub API и утилиту TruffleHog, предназначенную для сканирования различных источников данных в поиске секретов, таких как ключи API и токены доступа.
Отличительной особенностью Shai-Hulud является то, что почти все его вредоносные действия ориентированы на системы Linux и macOS. Начав выполнение, вредоносное программное обеспечение (ПО) проверяет наличие npm-токена и аутентифицированного токена пользователя GitHub в окружении. При отсутствии валидного токена GitHub скрипт прекращает работу. Если проверка пройдена, червь получает информацию о текущем пользователе GitHub и приступает к извлечению данных. Для этого создается временный исполняемый bash-скрипт /tmp/processor.sh, который взаимодействует с GitHub API нетривиальным способом.
Скрипт проверяет, имеет ли токен необходимые разрешения для создания веток и работы с GitHub Actions. При наличии прав он получает список всех репозиториев, к которым пользователь имеет доступ, начиная с 2025 года. В каждом из этих репозиториев создается новая ветка с именем shai-hulud, в которую загружается файл рабочего процесса shai-hulud-workflow.yml. Этот файл конфигурации для GitHub Actions активируется при каждом push-событии и предназначен для сбора секретов из репозиториев жертвы и их пересылки на сервер злоумышленников. Перед отправкой конфиденциальные данные дважды кодируются в Base64.
Следующим этапом является миграция приватных репозиториев. Основной скрипт bundle.js запрашивает список всех организаций, связанных с жертвой, и для каждой из них запускает функцию миграции. Она выполняет bash-скрипт /tmp/migrate-repos.sh, который автоматизирует перенос всех приватных и внутренних репозиториев указанной организации GitHub в учетную запись пользователя, делая их публичными. По мнению экспертов, эти действия направлены на автоматизированную кражу исходного кода из приватных репозиториев популярных сообществ и компаний. Известно, что в эту волну заражений попала, в частности, компания CrowdStrike.
Ключевой стадией атаки является самовоспроизведение червя. Скрипт получает список 20 самых скачиваемых пакетов жертвы. Для каждого найденного пакета вызывается функция updatePackage. Она загружает tarball-версию пакета, распаковывает ее во временную директорию и модифицирует следующим образом: в оригинальный пакет добавляется вредоносный bundle.js, а в файл package.json добавляется команда postinstall, настроенная на выполнение скрипта через node bundle.js. Номер версии пакета увеличивается на 1, после чего модифицированный пакет переупаковывается и публикуется в npm как новая версия. Это обеспечивает автоматическое распространение угрозы.
Далее червь использует утилиту TruffleHog для сбора секретов с целевой системы, а также модули для AWS и GCP. Собранные данные агрегируются в единый объект и загружаются в созданный в профиле жертвы репозиторий с именем “Shai-Hulud” в виде файла data.json. Собранная информация включает детали о системе, окружении, найденные секреты и данные аутентификации.
В ходе расследования специалистам удалось идентифицировать пакет, с которого началось распространение Shai-Hulud, - ngx-bootstrap версии 18.1.4. Ключевым отличием стало то, что в этом пакете команда на выполнение вредоносного скрипта была прописана как preinstall, то есть выполнялась до установки, в то время как в последующих зараженных пакетах использовалась команда postinstall. Это, а также отличие в имени архива, позволило исследователям определить его как пациента ноль.
Среди более чем 500 инфицированных библиотек оказались и пакеты от CrowdStrike, такие как @crowdstrike/commitlint, @crowdstrike/falcon-shoelace, @crowdstrike/foundry-js и другие. Однако наибольшее внимание привлекло заражение библиотеки @ctrl/tinycolor, которую еженедельно загружают более двух миллионов пользователей. Раскрытие приватных репозиториев организаций создает серьезные риски, включая возможность утечки исходного кода продуктов.
Для защиты от подобных угроз рекомендуется использовать специализированные решения для мониторинга компонентов с открытым исходным кодом. В случае заражения или в качестве упреждающей меры необходимо провести полное сканирование системы, выполнить аудит репозиториев GitHub на наличие подозрительных веток, файлов и workflow-процессов, содержащих строку “shai-hulud”. Критически важно перевыпустить npm и GitHub токены, ключи облачных сервисов, а также провести инвентаризацию npm-модулей, откатившись к чистым версиям пакетов.
Индикаторы компрометации
URLs
- https://webhook.site/bb8ca5f6-4175-45d2-b042-fc9ebb8170b7
MD5
- 78e701f42b76ccde3f2678e548886860
- c96fbbe010dd4c5bfb801780856ec228
SHA1
- 721ace3b28096c901d34920a75c0587564e10fea
- 8b98ab71cc71c8768de27af80a3e0d1bc6c8d809
SHA256
- 46faab8ab153fae6e80e7cca38eab363075bb524edd79e42269217a083628f09
- de0e25a3e6c1e1e5998b306b7141b3dc4c0088da9d7bb47c1c00c91e6e4f85d6