
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).
| § | 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 |
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..git è un file (contenente gitdir: …), la directory git reale viene risolta prima dell'ispezione.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:
| 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 |
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=….