
Kit de detección y remediación para el gusano Miasma / Shai-Hulud y CVE-2026-35603 (inyección de configuración de AI-agent/IDE)
Herramientas de análisis de incidentes + detección/remediación para el gusano Miasma (una variante Mini Shai-Hulud) que inyecta cargas útiles de auto-ejecución en configuraciones de agentes de IA / IDE y repositorios npm/GitHub.
⚠️ Aviso legal — sin garantía. Este es un kit de herramientas defensivo comunitario proporcionado "tal cual", sin garantía de ningún tipo (consulte
LICENSE). El escáner y las reglas YARA son de solo lectura, peropurge-history.shreescribe el historial de git y los hooks de.claude/mueven archivos a cuarentena — ambos pueden alterar un repositorio. Haga una copia de seguridad primero, revise qué hace cada herramienta y ejecútela bajo su propio riesgo. Un análisis limpio no es una garantía de seguridad: los indicadores evolucionan y aparecen nuevas variantes. Úselo en sistemas y cuentas que esté autorizado a inspeccionar. ¿Encontró una brecha o un error? ConsulteSECURITY.mdyCONTRIBUTING.md.
Instale YARA (Windows): winget install VirusTotal.YARA — o choco install yara / scoop install yara.
En Linux/macOS: apt install yara / brew install yara. Verifique con yara --version.
Nota:
-Mode Localescanea solo$env:USERPROFILEpor defecto. Pase-CodeRootspara cubrir repositorios en otras ubicaciones, p. ej.-CodeRoots E:\Sources,D:\work.
# Escanea la máquina local + repositorios locales (+ CVE-2026-35603 ProgramData)
pwsh -File Scan-Miasma.ps1 -Mode Local
pwsh -File Scan-Miasma.ps1 -Mode Local -CodeRoots E:\Sources,D:\work
# Escanea repositorios remotos de GitHub (autentíquese primero en la cuenta objetivo para repositorios/secretos privados)
gh auth login
pwsh -File Scan-Miasma.ps1 -Mode Remote -Owners su-org,su-usuario -OutReport report.md
# Todo + JSON + informe Markdown
pwsh -File Scan-Miasma.ps1 -OutJson findings.json -OutReport report.md
Código de salida 1 si hay algún hallazgo INFECTADO (compatible con CI).
# Purga el historial de un repositorio infectado (revise PATHS en el script primero)
./purge-history.sh /ruta/al/repo
# luego, después de revisar la verificación:
git push origin --force --all && git push origin --force --tags
# Escaneo YARA
yara -r setup-js.yar /ruta/a/escanear
# Linux/macOS: escaneo local (puerto Bash — usa $HOME por defecto; pase raíces para ampliar)
./scan-miasma.sh
./scan-miasma.sh ~/src /opt/work
# Desofusca estáticamente un dropper capturado (solo lectura — nunca lo ejecuta)
pwsh -File Expand-MiasmaPayload.ps1 -Path .github/setup.js # escribe capas + iocs.txt en <Path>.deob/
pwsh -File Expand-MiasmaPayload.ps1 -SelfTest # verifica el motor de decodificación/descifrado
El desofuscador desempaqueta la oleada del empaquetador p,a,c,k,e,d, decodifica la oleada de códigos de caracteres, detecta automáticamente
y revierte el desplazamiento César (anule con -Shift), luego descifra cada blob AES-128-GCM incrustado (_b bootstrap, _p ladrón)
y escanea el código recuperado en busca de URLs, IPs y cuentas de drop muerto.
# Después de la erradicación: genera una lista de verificación priorizada de rotación de secretos (no revoca nada)
pwsh -File Invoke-MiasmaRotation.ps1 # detecta credenciales accesibles aquí
pwsh -File Invoke-MiasmaRotation.ps1 -OutReport rotation.md
Use la acción compuesta incluida como primer paso de cualquier flujo de trabajo:
# En otro repositorio (fíjese a una etiqueta/SHA para seguridad de cadena de suministro):
- uses: actions/checkout@v4
- uses: jchable/miasma-toolkit/.github/actions/miasma-guard@main
# with:
# full-scan: 'true' # también ejecuta Scan-Miasma.ps1 -Mode Local (necesita pwsh)
Este kit ejecuta la misma guardia sobre sí mismo a través de .github/workflows/miasma-ci.yml
(referenciando la acción por ruta relativa). La guardia es independiente de la oleada y está enfocada en los archivos de configuración del lanzador
del gusano, por lo que nunca da falsos positivos en documentos que solo mencionan la cadena IOC.
.claude/)Protección en tiempo real para máquinas que ejecutan Claude Code en este repositorio. Los hooks reutilizan
iocs.psd1 (sin indicadores duplicados) y están conectados en .claude/settings.json:
.miasma-quarantine/<marca de tiempo>/…
(ignorados por git) y se registran en .miasma-quarantine/quarantine.log — restáurelos con Move-Item.
No se elimina nada de forma permanente.Test-MiasmaExcluded en Miasma.Common.ps1): los propios archivos del kit contienen
legítimamente cadenas IOC (iocs.psd1, Scan-Miasma.ps1, scan-miasma.sh,
Expand-MiasmaPayload.ps1, Invoke-MiasmaRotation.ps1, purge-history.sh, setup-js.yar,
content/, , , )
y nunca son bloqueados/puestos en cuarentena.DROPPER, INJECT, FORGED, BADDEP, WORKFLOW, RUNNER, PAYLOAD, BUN-DROP, PROGRAMDATANPM-AUDIT, SECRETS (inventario de rotación), SIGNATURE, PERSIST, PROGRAMDATA-CFGgh api <404> --jq vuelca el cuerpo del error a stdout → nunca confíe en la veracidad de la salida;
verifique $LASTEXITCODE + valide el formato (tamaño numérico, nombre de rama exacto).master→main tras el cambio de nombre → branches/master devuelve 200;
solo acepte una rama si el nombre devuelto == nombre solicitado.--package-lock-only (sin npm install, sin ejecución de scripts).La lista original (puerto Bash, insignias de gravedad, desofuscación de oleadas de packer, ayuda de rotación) está completa. Ideas futuras:
scan-miasma.sh: añadir el modo remoto/GitHub (actualmente solo local).--revoke opcional (restringido, con confirmación) para gh/npm/aws.| Archivo | Qué es |
|---|
content/incident-report.fr.md / content/incident-report.en.md | Informe completo: cómo funciona, desofuscación de carga útil, IOCs, erradicación |
Scan-Miasma.ps1 | Escáner unificado (local + remoto), JSON estructurado + informe Markdown por repositorio — use este |
iocs.psd1 | Indicadores compartidos (hashes, firmas, paquetes maliciosos, configuraciones) cargados por el escáner — edite los IOCs aquí |
Expand-MiasmaPayload.ps1 | Desofuscador estático para setup.js — despeja packer/códigos de caracteres → César → AES-128-GCM y extrae el C2/IOCs (nunca ejecuta la carga útil) |
Invoke-MiasmaRotation.ps1 | Lista de verificación de rotación de secretos — detecta qué credenciales son accesibles aquí e imprime los comandos de revocación (solo lectura; no revoca nada) |
scan-miasma.sh | Puerto Bash del escaneo local para Linux/macOS (subconjunto multiplataforma) |
purge-history.sh | Purga archivos maliciosos de todo el historial de git (filter-repo → filter-branch) + copia de seguridad |
setup-js.yar | Reglas YARA para el dropper + configuraciones del lanzador |
.github/actions/miasma-guard/ | Acción compuesta reutilizable de GitHub Actions — rechaza compilar si el dropper/lanzador está presente |
.claude/ | Hooks de Claude Code — guardia/cuarentena en tiempo real + comando /miasma-scan (ver más abajo) |
| Herramienta | Necesario para | ¿Obligatorio? |
|---|
PowerShell 7+ (pwsh) | Scan-Miasma.ps1, Expand-MiasmaPayload.ps1, Invoke-MiasmaRotation.ps1 | obligatorio (esas herramientas) |
bash + coreutils (sha256sum/shasum, awk, find) | scan-miasma.sh (Linux/macOS) | solo el puerto Bash |
| git | comprobaciones de historial de repositorios locales, purge-history.sh | obligatorio |
GitHub CLI (gh, autenticado) | Scan-Miasma.ps1 -Mode Remote | solo escaneo remoto |
| npm | npm audit remoto (solo archivo de bloqueo) | opcional (se omite automáticamente si no está presente) |
| git-filter-repo | reescritura de historial preferida (usa git filter-branch integrado como alternativa) | opcional |
YARA (yara) | escaneo con setup-js.yar | opcional |
| Hook | Evento | Acción |
|---|
Guard-Write.ps1 | PreToolUse (Write/Edit/MultiEdit) | Bloquea una escritura que inyectaría un IOC del gusano (cancela la llamada a la herramienta) |
Guard-Bash.ps1 | PreToolUse (Bash) | Bloquea la ejecución del gusano — node .github/setup.js, bun/bunx, un instalador bun.sh canalizado |
Scan-Write.ps1 | PostToolUse (Write/Edit/MultiEdit) | Alerta + pone en cuarentena un archivo infectado después de que se escriba |
Session-Sweep.ps1 | SessionStart | Barrido rápido del repositorio; informa cualquier infección preexistente en el contexto |
/miasma-scan | comando | Envoltorio bajo demanda alrededor de Scan-Miasma.ps1 |
.claude/hooks|commands.github/actions/miasma-guard/.github/workflows/Guard-Bash apunta a la ejecución, no a la mención: sus patrones (iocs.psd1 → CmdSigs) están
anclados a una posición de comando, por lo que los comandos de triaje que simplemente nombran un IOC
(grep "node .github/setup.js", yara -r setup-js.yar, cat setup.js) no se bloquean —
solo se bloquea la ejecución real de node …/setup.js / bun / un pipe de instalación bun.sh.
Nota: la invocación de bun/bunx se bloquea directamente (es el runtime del gusano); si realmente necesita Bun,
inclúyalo en la lista blanca a través de CmdSigs.Scan-Miasma.ps1 (solo lectura), estos hooks modifican el árbol (cuarentena). Son
de aceptación voluntaria: Claude Code solicita aprobar los hooks la primera vez que carga .claude/settings.json.