OreNPMGuard - сканер пакетов Shai-Hulud
Версия 2.0.0 — обнаружение Shai-Hulud 2.0 и улучшенная система предотвращения
Инструмент безопасности для обнаружения скомпрометированных npm-пакетов из атак на цепочку поставок Shai-Hulud (оригинальная атака сентября 2025 года и Shai-Hulud 2.0 в ноябре 2025 года). Сканирует файлы package.json и package-lock.json для обнаружения точных установленных версий и индикаторов компрометации (IoC). Доступен как в реализации на Python, так и на Node.js с централизованной конфигурацией в YAML для простоты обслуживания.
Последнее обновление: 24 ноября 2025 г. — отслеживаются 738+ скомпрометированных пакетов с 1 291 уникальной комбинацией package@version. Теперь обнаруживает как оригинальные атаки Shai-Hulud, так и варианты Shai-Hulud 2.0.
Для сканирования в нескольких экосистемах см. ore-mal-pkg-inspector.
🔗 Связанные проекты
Для сканирования вредоносных пакетов в нескольких экосистемах (npm, PyPI, Maven, RubyGems, Go, Cargo) см.:
ore-mal-pkg-inspector — комплексный сканер вредоносных пакетов с динамической аналитикой угроз.
OreNPMGuard специализируется именно на защите от атак Shai-Hulud для npm-пакетов.
🚨 Об атаках Shai-Hulud
Shai-Hulud — это самореплицирующийся червь, который начал атаковать npm-пакеты 14-15 сентября 2025 года, став первой успешной самораспространяющейся атакой в экосистеме npm и одной из самых серьёзных атак на цепочку поставок JavaScript, наблюдавшихся на сегодняшний день. Названный в честь гигантских песчаных червей из серии «Дюна» Фрэнка Герберта, этот вредоносный код развился в несколько вариантов.
Оригинальный Shai-Hulud (сентябрь 2025)
Первоначальная атака заразила более 200 npm-пакетов (согласно отслеживанию в этом инструменте), при этом у каждого пакета были затронуты несколько версий.
Shai-Hulud 2.0 (ноябрь 2025) — НОВОЕ
В ноябре 2025 года появился новый вариант со значительными изменениями:
- 738+ скомпрометированных пакетов с 1 291 уникальной комбинацией package@version
- 25 000+ затронутых репозиториев у ~350 уникальных пользователей
- Новая фаза выполнения: использует
preinstall-скрипты (не только postinstall)
- Новые файлы полезной нагрузки:
setup_bun.js и bun_environment.js (в дополнение к bundle.js)
- Улучшенная устойчивость: создаёт self-hosted раннеры с именем 'SHA1HULUD' и новые шаблоны GitHub Workflow
- Нацеленность на мультиоблако: сбор учётных данных AWS, Azure и GCP
- Повышение привилегий в Docker: попытки получить root-доступ через привилегированные контейнеры
- Пакеты загружены в период с 21 по 23 ноября 2025 года
Ссылка: Запись в блоге Wiz Research — Shai-Hulud 2.0
🦠 Как работает атака
Нулевой пациент: атака началась с пакета rxnt-authentication, опубликованного 14 сентября 2025 года в 17:58:50 UTC скомпрометированной учётной записью npm "techsupportrxnt".
Цепочка атаки (оригинальный Shai-Hulud):
- Установка: вредоносный пакет запускает
postinstall-скрипт, выполняющий bundle.js (полезная нагрузка на JavaScript размером более 3 МБ)
- Сбор учётных данных: использует TruffleHog для поиска токенов GitHub/npm, учётных данных AWS/GCP/Azure, переменных окружения и облачных ключей, доступных через IMDS
- Эксфильтрация данных: создаёт публичный репозиторий "Shai-Hulud" в GitHub-аккаунте жертвы с украденными секретами в
data.json (двойное base64-кодирование)
- Устойчивость: внедряет вредоносный GitHub Actions workflow (
.github/workflows/shai-hulud-workflow.yml), который эксфильтрует секреты репозитория на webhook[.]site
- Миграция репозиториев: принудительно превращает приватные репозитории организаций в публичные личные репозитории с суффиксом "-migration" и описанием "Shai-Hulud Migration"
- Распространение червя: использует украденные npm-токены для внедрения вредоносного кода в другие пакеты, сопровождаемые жертвой, увеличивая номера версий и добавляя
postinstall-хуки
Цепочка атаки (Shai-Hulud 2.0 — ноябрь 2025):
- Установка: вредоносный пакет запускает
preinstall-скрипт, выполняющий setup_bun.js или bun_environment.js (новые файлы полезной нагрузки)
- Создание файлов данных: создаёт файлы
cloud.json, contents.json, environment.json и truffleSecrets.json
- Сбор учётных данных: нацеленность на мультиоблако (AWS, Azure, GCP) с использованием официальных SDK, извлечение учётных данных из конфигурационных файлов, переменных окружения и IMDS
- Регистрация self-hosted раннера: регистрирует заражённую машину как self-hosted раннер с именем 'SHA1HULUD'
- Внедрение GitHub Workflow:
- Создаёт
.github/workflows/discussion.yaml с self-hosted раннером для доступа-бэкдора
- Создаёт
.github/workflows/formatter_*.yml для эксфильтрации секретов (затем удаляет workflow, чтобы скрыть активность)
- Повышение привилегий в Docker: пытается получить root-доступ через
docker run --rm --privileged -v /:/host
- Выгрузка облачных секретов: использует аутентифицированные сессии для выгрузки секретов из AWS Secrets Manager, Google Secret Manager и Azure Key Vault
- Создание репозиториев: создаёт репозитории с описанием "Shai-Hulud" для эксфильтрации
🎯 Что похищается
- Учётные данные разработки: GitHub PAT (
ghp_*, gho_*), токены аутентификации npm
- Облачные учётные данные: ключи доступа и токены AWS, GCP, Azure
- API-ключи: учётные данные Atlassian, Datadog и других сервисов
- Системная информация: переменные окружения, сведения о хосте, учётные записи пользователей
- Исходный код: приватные репозитории, сделанные публичными или клонированные
📊 Масштаб воздействия
Оригинальный Shai-Hulud (сентябрь 2025):
- Более 200 пакетов скомпрометировано в этой базе отслеживания (включая популярные пакеты, такие как
@ctrl/tinycolor, ngx-bootstrap)
- Скомпрометировано несколько GitHub-аккаунтов (точное количество зависит от источника отчётов)
- Созданы публичные репозитории с меткой "Shai-Hulud Migration"
- Разработчики потенциально затронуты через зависимости пакетов
Shai-Hulud 2.0 (ноябрь 2025):
- 738+ скомпрометированных пакетов с 1 291 уникальной комбинацией package@version
- 25 000+ затронутых репозиториев, созданных у ~350 уникальных пользователей
- Более 1 000 новых репозиториев добавлялось каждые 30 минут в течение первых часов кампании
- Затрагивает пакеты из крупных экосистем: Zapier, ENS Domains, PostHog, Postman, AsyncAPI и других
- Кража мультиоблачных учётных данных (AWS, Azure, GCP)
- Попытки повышения привилегий в Docker
Подтверждённая кража учётных данных (по данным анализа ~20 000 репозиториев):
- 775 скомпрометированных токенов доступа GitHub
- 373 раскрытых учётных данных AWS
- 300 раскрытых учётных данных GCP
- 115 раскрытых учётных данных Azure
⚠️ Предупреждение об эксфильтрации между жертвами
КРИТИЧНО: Wiz Research подтвердила, что происходит эксфильтрация между жертвами. Это означает:
- Украденные секреты одной жертвы могут быть опубликованы в репозиториях, принадлежащих другой, не связанной жертве
- Если вы обнаружили подозрительные данные в своих GitHub-репозиториях, они могут принадлежать другому скомпрометированному пользователю
- Ваши данные могли быть эксфильтрованы в репозитории, которые вам не принадлежат
- Это усложняет атрибуцию и реагирование на инциденты
Вывод для расследования: при проверке эксфильтрованных данных в своих репозиториях убедитесь, принадлежат ли эти данные вашей организации или другой жертве.