19 мая 2026 года реестр JavaScript-пакетов npm столкнулся с атакой, получившей название Shai-Hulud. Тогда злоумышленники получили контроль над аккаунтом одного из сопровождающих и за час опубликовали 639 вредоносных версий пакетов семейства @antv. Сообщество безопасности быстро разобрало угрозу по частям, а все образцы были внесены в базы данных известных угроз. Инцидент посчитали закрытым.
Описание
Однако 7 сентября тот же код снова появился в npm. Четыре пакета - feishu-docx-mcp, bmc-i18n-extract-cli, blueai-cli и bmc-translate-utils - вышли в один час с одной учётной записи. Все они содержали файл, который оказался побайтово идентичен использованному в мае. Вредоносная программа не претерпела никаких изменений.
Перерыв между последним майским обнаружением и нынешним составил 111 дней. Как отмечается в опубликованном разборе, этот код ранее фиксировался 319 раз, и все эти случаи пришлись на день атаки, после чего он полностью пропал из поля зрения. Это самый длительный период молчания для данного типа угроз.
Примечательно, что в июле npm объявил о внедрении автоматического сканирования всех публикуемых пакетов. По замыслу, каждый пакет перед установкой задерживается на несколько минут для проверки, однако точное совпадение с уже зарегистрированным вредоносным файлом не было выявлено. Угроза не являлась новой и не пыталась обойти сигнатурный анализ - это была та же самая последовательность данных.
Вредоносная программа действует следующим образом. После установки пакета выполняется код из корневого каталога, что приводит к запуску скрытого сценария. Далее с использованием украденных токенов доступа вредоносное ПО проверяет связь с реестром, скачивает другие пакеты, внедряет в них свой код, увеличивает номер версии и публикует новые вредоносные релизы. Параллельно создаются репозитории на GitHub для поддержки атакующей инфраструктуры.
Такое поведение позволяет вредоносному коду распространяться подобно червю, переходя от пакета к пакету через скомпрометированные учётные записи. В мае атаку курировали крупные исследовательские команды, но спустя месяцы она вернулась в неизменном виде. Это означает, что злоумышленники не посчитали нужным модифицировать свои инструменты.
Все четыре сентябрьских пакета имеют названия, имитирующие обычные утилиты, что делает их менее заметными для рядовых разработчиков. Единая учётная запись, с которой велась публикация, указывает на её повторную компрометацию или на использование автоматических средств для получения доступа. Сам факт публикации четырёх пакетов в один час говорит о том, что процесс был автоматизирован.
Этот случай поднимает вопрос о качестве сканирования реестра. Сверка по известным хэшам считается самой простой операцией, и её пропуск вызывает беспокойство. Если система не замечает столь очевидных совпадений, то более изощрённые атаки с лёгкой модификацией кода могут остаться полностью незамеченными.
Для пользователей это напоминание о важности проверки происхождения пакетов. Небольшие утилиты с малой историей обновлений нередко становятся переносчиками вредоносного кода. Внимательное отношение к дате публикации, количеству загрузок и репутации сопровождающего снижает риск установки зараженной зависимости.
Сразу после обнаружения вредоносные пакеты были удалены из реестра, однако полностью исключать повторные волны нельзя. Злоумышленникам достаточно изменить один байт в коде, чтобы обойти сигнатурные детекторы, поэтому использование старых методов без модификаций выглядит скорее исключением, чем правилом.
Чтобы минимизировать риски, разработчикам стоит применять инструменты проверки зависимостей и не доверять пакетам без поддающейся проверке истории. Администраторам реестра необходимо дополнить сигнатурное сканирование методами, которые анализируют поведение кода, а не только ищут точные совпадения с известными образцами.
Реакция на этот инцидент покажет, насколько платформа готова к возвращению старых угроз. Пока наблюдается разрыв между заявленной защитой и фактическим уровнем безопасности, и это тревожит сообщество. Урок состоит в том, что даже самая разрекламированная защита может оказаться неэффективной, если она не опирается на актуальные данные об инцидентах.
Индикаторы компрометации
Domain
- t.m-kosche.com
SHA256
- e37e3ddeeaaa9e0c4fdbcb829b4895a6521031c80053fc436625b61e6ee5b1a6