
Набор инструментов для обнаружения и устранения червя 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.
| Файл | Описание |
|---|---|
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 | опционально |
Установка 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: