В конце ноября 2025 года специалисты по информационной безопасности зафиксировали вторую, более мощную волну атаки под названием Shai-Hulud, нацеленную на экосистему npm. Кампания, получившая от своих операторов название «Второе пришествие» (The Second Coming), представляет собой агрессивную атаку на цепочку поставок программного обеспечения. Всего за несколько часов после обнаружения она скомпрометировала свыше 700 пакетов npm, создала более 27 000 вредоносных репозиториев на GitHub и раскрыла около 14 000 секретов в 487 организациях.
Описание
По сравнению с первой версией, использовавшей менее изощрённые методы, Shai-Hulud V2 демонстрирует критически важные усовершенствования. Эксперты компании Zscaler ThreatLabz отмечают, что угроза теперь использует выполнение на этапе предустановки для большего урона, обеспечивает постоянный доступ через самостоятельно развёрнутые раннеры GitHub Actions, применяет перекрестное использование учётных данных жертв для создания подобия ботнета и оснащена механизмом «мёртвой руки», который уничтожает пользовательские данные при обнаружении сдерживания атаки.
К числу наиболее заметных скомпрометированных пакетов относятся "zapier-platform-core", "@ensdomains/ensjs", "posthog-js", "@postman/tunnel-agent" и "@asyncapi/generator", а также десятки связанных с ними зависимостей. Атака начинается в момент, когда разработчик или конвейер непрерывной интеграции и доставки (CI/CD) устанавливает заражённый пакет npm. В отличие от первой кампании, злоумышленники эксплуатируют скрипт жизненного цикла "preinstall". Это позволяет вредоносному коду выполняться ещё до завершения установки пакета, повышая вероятность успеха атаки.
Одним из ключевых нововведений стало использование среды выполнения Bun вместо Node.js. Небольшой загрузочный скрипт "setup_bun.js" проверяет наличие Bun, при необходимости устанавливает его и запускает обфусцированный полезный груз (payload) "bun_environment.js" в качестве фонового процесса. Такой подход усложняет обнаружение, поскольку традиционные средства защиты, настроенные на поведение Node.js, могут его пропустить.
Поведение вредоносной программы адаптируется в зависимости от окружения. В средах CI/CD она работает синхронно, удерживая раннер активным и извлекая высокоценные секреты. В средах разработки она выполняется асинхронно, чтобы не привлекать внимание. Программа активно собирает токены GitHub и npm, а также учётные данные облачных провайдеров AWS, GCP и Azure, используя для этого официальные SDK. Более того, она злоупотребляет легитимным инструментом TruffleHog для сканирования домашнего каталога пользователя на наличие секретов в файлах конфигурации и истории Git.
Для эксфильтрации данных Shai-Hulud V2 использует репозитории GitHub, созданные с помощью скомпрометированных токенов. Этот метод маскирует вредоносный трафик под легитимный API-трафик GitHub, что затрудняет обнаружение. Создаются репозитории со случайными именами, в которые загружаются файлы с системной информацией, дампами переменных окружения и украденными секретами.
Особую опасность представляет функция перекрёстного использования учётных данных. Если в текущем окружении не удаётся найти валидный токен GitHub, программа ищет репозитории, созданные в ходе предыдущих заражений, и извлекает токены других жертв. Таким образом, создаётся сетевая структура, где каждая скомпрометированная учётная запись потенциально раскрывает данные других пострадавших, значительно продлевая жизненный цикл угрозы.
Вредоносная программа также автоматизирует своё распространение через npm. Обнаружив токен npm, она находит все пакеты жертвы, внедряет вредоносный хук "preinstall", инкрементирует версию и публикует заражённую версию. Ещё одной мощной функцией является создание бэкдора через GitHub Actions. Программа развёртывает самоуправляемый раннер в скрытом каталоге, который сохраняется после удаления пакета и перезагрузки системы. Затем создаётся рабочий процесс с уязвимостью внедрения команд, позволяющий злоумышленникам выполнять произвольные команды на системе жертвы через обсуждения GitHub.
Встроенный механизм «мёртвой руки» представляет собой деструктивную функцию. Если система теряет доступ к GitHub и npm, активируется сценарий уничтожения данных. На Windows используется команда "cipher /W" для затирания файлов, а на Linux и macOS - "shred -uvz". Такая мера может привести к массовому уничтожению данных, если платформы начнут масштабные действия по удалению репозиториев или отзыву токенов.
Для защиты от этой угрозы эксперты Zscaler рекомендуют ряд мер. Во-первых, следует использовать приватные прокси-регистры и инструменты анализа состава программного обеспечения (Software Composition Analysis, SCA) для фильтрации пакетов. Во-вторых, необходимо применять файлы блокировок, такие как "package-lock.json", и команду "npm ci" вместо "npm install". Также важно минимизировать поверхность атаки, удаляя неиспользуемые зависимости, и применять принцип наименьших привилегий, используя токены с ограниченной областью действия и коротким сроком жизни.
Крайне важно немедленно отозвать все скомпрометированные токены npm, персональные токены доступа GitHub, ключи облачных сервисов и секреты CI/CD. Следует включить устойчивую к фишингу многофакторную аутентификацию на всех платформах. Кроме того, необходимо отслеживать аномальные публикации в npm, неожиданные добавления рабочих процессов в GitHub или использование сканеров секретов в CI. Системы, на которые могло быть оказано воздействие, следует считать скомпрометированными, изолировать и при необходимости переразвернуть. Обновление планов реагирования на инциденты, связанные с цепочками поставок, и регулярные учения также являются важными шагами для укрепления безопасности.
Индикаторы компрометации
SHA256
- 62ee164b9b306250c1172583f138c9614139264f889fa99614903c12755468d0
- 9d59fd0bcc14b671079824c704575f201b74276238dc07a9c12a93a84195648a
- a3894003ad1d293ba96d77881ccd2071446dc3f65f434669b49b3da92421901a
Repository description
- Sha1-Hulud: The Second Coming.
- "ha1-Hulud: The Continued Coming
Repository names
- Случайные строки из 18 символов.
Self-hosted runner name
- SHA1HULUD
Workflow file
- .github/workflows/discussion.yaml