
Scanner d'IOC pour outils de codage IA agentique — détecte Mini Shai-Hulud, Gemini CLI RCE, Cursor CVE-2026-26268 et DPRK PromptMink.
Scanner IOC pour les outils de codage IA agentiques — détecte Mini Shai-Hulud, Gemini CLI RCE, Cursor CVE-2026-26268 et DPRK PromptMink.
Un kit de détection pour les compromissions des assistants de codage IA agentiques (Claude Code, Gemini CLI, Cursor) et les dépendances qu'ils intègrent dans vos dépôts. Onze vérifications couvrant l'injection de hooks, les configurations RCE, les dépendances malveillantes, les backdoors de hooks git et la falsification de workflows CI. La liste des IOC est externalisée — l'ajout de nouveaux indicateurs ne nécessite aucune modification de code.
Article de blog associé : When the Tool Fights Back.
scanner/ais.sh)Onze vérifications, chacune avec un What: (objectif) et un Fix: (remédiation) imprimés sous l'en-tête de section pour que le rapport soit explicite. La liste des IOC se trouve dans scanner/iocs.txt (versionnée ; remplacez par IOC_FILE=/chemin/vers/iocs.txt).
Utilisation :
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
Sortie
agentic-ioc-scan-YYYYMMDD-HHMMSS.log par défaut, nettoyé des codes ANSI via tee → sed).[CRITICAL] (agir maintenant), [WARNING] (probablement malveillant — vérifier), [REVIEW] (utilisation légitime possible — confirmer), [OK] (propre).chemin:ligne). Sections qui affichent les numéros de ligne : §1 hook, §2 signature Bun, §3 signal d'obfuscation, §5 clé preinstall, §7 métacaractère Gemini, §8 référence de hook git dans AGENTS.md, §9 contenu suspect de hook..git/config incriminée ainsi que l'URL distante correspondante, afin que vous puissiez accéder directement à l'entrée à supprimer.core.hooksPath (§9) rapporte le chemin absolu vers le .git/config du dépôt afin que la réaffectation soit vérifiable.Exemple de résultat
[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
Mise à jour des IOC
Modifiez scanner/iocs.txt et incrémentez l'en-tête # version:. Le format est TYPE|VALEUR|NOTES. Types pris en charge :
Aucune modification de code n'est nécessaire lorsque de nouveaux IOC apparaissent — le scanner les lit au démarrage et affiche la version chargée dans la bannière.
Dépendances
Requis : bash, find, grep, awk, sed, git. Optionnel : jq (préféré pour §1 — utilise une heuristique grep en son absence), npm (requis pour la vérification §10 des paquets globaux ; la section est ignorée silencieusement si indisponible).
scanner/pkg_version_check.sh)Compagnon du scanner IOC. Lit un CSV de paires package,version affectées (par ex. le flux IOC Mini Shai-Hulud dans ~/Downloads/Mini Shai-Hulud - Sheet1.csv — 633 paires paquet/version npm) et vérifie si elles apparaissent dans :
package.json, package-lock.json, yarn.lock, pnpm-lock.yaml et les node_modules/<pkg>/package.json installés. Les manifestes PyPI (requirements.txt, poetry.lock, Pipfile.lock) sont également vérifiés lorsque le CSV contient des noms non scopés.gh : recherche de code dans les types de fichiers de verrouillage, puis validation de version exacte via l'API SBOM du graphe de dépendances (/repos/{owner}/{repo}/dependency-graph/sbom).Modèle de gravité : correspondance exacte pkg@version dans un fichier de verrouillage, node_modules/ ou SBOM → [CRITICAL]. Spécificateur de plage (^1.2.3, ~1.2.3, >=…) pouvant inclure la version affectée → [REVIEW]. Correspondance de nom de paquet sans confirmation de version → [REVIEW]. La sortie est dirigée vers le terminal et vers ./shai-hulud-pkg-scan-YYYYMMDD-HHMMSS.log (nettoyé des codes ANSI), avec un résumé de répartition des gravités à la fin.
Utilisation :
# 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
Format CSV : colonne1 = nom du paquet (noms scopés comme @scope/pkg pris en charge), colonne2 = version affectée exacte. Une ligne d'en-tête est automatiquement détectée et ignorée. Remplacez le chemin avec IOC_CSV=....
Dépendances : bash, find, grep, awk, sed. Optionnel : jq (améliore la précision de l'analyse de node_modules/<pkg>/package.json), gh (requis pour la phase GitHub — la phase est ignorée avec un message clair si absent ou non authentifié).
Limitations connues :
grep, non entièrement analysée — un formatage profondément imbriqué ou inhabituel peut produire des faux négatifs. La suite la plus utile est l'analyse de fichiers de verrouillage basée sur jq.[REVIEW].claude-code-policy/)Couche de prévention pour Claude Code, complétant la couche de détection ci-dessus.
allowManagedHooksOnly).claude/settings.jsoncurl, wget et bun de l'utilisation d'outils par l'agentInstallation :
# 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 est câblé).pre-receive côté serveur pour rejeter les pushs ajoutant des fichiers .claude/settings.json, .vscode/tasks.json ou .gemini/ provenant d'auteurs non autorisés.Les issues et PRs sont les bienvenus — en particulier pour les nouvelles soumissions d'IOC (ajouter à scanner/iocs.txt et incrémenter l'en-tête de version), des racines d'analyse supplémentaires spécifiques à une plateforme et des motifs de détection pour les outils agentiques adjacents (Continue, Cody, Codex CLI, Aider).
MIT
| § | Vérification | Menace couverte |
|---|
| 1 | Injection de hook SessionStart de Claude Code dans tout settings.json (basée sur jq, faible taux de faux positifs) | Persistance Mini Shai-Hulud |
| 2 | Signatures de dropper Bun-runtime dans setup.mjs | Étape d'installation de Mini Shai-Hulud |
| 3 | Charges utiles obfusquées execution.js — taille plus signal d'obfuscation (monoligne, base64, eval(atob(, child_process) | Voleur d'identifiants Mini Shai-Hulud |
| 4 | Fichiers de verrouillage de malware dans $TMPDIR (noms issus de la liste IOC) | Sentinelle Mini Shai-Hulud |
| 5 | Scripts preinstall dans package.json faisant référence à des noms de fichiers dropper | Point d'entrée générique du ver de chaîne d'approvisionnement |
| 6 | Commits rédigés par IA touchant .github/workflows/ (filtre par liste blanche d'emails) | Falsification CI par identité d'agent IA compromise |
| 7 | Fichiers de configuration .gemini/ avec motifs de métacaractères shell | Gemini CLI CVSS 10.0 RCE (avant v0.39.1) |
| 8 | Configurations Cursor AGENTS.md et .cursor/ faisant référence à des hooks git / dépôts nus | Cursor CVE-2026-26268 |
| 9 | Hooks Git post-checkout / post-merge / post-rewrite / pre-commit contenant des primitives de récupération et exécution, plus core.hooksPath redirigé en dehors de la liste blanche autorisée | Primitive d'exécution CVE-2026-26268 + détournement générique de hooks |
| 10 | Paquets node_modules installés globalement et localement recoupés avec la liste IOC | Ensemble SAP CAP de Mini Shai-Hulud, DPRK PromptMink, futurs paquets malveillants |
| 11 | Dépôts distants Git correspondant aux noms de dépôts d'exfiltration de ver connus (Shai-Hulud, A Mini Shai-Hulud has Appeared) | Signal de compromission confirmée |
.git est un fichier (contenant gitdir: ...), le répertoire git réel est résolu avant l'inspection.| Type | Utilisé par | Exemple |
|---|
FILENAME | Motif §5 preinstall | setup.mjs |
LOCKFILE | Analyse §4 des fichiers de verrouillage | tmp.987654321.lock |
NPM | Analyse §10 des paquets globaux et locaux | @validate-sdk/v2 |
PYPI | §10 (vérification croisée lorsqu'un scanner PyPI est ajouté) | lightning |
HOOKSTRING | Correspondance §1 du contenu du hook (actuellement codé en ligne) | SessionStart |
REPONAME | Correspondance §11 du dépôt distant git | A Mini Shai-Hulud has Appeared |
EMAILSUBSTRING | réservé pour la future correspondance IOC d'auteur de commit | — |
CONFIGPATH | liste de référence des chemins de configuration des outils agentiques | .claude/settings.json |