
Kit de detecção e remediação para o worm Miasma / Shai-Hulud e CVE-2026-35603 (injeção de configuração de agente de IA/IDE)
Ferramentas de análise de incidentes + detecção/remediação para o worm Miasma (uma variante Mini Shai-Hulud) que injeta payloads de execução automática em configurações de agentes de IA / IDEs e repositórios npm/GitHub.
⚠️ Aviso legal — sem garantia. Este é um kit de ferramentas defensivo da comunidade fornecido "como está", sem garantia de qualquer tipo (consulte
LICENSE). O scanner e as regras YARA são somente leitura, mas opurge-history.shreescreve o histórico do git e os hooks.claude/movem arquivos para quarentena — ambos podem alterar um repositório. Faça backup primeiro, revise o que cada ferramenta faz e execute por sua conta e risco. Uma varredura limpa não é garantia de segurança: os indicadores evoluem e novas variantes surgem. Use apenas em sistemas e contas que você está autorizado a inspecionar. Encontrou uma lacuna ou um bug? ConsulteSECURITY.mdeCONTRIBUTING.md.
Instale o YARA (Windows): winget install VirusTotal.YARA — ou choco install yara / scoop install yara.
No Linux/macOS: apt install yara / brew install yara. Verifique com yara --version.
Observação: o
-Mode Localpor padrão varre apenas$env:USERPROFILE. Passe-CodeRootspara cobrir repositórios em outros locais, ex.:-CodeRoots E:\Sources,D:\work.
# Scan local machine + local repos (+ CVE-2026-35603 ProgramData)
pwsh -File Scan-Miasma.ps1 -Mode Local
pwsh -File Scan-Miasma.ps1 -Mode Local -CodeRoots E:\Sources,D:\work
# Scan remote GitHub repos (authenticate on the target account first for private repos/secrets)
gh auth login
pwsh -File Scan-Miasma.ps1 -Mode Remote -Owners your-org,your-user -OutReport report.md
# Everything + JSON + Markdown report
pwsh -File Scan-Miasma.ps1 -OutJson findings.json -OutReport report.md
Código de saída 1 se houver qualquer achado INFECTED (amigável para CI).
# Purge history of an infected repo (review PATHS in the script first)
./purge-history.sh /path/to/repo
# then, after reviewing the verification:
git push origin --force --all && git push origin --force --tags
# YARA scan
yara -r setup-js.yar /path/to/scan
# Linux/macOS: local scan (bash port — defaults to $HOME; pass roots to widen)
./scan-miasma.sh
./scan-miasma.sh ~/src /opt/work
# Statically deobfuscate a captured dropper (read-only — never runs it)
pwsh -File Expand-MiasmaPayload.ps1 -Path .github/setup.js # writes layers + iocs.txt to <Path>.deob/
pwsh -File Expand-MiasmaPayload.ps1 -SelfTest # verify the decode/decrypt engine
O desofuscador desempacota a onda do empacotador p,a,c,k,e,d, decodifica a onda de códigos de
caractere, detecta automaticamente e reverte o deslocamento Caesar (substitua com -Shift), depois
descriptografa cada blob AES-128-GCM embutido (_b bootstrapper, _p stealer) e varre o código
recuperado em busca de URLs, IPs e contas de dead-drop.
# After eradication: generate a prioritized secret-rotation checklist (revokes nothing)
pwsh -File Invoke-MiasmaRotation.ps1 # detects creds reachable here
pwsh -File Invoke-MiasmaRotation.ps1 -OutReport rotation.md
Use a ação composta incluída como primeira etapa de qualquer workflow:
# In another repo (pin to a tag/SHA for supply-chain safety):
- uses: actions/checkout@v4
- uses: jchable/miasma-toolkit/.github/actions/miasma-guard@main
# with:
# full-scan: 'true' # also run Scan-Miasma.ps1 -Mode Local (needs pwsh)
Este kit executa a mesma proteção em si mesmo via .github/workflows/miasma-ci.yml
(referenciando a ação por caminho relativo). A proteção é independente de variante e restrita aos
arquivos de configuração do launcher do worm, portanto nunca gera falsos positivos em documentos
que apenas mencionam a string de IOC.
.claude/)Proteção em tempo real para máquinas que executam o Claude Code neste repositório. Os hooks
reutilizam iocs.psd1 (sem indicadores duplicados) e estão configurados em .claude/settings.json:
.miasma-quarantine/<timestamp>/…
(ignorados pelo git) e registrados em .miasma-quarantine/quarantine.log — restaure com Move-Item.
Nada é excluído permanentemente.Test-MiasmaExcluded em Miasma.Common.ps1): os próprios arquivos do kit contêm
legitimamente strings de IOC (iocs.psd1, Scan-Miasma.ps1, scan-miasma.sh,
Expand-MiasmaPayload.ps1, Invoke-MiasmaRotation.ps1, purge-history.sh, setup-js.yar,
content/, , , )
e nunca são bloqueados/colocados em quarentena.DROPPER, INJECT, FORGED, BADDEP, WORKFLOW, RUNNER, PAYLOAD, BUN-DROP, PROGRAMDATANPM-AUDIT, SECRETS (inventário de rotação), SIGNATURE, PERSIST, PROGRAMDATA-CFGgh api <404> --jq despeja o corpo do erro no stdout → nunca confie na veracidade da saída;
verifique $LASTEXITCODE + valide o formato (tamanho numérico, nome exato do branch).master→main após a renomeação → branches/master
retorna 200; aceite um branch somente se o nome retornado == nome solicitado.--package-lock-only (sem npm install, sem scripts executados).O backlog original (porte em bash, selos de severidade, desofuscação da onda do empacotador, helper de rotação) está concluído. Ideias futuras:
scan-miasma.sh: adicionar o modo remoto/GitHub (atualmente apenas local).--revoke (protegido, com confirmação) para gh/npm/aws.| Arquivo | O que é |
|---|
content/incident-report.fr.md / content/incident-report.en.md | Relatório completo: como funciona, desofuscação do payload, IOCs, erradicação |
Scan-Miasma.ps1 | Scanner unificado (local + remoto), relatório JSON estruturado + Markdown por repositório — use este |
iocs.psd1 | Indicadores compartilhados (hashes, assinaturas, pacotes maliciosos, configurações) carregados pelo scanner — edite os IOCs aqui |
Expand-MiasmaPayload.ps1 | Desofuscador estático para setup.js — remove as camadas do empacotador/códigos de caractere → Caesar → AES-128-GCM e extrai o C2/IOCs (nunca executa o payload) |
Invoke-MiasmaRotation.ps1 | Checklist de rotação de segredos — detecta quais credenciais estão acessíveis aqui e imprime os comandos de revogação (somente leitura; não revoga nada) |
scan-miasma.sh | Porte em Bash da varredura local para Linux/macOS (subconjunto multiplataforma) |
purge-history.sh | Remove arquivos maliciosos de todo o histórico do git (filter-repo → filter-branch) + backup |
setup-js.yar | Regras YARA para o dropper + configurações do launcher |
.github/actions/miasma-guard/ | Ação composta do GitHub Actions reutilizável — recusa a compilação se o dropper/launcher estiver presente |
.claude/ | Hooks do Claude Code — proteção/quarentena em tempo real + comando /miasma-scan (veja abaixo) |
| Ferramenta | Necessária para | Obrigatória? |
|---|
PowerShell 7+ (pwsh) | Scan-Miasma.ps1, Expand-MiasmaPayload.ps1, Invoke-MiasmaRotation.ps1 | obrigatório (essas ferramentas) |
bash + coreutils (sha256sum/shasum, awk, find) | scan-miasma.sh (Linux/macOS) | apenas o porte em bash |
| git | verificação de histórico de repositórios locais, purge-history.sh | obrigatório |
GitHub CLI (gh, autenticado) | Scan-Miasma.ps1 -Mode Remote | apenas varredura remota |
| npm | npm audit remoto (apenas lockfile) | opcional (ignorado automaticamente se ausente) |
| git-filter-repo | reescrita de histórico preferida (recorre ao git filter-branch integrado) | opcional |
YARA (yara) | varredura setup-js.yar | opcional |
| Hook | Evento | Ação |
|---|
Guard-Write.ps1 | PreToolUse (Write/Edit/MultiEdit) | Bloqueia uma escrita que injetaria um IOC do worm (cancela a chamada da ferramenta) |
Guard-Bash.ps1 | PreToolUse (Bash) | Bloqueia a execução do worm — node .github/setup.js, bun/bunx, um instalador do bun.sh via pipe |
Scan-Write.ps1 | PostToolUse (Write/Edit/MultiEdit) | Alerta e coloca em quarentena um arquivo infectado após a gravação |
Session-Sweep.ps1 | SessionStart | Varredura rápida do repositório; relata qualquer infecção pré-existente no contexto |
/miasma-scan | comando | Wrapper sob demanda para Scan-Miasma.ps1 |
.claude/hooks|commands.github/actions/miasma-guard/.github/workflows/Guard-Bash visa a execução, não a menção: seus padrões (iocs.psd1 → CmdSigs) são
ancorados à posição do comando, portanto comandos de triagem que apenas mencionam um IOC
(grep "node .github/setup.js", yara -r setup-js.yar, cat setup.js) não são bloqueados —
apenas a execução real de node …/setup.js / bun / um pipe de instalação do bun.sh é.
Observação: a invocação de bun/bunx é bloqueada por completo (o runtime do worm); adicione à
allowlist via CmdSigs se você realmente precisar do Bun.Scan-Miasma.ps1 (somente leitura), estes hooks modificam a árvore
(quarentena). Eles são opcionais: o Claude Code solicita aprovação dos hooks na primeira vez que
carrega .claude/settings.json.