
Набор инструментов для обнаружения и устранения червя Miasma / Shai-Hulud и CVE-2026-35603 (внедрение конфигураций AI-агентов/IDE)
Инструменты анализа инцидентов, обнаружения и устранения для червя Miasma (варианта Mini Shai-Hulud), который внедряет автозапускаемые полезные нагрузки в конфигурации AI-агентов/IDE и репозитории npm/GitHub.
⚠️ Отказ от ответственности — без гарантии. Это общественный оборонительный инструментарий, предоставляемый «как есть», без каких-либо гарантий (см.
LICENSE). Сканер и YARA-правила работают только на чтение, ноpurge-history.shпереписывает историю git, а хуки.claude/перемещают файлы в карантин — оба могут изменить репозиторий. Сначала сделайте резервную копию, изучите, что делает каждый инструмент, и используйте на свой страх и риск. Чистое сканирование не является гарантией безопасности: индикаторы эволюционируют, и появляются новые варианты. Используйте на системах и аккаунтах, к которым у вас есть разрешение на проверку. Нашли пробел или ошибку? См.SECURITY.mdиCONTRIBUTING.md.
Установка YARA (Windows): winget install VirusTotal.YARA — или choco install yara / scoop install yara.
На Linux/macOS: apt install yara / brew install yara. Проверьте: yara --version.
Примечание:
-Mode Localпо умолчанию сканирует только$env:USERPROFILE. Укажите-CodeRootsдля охвата репозиториев в других местах, например-CodeRoots E:\Sources,D:\work.
# Сканирование локальной машины + локальных репозиториев (+ CVE-2026-35603 ProgramData)
pwsh -File Scan-Miasma.ps1 -Mode Local
pwsh -File Scan-Miasma.ps1 -Mode Local -CodeRoots E:\Sources,D:\work
# Сканирование удалённых репозиториев GitHub (сначала аутентифицируйтесь в целевом аккаунте для приватных репозиториев/секретов)
gh auth login
pwsh -File Scan-Miasma.ps1 -Mode Remote -Owners your-org,your-user -OutReport report.md
# Всё вместе + JSON + Markdown отчёт
pwsh -File Scan-Miasma.ps1 -OutJson findings.json -OutReport report.md
Код выхода 1, если есть INFECTED находка (для CI).
# Очистка истории заражённого репозитория (предварительно просмотрите PATHS в скрипте)
./purge-history.sh /path/to/repo
# затем, после проверки:
git push origin --force --all && git push origin --force --tags
# YARA-сканирование
yara -r setup-js.yar /path/to/scan
# Linux/macOS: локальное сканирование (bash-порт — по умолчанию $HOME; укажите пути для расширения)
./scan-miasma.sh
./scan-miasma.sh ~/src /opt/work
# Статическая деобфускация захваченного дроппера (только чтение — никогда не запускается)
pwsh -File Expand-MiasmaPayload.ps1 -Path .github/setup.js # записывает слои + iocs.txt в <Path>.deob/
pwsh -File Expand-MiasmaPayload.ps1 -SelfTest # проверка движка декодирования/дешифрования
Деобфускатор распаковывает волну упаковщика p,a,c,k,e,d, декодирует волну char-кода, автоматически определяет и обращает сдвиг Цезаря (переопределить через -Shift), затем дешифрует каждый встроенный AES-128-GCM блок (_b загрузчик, _p стилер) и сканирует восстановленный код на наличие URL, IP-адресов и аккаунтов для dead-drop.
# После устранения: создание приоритетного чеклиста смены секретов (ничего не отзывает)
pwsh -File Invoke-MiasmaRotation.ps1 # определяет доступные отсюда учётные данные
pwsh -File Invoke-MiasmaRotation.ps1 -OutReport rotation.md
Используйте встроенное composite action как первый шаг любого рабочего процесса:
# В другом репозитории (для безопасности цепочки поставок зафиксируйте тег/SHA):
- uses: actions/checkout@v4
- uses: jchable/miasma-toolkit/.github/actions/miasma-guard@main
# with:
# full-scan: 'true' # также запускает Scan-Miasma.ps1 -Mode Local (требуется pwsh)
Этот инструментарий запускает ту же защиту на себе через .github/workflows/miasma-ci.yml
(ссылаясь на action по относительному пути). Защита не зависит от варианта червя и нацелена на файлы конфигурации его загрузчика, поэтому никогда не даёт ложных срабатываний на документах, которые просто упоминают строку IOC.
.claude/)Защита в реальном времени для машин, на которых запущен Claude Code в этом репозитории. Хуки используют iocs.psd1 (без дублирования индикаторов) и подключены в .claude/settings.json:
.miasma-quarantine/<timestamp>/…
(игнорируется git) и логируются в .miasma-quarantine/quarantine.log — восстановите через Move-Item.
Ничего не удаляется безвозвратно.Test-MiasmaExcluded в Miasma.Common.ps1): собственные файлы инструментария
легитимно содержат строки IOC (iocs.psd1, Scan-Miasma.ps1, scan-miasma.sh,
Expand-MiasmaPayload.ps1, Invoke-MiasmaRotation.ps1, purge-history.sh, setup-js.yar,
content/, , , )
и никогда не блокируются/не помещаются в карантин.DROPPER, INJECT, FORGED, BADDEP, WORKFLOW, RUNNER, PAYLOAD, BUN-DROP, PROGRAMDATANPM-AUDIT, SECRETS (инвентаризация ротации), SIGNATURE, PERSIST, PROGRAMDATA-CFGgh api <404> --jq выводит тело ошибки в stdout → никогда не доверяйте правдивости вывода;
проверяйте $LASTEXITCODE + проверяйте формат (числовой размер, точное имя ветки).master→main после переименования → branches/master возвращает 200;
принимайте ветку только если возвращённое имя == запрошенное имя.--package-lock-only (без npm install, без выполнения скриптов).Исходный бэклог (bash-порт, значки серьёзности, деобфускация упаковщика, помощник ротации) готов. Будущие идеи:
scan-miasma.sh: добавить удалённый/GitHub режим (сейчас только локальный).--revoke (с подтверждением) для gh/npm/aws.| Файл | Описание |
|---|
content/incident-report.fr.md / content/incident-report.en.md | Полный отчёт: как работает, деобфускация полезной нагрузки, IOCs, устранение |
Scan-Miasma.ps1 | Единый сканер (локальный + удалённый), структурированный JSON + Markdown отчёт для каждого репозитория — используйте этот |
iocs.psd1 | Общие индикаторы (хэши, сигнатуры, вредоносные пакеты, конфиги), загружаемые сканером — редактируйте IOCs здесь |
Expand-MiasmaPayload.ps1 | Статический деобфускатор для setup.js — снимает упаковщик/char-коды → Caesar → AES-128-GCM и извлекает C2/IOCs (никогда не выполняет полезную нагрузку) |
Invoke-MiasmaRotation.ps1 | Чеклист смены секретов — определяет, какие учётные данные доступны здесь, и выводит команды отзыва (только чтение; ничего не отзывает) |
scan-miasma.sh | Bash-порт локального сканирования для Linux/macOS (кросс-платформенное подмножество) |
purge-history.sh | Удаление вредоносных файлов из всей истории git (filter-repo → filter-branch) + резервная копия |
setup-js.yar | YARA-правила для дроппера и конфигураций загрузчика |
.github/actions/miasma-guard/ | Переиспользуемое composite action для GitHub Actions — отказывается собирать, если присутствует дроппер/загрузчик |
.claude/ | Хуки Claude Code — защита в реальном времени/карантин + команда /miasma-scan (см. ниже) |
| Инструмент | Для чего нужен | Обязателен? |
|---|
PowerShell 7+ (pwsh) | Scan-Miasma.ps1, Expand-MiasmaPayload.ps1, Invoke-MiasmaRotation.ps1 | обязательно (для этих инструментов) |
bash + coreutils (sha256sum/shasum, awk, find) | scan-miasma.sh (Linux/macOS) | только для bash-порта |
| git | Проверка истории локальных репозиториев, purge-history.sh | обязательно |
GitHub CLI (gh, аутентифицированный) | Scan-Miasma.ps1 -Mode Remote | только для удалённого сканирования |
| npm | удалённый npm audit (только lockfile) | опционально (автопропускается, если отсутствует) |
| git-filter-repo | предпочтительное переписывание истории (есть резервный встроенный git filter-branch) | опционально |
YARA (yara) | сканирование с setup-js.yar | опционально |
| Хук | Событие | Действие |
|---|
Guard-Write.ps1 | PreToolUse (Write/Edit/MultiEdit) | Блокирует запись, которая внедрила бы IOC червя (отменяет вызов инструмента) |
Guard-Bash.ps1 | PreToolUse (Bash) | Блокирует выполнение червя — node .github/setup.js, bun/bunx, конвейерный установщик bun.sh |
Scan-Write.ps1 | PostToolUse (Write/Edit/MultiEdit) | Оповещает + помещает в карантин заражённый файл после его создания |
Session-Sweep.ps1 | SessionStart | Быстрая проверка репозитория; сообщает о любом существующем заражении в контекст |
/miasma-scan | команда | Обёртка для Scan-Miasma.ps1 по запросу |
.claude/hooks|commands.github/actions/miasma-guard/.github/workflows/Guard-Bash нацелен на выполнение, а не на упоминание: его шаблоны (iocs.psd1 → CmdSigs)
привязаны к позиции команды, поэтому команды анализа, которые просто называют IOC
(grep "node .github/setup.js", yara -r setup-js.yar, cat setup.js), не блокируются —
блокируется только фактический запуск node …/setup.js / bun / конвейера установки bun.sh. Примечание: вызов bun/bunx блокируется полностью (среда выполнения червя); добавьте в белый список через CmdSigs, если вам действительно нужен Bun.Scan-Miasma.ps1 (только чтение), эти хуки изменяют дерево (карантин). Они
опциональны: Claude Code запрашивает подтверждение хуков при первой загрузке .claude/settings.json.