
Scanner IOC per strumenti di coding AI agentici — rileva Mini Shai-Hulud, Gemini CLI RCE, Cursor CVE-2026-26268 e DPRK PromptMink.
Scanner IOC per strumenti di coding AI agentici — rileva Mini Shai-Hulud, Gemini CLI RCE, Cursor CVE-2026-26268 e DPRK PromptMink.
Un kit di rilevamento per individuare la compromissione degli assistenti di coding AI agentici (Claude Code, Gemini CLI, Cursor) e delle dipendenze che introducono nei tuoi repository. Undici controlli tra iniezione di hook, configurazioni RCE, dipendenze malevole, backdoor nei git hook e manomissione dei workflow CI. La lista IOC è esternalizzata: aggiungere nuovi indicatori non richiede modifiche al codice.
Articolo di accompagnamento: When the Tool Fights Back.
scanner/ais.sh)Undici controlli, ciascuno con un What: (scopo) e un Fix: (rimedio) inline stampati sotto l'intestazione della sezione, così il report è autoesplicativo. La lista IOC risiede in scanner/iocs.txt (versionata; si può sovrascrivere con IOC_FILE=/path/to/iocs.txt).
Utilizzo:
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
Output
agentic-ioc-scan-YYYYMMDD-HHMMSS.log di default, ripulito dai codici ANSI tramite tee → sed).[CRITICAL] (intervenire subito), [WARNING] (probabilmente malevole — verificare), [REVIEW] (possibile uso legittimo — confermare), [OK] (pulito).path:line). Sezioni che riportano i numeri di riga: §1 hook, §2 firma Bun, §3 segnale di offuscamento, §5 chiave preinstall, §7 metacarattere Gemini, §8 riferimento git hook in AGENTS.md, §9 contenuti hook sospetti..git/config incriminata e l'URL del remote corrispondente, così puoi andare direttamente alla voce da rimuovere.core.hooksPath (§9) riporta il percorso assoluto del .git/config del repository, così la riassegnazione è verificabile.Esempio di output
[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
Aggiornamento degli IOC
Modifica scanner/iocs.txt e aggiorna l'intestazione # version:. Il formato è TYPE|VALUE|NOTES. Tipi supportati:
Non è richiesta alcuna modifica al codice quando emergono nuovi IOC — lo scanner li legge all'avvio e stampa la versione caricata nel banner.
Dipendenze
Richiesti: bash, find, grep, awk, sed, git. Opzionali: jq (preferito per §1 — in assenza usa l'euristica grep), npm (richiesto per il controllo dei pacchetti globali §10; la sezione viene saltata silenziosamente se non disponibile).
scanner/pkg_version_check.sh)Complementare allo scanner IOC. Legge un CSV di coppie package,version interessate (ad es. il feed IOC di Mini Shai-Hulud in ~/Downloads/Mini Shai-Hulud - Sheet1.csv — 633 coppie npm pacchetto/versione) e verifica se compaiono in:
package.json, package-lock.json, yarn.lock, pnpm-lock.yaml e il node_modules/<pkg>/package.json installato. Vengono controllati anche i manifest PyPI (requirements.txt, poetry.lock, Pipfile.lock) quando il CSV contiene nomi non scoped.gh: ricerca nel codice tra i tipi di lockfile, quindi validazione esatta della versione tramite l'API SBOM del dependency graph (/repos/{owner}/{repo}/dependency-graph/sbom).Modello di gravità: corrispondenza esatta pkg@version in un lockfile, in node_modules/ o nell'SBOM → [CRITICAL]. Specificatore di intervallo (^1.2.3, ~1.2.3, >=…) che potrebbe includere la versione interessata → [REVIEW]. Corrispondenza del nome del pacchetto senza conferma della versione → [REVIEW]. L'output viene mostrato nel terminale e salvato in ./shai-hulud-pkg-scan-YYYYMMDD-HHMMSS.log (senza codici ANSI), con un riepilogo per gravità alla fine.
Utilizzo:
# 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 = nome del pacchetto (supportati nomi scoped come @scope/pkg), col2 = versione interessata esatta. Una riga di intestazione viene rilevata automaticamente e saltata. Si può sovrascrivere il percorso con IOC_CSV=….
Dipendenze: bash, find, grep, awk, sed. Opzionali: jq (migliora la precisione del parsing di node_modules/<pkg>/package.json), gh (richiesto per la fase GitHub — la fase viene saltata con un messaggio chiaro se assente o non autenticato).
Limitazioni note:
grep, non è un parsing completo — formattazioni profondamente annidate o inusuali possono produrre falsi negativi. Il successivo intervento di maggior valore è il parsing dei lockfile basato su jq.[REVIEW].claude-code-policy/)Livello di prevenzione per Claude Code, che completa il livello di rilevamento sopra descritto.
allowManagedHooksOnly).claude/settings.jsoncurl, wget e bun dall'uso degli strumenti dell'agenteInstallazione:
# 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 lato server per rifiutare push che aggiungono file .claude/settings.json, .vscode/tasks.json o .gemini/ da autori non in allowlist.Issue e PR benvenuti — in particolare per nuove segnalazioni di IOC (aggiungere a scanner/iocs.txt e aggiornare l'intestazione della versione), ulteriori percorsi di scansione specifici per piattaforma e pattern di rilevamento per strumenti agentici affini (Continue, Cody, Codex CLI, Aider).
MIT
| § | Controllo | Minaccia coperta |
|---|
| 1 | Iniezione dell'hook SessionStart di Claude Code in qualsiasi settings.json (basata su jq, basso FP) | Persistenza di Mini Shai-Hulud |
| 2 | Firme del dropper Bun in setup.mjs | Fase di installazione di Mini Shai-Hulud |
| 3 | Payload execution.js offuscati — dimensione più segnale di offuscamento (su una sola riga, base64, eval(atob(, child_process) | Furto di credenziali di Mini Shai-Hulud |
| 4 | File di lock malware in $TMPDIR (nomi presi dalla lista IOC) | Sentinella di Mini Shai-Hulud |
| 5 | Script preinstall in package.json che fanno riferimento a nomi di file dropper | Punto di ingresso generico di worm della supply chain |
| 6 | Commit scritti da IA che toccano .github/workflows/ (filtro allowlist email) | Manomissione CI tramite identità di agente IA compromesso |
| 7 | File di configurazione .gemini/ con pattern di metacaratteri di shell | Gemini CLI CVSS 10.0 RCE (pre-v0.39.1) |
| 8 | File AGENTS.md e configurazioni .cursor/ di Cursor che fanno riferimento a git hook / bare repo | Cursor CVE-2026-26268 |
| 9 | Hook Git post-checkout / post-merge / post-rewrite / pre-commit contenenti primitive fetch-and-execute, oltre a core.hooksPath reindirizzato fuori dall'allowlist sicura | Primitiva exec di CVE-2026-26268 + hijacking generico di hook |
| 10 | Pacchetti node_modules installati globalmente e localmente incrociati con la lista IOC | Set SAP CAP di Mini Shai-Hulud, DPRK PromptMink, futuri pacchetti malevoli |
| 11 | Remote Git corrispondenti a nomi noti di repository di esfiltrazione del worm (Shai-Hulud, A Mini Shai-Hulud has Appeared) | Segnale di compromissione confermata |
.git è un file (contenente gitdir: …), la directory git reale viene risolta prima dell'ispezione.| Tipo | Usato da | Esempio |
|---|
FILENAME | Pattern preinstall §5 | setup.mjs |
LOCKFILE | Scansione file di lock §4 | tmp.987654321.lock |
NPM | Scansione pacchetti globali e locali §10 | @validate-sdk/v2 |
PYPI | §10 (incrociato quando verrà aggiunto uno scanner PyPI) | lightning |
HOOKSTRING | Corrispondenza del contenuto hook §1 (attualmente codificato inline) | SessionStart |
REPONAME | Corrispondenza remote git §11 | A Mini Shai-Hulud has Appeared |
EMAILSUBSTRING | Riservato per futuri match IOC sull'autore del commit | — |
CONFIGPATH | Elenco di riferimento dei percorsi di configurazione degli strumenti agentici | .claude/settings.json |