
Защита от атаки Shai-Hulud на цепочку поставок
Инструмент безопасности для обнаружения скомпрометированных 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 — это самореплицирующийся червь, который начал атаковать npm-пакеты 14-15 сентября 2025 года, став первой успешной самораспространяющейся атакой в экосистеме npm и одной из самых серьёзных атак на цепочку поставок JavaScript, наблюдавшихся на сегодняшний день. Названный в честь гигантских песчаных червей из серии «Дюна» Фрэнка Герберта, этот вредоносный код развился в несколько вариантов.
Первоначальная атака заразила более 200 npm-пакетов (согласно отслеживанию в этом инструменте), при этом у каждого пакета были затронуты несколько версий.
В ноябре 2025 года появился новый вариант со значительными изменениями:
preinstall-скрипты (не только postinstall)setup_bun.js и bun_environment.js (в дополнение к bundle.js)Ссылка: Запись в блоге Wiz Research — Shai-Hulud 2.0
Нулевой пациент: атака началась с пакета rxnt-authentication, опубликованного 14 сентября 2025 года в 17:58:50 UTC скомпрометированной учётной записью npm "techsupportrxnt".
Цепочка атаки (оригинальный Shai-Hulud):
postinstall-скрипт, выполняющий bundle.js (полезная нагрузка на JavaScript размером более 3 МБ)data.json (двойное base64-кодирование).github/workflows/shai-hulud-workflow.yml), который эксфильтрует секреты репозитория на webhook[.]sitepostinstall-хукиЦепочка атаки (Shai-Hulud 2.0 — ноябрь 2025):
preinstall-скрипт, выполняющий setup_bun.js или bun_environment.js (новые файлы полезной нагрузки)cloud.json, contents.json, environment.json и truffleSecrets.json.github/workflows/discussion.yaml с self-hosted раннером для доступа-бэкдора.github/workflows/formatter_*.yml для эксфильтрации секретов (затем удаляет workflow, чтобы скрыть активность)docker run --rm --privileged -v /:/hostghp_*, gho_*), токены аутентификации npmОригинальный Shai-Hulud (сентябрь 2025):
@ctrl/tinycolor, ngx-bootstrap)Shai-Hulud 2.0 (ноябрь 2025):
Подтверждённая кража учётных данных (по данным анализа ~20 000 репозиториев):
КРИТИЧНО: Wiz Research подтвердила, что происходит эксфильтрация между жертвами. Это означает:
Вывод для расследования: при проверке эксфильтрованных данных в своих репозиториях убедитесь, принадлежат ли эти данные вашей организации или другой жертве.
Эта атака напрямую связана с августовской 2025 года компрометацией s1ngularity/Nx, где кража токенов GitHub позволила провести более масштабную атаку на цепочку поставок. Многие первые жертвы Shai-Hulud были известными жертвами атаки s1ngularity. Исследователи безопасности также отмечают интеграцию контента, созданного ИИ, в рамках кампании: со средней степенью уверенности можно утверждать, что для генерации вредоносного bash-скрипта использовалась LLM.
Кампания оригинального Shai-Hulud:
rxnt-authentication («нулевой пациент»)Кампания Shai-Hulud 2.0:
PyYAML (pip install pyyaml)js-yaml (npm install js-yaml)# Make executable
chmod +x shai_hulud_scanner.py
# Scan single package.json
python3 shai_hulud_scanner.py ./package.json
# Scan package-lock.json for exact versions
python3 shai_hulud_scanner.py ./package-lock.json
# Scan entire project directory
python3 shai_hulud_scanner.py ./my-project
# Scan current directory
python3 shai_hulud_scanner.py .
# Install dependencies first
npm install
# Make executable
chmod +x shai_hulud_scanner.js
# Scan single package.json
node shai_hulud_scanner.js ./package.json
# Scan package-lock.json for exact versions
node shai_hulud_scanner.js ./package-lock.json
# Scan entire project directory
node shai_hulud_scanner.js ./my-project
# Scan current directory
node shai_hulud_scanner.js .
✅ Обнаружение точных совпадений: определяет пакеты с точным совпадением версий с известными скомпрометированными версиями
⚠️ Обнаружение потенциального риска: помечает пакеты с тем же именем, но другими версиями (всё ещё могут находиться в зоне риска)
🔍 Поддержка двух файлов: сканирует как package.json (объявленные зависимости), так и package-lock.json (точные установленные версии)
📦 Полное покрытие: сканирование package-lock.json включает вложенные зависимости и транзитивные пакеты
🔄 Рекурсивное сканирование: автоматически сканирует все подкаталоги, пропуская node_modules
📋 Подробная отчётность: показывает имена пакетов, версии, разделы зависимостей и затронутые версии
🔎 Обнаружение IoC: определяет индикаторы компрометации как для оригинального Shai-Hulud, так и для Shai-Hulud 2.0:
"postinstall": "node bundle.js", файлы bundle.js, shai-hulud-workflow.yml"preinstall", файлы setup_bun.js, bun_environment.js, workflow discussion.yaml, formatter_*.ymlwebhook.site, шаблоны раннеров SHA1HULUD, повышение привилегий в Docker🚨 Критично (обнаружены скомпрометированные пакеты):
🚨 CRITICAL: Found 2 CONFIRMED compromised packages:
• @ctrl/deluge v7.2.2 in dependencies
Affected versions: 7.2.2, 7.2.1
• ngx-bootstrap v19.0.3 in devDependencies
Affected versions: 18.1.4, 19.0.3, 20.0.4, 20.0.5, 20.0.6, 19.0.4, 20.0.3
⚠️ Предупреждение (несоответствие версий):
⚠️ WARNING: Found 1 packages with different versions:
• @ctrl/deluge v7.2.0 in dependencies
Known affected versions: 7.2.2, 7.2.1
✅ Чисто:
✅ No affected packages found
npm uninstall <package-name>npm cache clean --forcerm -rf node_modules"postinstall": "node bundle.js" в файлах package.jsonbundle.js (размер более 3 МБ, содержат вредоносную полезную нагрузку).github/workflows/shai-hulud-workflow.yml"preinstall"-хуки в файлах package.jsonsetup_bun.js и bun_environment.jscloud.json, contents.json, environment.json, truffleSecrets.jsonДанные о пакетах централизованы в affected_packages.yaml. Чтобы добавить новые скомпрометированные пакеты:
affected_packages.yaml- name: "package-name"
versions: ["1.0.0", "1.0.1"]
Такой централизованный подход устраняет необходимость обновлять несколько файлов при обнаружении новых угроз.
# Create central scanning script
curl -O https://your-domain.com/shai_hulud_scanner.py
chmod +x shai_hulud_scanner.py
# Mass scan multiple projects
for dir in /projects/*/; do
echo "Scanning $dir"
python3 shai_hulud_scanner.py "$dir"
done
# GitHub Actions example
- name: Scan for Shai-Hulud packages
run: |
curl -O https://your-domain.com/shai_hulud_scanner.js
npm install js-yaml
node shai_hulud_scanner.js .
if [ $? -ne 0 ]; then
echo "SECURITY ALERT: Compromised packages detected!"
exit 1
fi
# Add to security toolkit
cp shai_hulud_scanner.py /usr/local/bin/
cp shai_hulud_scanner.js /usr/local/bin/
cp affected_packages.yaml /usr/local/bin/
# Create alias for easy access
echo 'alias scan-shai="python3 /usr/local/bin/shai_hulud_scanner.py"' >> ~/.bashrc
postinstall, Shai-Hulud 2.0 использует preinstall (повышает подверженность риску в средах сборки)Оригинальный Shai-Hulud (сентябрь 2025):
"postinstall": "node bundle.js" в package.jsonbundle.js (обычно минифицированный JavaScript размером более 3 МБ)webhook.site.github/workflows/shai-hulud-workflow.yml для устойчивостиshai-hulud, содержащие вредоносные коммитыShai-Hulud 2.0 (ноябрь 2025):
"preinstall": "node setup_bun.js" или "preinstall": "node bun_environment.js" в package.jsonsetup_bun.js, bun_environment.js (в дополнение к bundle.js)cloud.json, contents.json, environment.json, truffleSecrets.json.github/workflows/discussion.yaml (с runs-on: self-hosted и RUNNER_TRACKING_ID: 0).github/workflows/formatter_*.yml (сопоставление по шаблону, используется для эксфильтрации секретов)Общее для обоих вариантов:
webhook.sitepreinstall-скрипты (фаза выполнения Shai-Hulud 2.0)setup_bun.js и bun_environment.jscloud.json, contents.json, environment.json, truffleSecrets.jsondiscussion.yaml и formatter_*.ymlprevention/block-shai-hulud.shПо вопросам и проблемам:
.github/workflows/discussion.yaml (с self-hosted раннером).github/workflows/formatter_*.ymldocker run --rm --privileged -v /:/host)webhook.site в коде или сетевых журналахdocker run --rm --privileged -v /:/hostwebhook.site (как и в оригинале)