
Escáner de IOC para herramientas de codificación de IA agéntica — detecta Mini Shai-Hulud, Gemini CLI RCE, Cursor CVE-2026-26268 y DPRK PromptMink.
Escáner de IOC para herramientas de codificación de IA agéntica — detecta Mini Shai-Hulud, Gemini CLI RCE, Cursor CVE-2026-26268 y DPRK PromptMink.
Un kit de detección para el compromiso de asistentes de codificación de IA agéntica (Claude Code, Gemini CLI, Cursor) y las dependencias que introducen en tus repositorios. Once comprobaciones en inyección de hooks, configuraciones RCE, dependencias maliciosas, backdoors en git hooks y manipulación de flujos de trabajo de CI. La lista de IOC está externalizada: añadir nuevos indicadores no requiere cambios de código.
Artículo complementario del blog: Cuando la herramienta contraataca.
scanner/ais.sh)Once comprobaciones, cada una con un What: (propósito) y un Fix: (remediación) en línea, impresos bajo el encabezado de la sección para que el informe se explique por sí mismo. La lista de IOC vive en scanner/iocs.txt (versionada; se puede sobrescribir con IOC_FILE=/path/to/iocs.txt).
Uso:
bash scanner/ais.sh
# Enter your project folder when prompted
# Custom IOC list:
IOC_FILE=./my-iocs.txt bash scanner/ais.sh
# Custom report path (default: ./agentic-ioc-scan-YYYYMMDD-HHMMSS.log):
REPORT_FILE=/var/log/agentic-scan.log bash scanner/ais.sh
Salida
agentic-ioc-scan-YYYYMMDD-HHMMSS.log por defecto, sin ANSI mediante tee → sed).[CRITICAL] (actúe ya), [WARNING] (probablemente malicioso — verifique), [REVIEW] (es posible un uso legítimo — confirme), [OK] (limpio).ruta:línea). Secciones que muestran números de línea: §1 hook, §2 firma Bun, §3 señal de ofuscación, §5 clave preinstall, §7 metachar Gemini, §8 referencia a git-hook en AGENTS.md, §9 contenidos sospechosos de hooks..git/config infractora y la URL remota coincidente, para que puedas ir directamente a la entrada que debe eliminarse.core.hooksPath (§9) informa la ruta absoluta del .git/config del repositorio para que la reasignación sea auditable.Ejemplo de hallazgo
[CRITICAL] Repo points to known worm exfil name
Repo: /home/dev/projects/myrepo
Config: /home/dev/projects/myrepo/.git/config:9
URL: https://github.com/dhawaldesai/A-Mini-Shai-Hulud-has-Appeared
[CRITICAL] Malicious hook: /home/dev/projects/myrepo/.claude/settings.json:3
[CRITICAL] Suspicious git post-checkout hook: /home/dev/projects/myrepo/.git/hooks/post-checkout:2
Actualización de los IOC
Edita scanner/iocs.txt y actualiza el encabezado # version:. El formato es TYPE|VALUE|NOTES. Tipos admitidos:
No se requiere ningún cambio de código cuando aparecen nuevos IOC: el escáner los lee al inicio e imprime la versión cargada en el banner.
Dependencias
Requeridas: bash, find, grep, awk, sed, git. Opcionales: jq (preferido para §1 — recurre a la heurística de grep si no está), npm (requerido para la comprobación de paquetes globales de §10; la sección se omite silenciosamente si no está disponible).
scanner/pkg_version_check.sh)Complementario al escáner de IOC. Lee un CSV de pares paquete,versión afectados (p. ej. el feed de IOC de Mini Shai-Hulud en ~/Downloads/Mini Shai-Hulud - Sheet1.csv — 633 pares de paquete/versión npm) y comprueba si aparecen en:
package.json, package-lock.json, yarn.lock, pnpm-lock.yaml y los package.json de node_modules/<pkg> instalados. También se comprueban los manifiestos de PyPI (requirements.txt, poetry.lock, Pipfile.lock) cuando el CSV contiene nombres sin ámbito.gh: búsqueda de código entre tipos de lockfiles y luego validación de versión exacta a través de la API SBOM del grafo de dependencias (/repos/{owner}/{repo}/dependency-graph/sbom).Modelo de severidad: coincidencia exacta de pkg@version en un lockfile, en node_modules/ o en el SBOM → [CRITICAL]. Especificador de rango (^1.2.3, ~1.2.3, >=…) que podría incluir la versión afectada → [REVIEW]. Coincidencia de nombre de paquete sin confirmación de versión → [REVIEW]. La salida se transmite al terminal y a ./shai-hulud-pkg-scan-YYYYMMDD-HHMMSS.log (sin ANSI), con un resumen del desglose de severidad al final.
Uso:
# Interactive — prompts for project directory
bash scanner/pkg_version_check.sh
# Fully scripted (env-var overrides)
PROJECT_DIR=/path/to/project \
IOC_CSV="$HOME/Downloads/Mini Shai-Hulud - Sheet1.csv" \
REPORT_FILE=/var/log/pkg-scan.log \
bash scanner/pkg_version_check.sh --skip-node-modules
Formato CSV: col1 = nombre del paquete (se admiten nombres con ámbito como @scope/pkg), col2 = versión afectada exacta. Una fila de encabezado se detecta y se omite automáticamente. Sobrescribe la ruta con IOC_CSV=….
Dependencias: bash, find, grep, awk, sed. Opcionales: jq (mejora la precisión del análisis de node_modules/<pkg>/package.json), gh (necesario para la fase de GitHub; la fase se omite con un mensaje claro si no está o no está autenticado).
Limitaciones conocidas:
grep, no se analiza por completo: el formato profundamente anidado o inusual puede producir falsos negativos. El siguiente paso de mayor valor es el análisis de lockfiles con jq.[REVIEW].claude-code-policy/)Capa de prevención para Claude Code, que complementa la capa de detección anterior.
allowManagedHooksOnly).claude/settings.jsoncurl, wget y bun del uso de herramientas por parte del agenteInstalación:
# Copy managed settings (cannot be overridden by projects)
cp claude-code-policy/managed-settings.json ~/.claude/managed-settings.json
# Copy the PreToolUse hook
mkdir -p ~/.claude/hooks
cp claude-code-policy/hooks/block_shai_hulud.py ~/.claude/hooks/
chmod +x ~/.claude/hooks/block_shai_hulud.py
npm ls -g).pre-receive del lado del servidor para rechazar pushes que añadan archivos .claude/settings.json, .vscode/tasks.json o .gemini/ de autores no incluidos en la lista blanca.Se aceptan issues y PRs, especialmente para nuevas propuestas de IOC (añádelas a scanner/iocs.txt y actualiza el encabezado de versión), raíces de escaneo adicionales específicas de plataforma y patrones de detección para herramientas agénticas afines (Continue, Cody, Codex CLI, Aider).
MIT
| § | Comprobación | Amenaza cubierta |
|---|
| 1 | Inyección de hook SessionStart de Claude Code en cualquier settings.json (basado en jq, bajo FP) | Persistencia de Mini Shai-Hulud |
| 2 | Firmas de dropper en runtime Bun en setup.mjs | Etapa de instalación de Mini Shai-Hulud |
| 3 | Payloads execution.js ofuscados: tamaño más señal de ofuscación (una sola línea, base64, eval(atob(, child_process) | Robador de credenciales de Mini Shai-Hulud |
| 4 | Archivos de bloqueo de malware en $TMPDIR (nombres procedentes de la lista de IOC) | Centinela de Mini Shai-Hulud |
| 5 | Scripts preinstall de package.json que referencian nombres de archivos de droppers | Punto de entrada genérico de gusano en la cadena de suministro |
| 6 | Commits escritos por IA que tocan .github/workflows/ (filtro de lista blanca de correos) | Manipulación de CI por identidad comprometida de agente de IA |
| 7 | Archivos de configuración .gemini/ con patrones de metacaracteres de shell | RCE CVSS 10.0 de Gemini CLI (anterior a v0.39.1) |
| 8 | Configuraciones AGENTS.md y .cursor/ de Cursor que referencian git hooks / repositorios bare | Cursor CVE-2026-26268 |
| 9 | Hooks de Git post-checkout / post-merge / post-rewrite / pre-commit que contienen primitivas de fetch-and-execute, además de core.hooksPath redirigido fuera de la lista blanca segura | Primitiva exec de CVE-2026-26268 + secuestro genérico de hooks |
| 10 | Paquetes instalados globalmente y locales de node_modules contrastados con la lista de IOC | Conjunto SAP CAP de Mini Shai-Hulud, DPRK PromptMink, futuros paquetes maliciosos |
| 11 | Remotos de Git que coinciden con nombres de repositorios conocidos de exfiltración por gusano (Shai-Hulud, A Mini Shai-Hulud has Appeared) | Señal de compromiso confirmado |
.git es un archivo (que contiene gitdir: …), se resuelve el directorio git real antes de la inspección.| Tipo | Usado por | Ejemplo |
|---|
FILENAME | §5 patrón preinstall | setup.mjs |
LOCKFILE | §4 escaneo de archivos de bloqueo | tmp.987654321.lock |
NPM | §10 escaneo de paquetes globales y locales | @validate-sdk/v2 |
PYPI | §10 (se contrasta cuando se añada un escáner de PyPI) | lightning |
HOOKSTRING | §1 coincidencia de contenido de hook (actualmente codificado en línea) | SessionStart |
REPONAME | §11 coincidencia de remoto de git | A Mini Shai-Hulud has Appeared |
EMAILSUBSTRING | reservado para futuras coincidencias de autor de commits IOC | — |
CONFIGPATH | lista de referencia de rutas de configuración de herramientas agénticas | .claude/settings.json |