
IOC-Scanner für agentische KI-Coding-Tools — erkennt Mini Shai-Hulud, Gemini CLI RCE, Cursor CVE-2026-26268 und DPRK PromptMink.
IOC-Scanner für agentische KI-Codierungswerkzeuge – erkennt Mini Shai-Hulud, Gemini-CLI-RCE, Cursor CVE-2026-26268 und DPRK PromptMink.
Ein Erkennungs-Kit für die Kompromittierung agentischer KI-Codierungsassistenten (Claude Code, Gemini CLI, Cursor) und der Abhängigkeiten, die sie in Ihre Repos ziehen. Elf Prüfungen über Hook-Injektion, RCE-Konfigurationen, bösartige Abhängigkeiten, Git-Hook-Hintertüren und CI-Workflow-Manipulation. Die IOC-Liste ist ausgelagert – das Hinzufügen neuer Indikatoren erfordert keine Codeänderungen.
Begleitender Blogbeitrag: When the Tool Fights Back.
scanner/ais.sh)Elf Prüfungen, jede mit einem Inline-What: (Zweck) und Fix: (Behebung), die unter der Abschnittsüberschrift ausgegeben werden, damit der Bericht selbsterklärend ist. Die IOC-Liste liegt in scanner/iocs.txt (versioniert; mit IOC_FILE=/path/to/iocs.txt überschreibbar).
Nutzung:
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
Ausgabe
agentic-ioc-scan-YYYYMMDD-HHMMSS.log, ANSI-bereinigt via tee → sed).[CRITICAL] (jetzt handeln), [WARNING] (wahrscheinlich bösartig – verifizieren), [REVIEW] (legitime Nutzung möglich – bestätigen), [OK] (sauber).path:line-Form). Abschnitte, die Zeilennummern ausgeben: §1 Hook, §2 Bun-Signatur, §3 Verschleierungssignal, §5 Preinstall-Schlüssel, §7 Gemini-Metazeichen, §8 Git-Hook-Referenz in AGENTS.md, §9 verdächtige Hook-Inhalte..git/config-Zeile sowie die passende Remote-URL, sodass Sie direkt zu dem Eintrag springen können, der entfernt werden muss.core.hooksPath-Umleitung (§9) meldet den absoluten Pfad zur .git/config des Repos, damit die Neuzuweisung auditierbar ist.Beispiel-Befund
[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
Aktualisieren der IOCs
Bearbeiten Sie scanner/iocs.txt und erhöhen Sie den # version:-Header. Das Format ist TYPE|VALUE|NOTES. Unterstützte Typen:
Für neue IOCs ist keine Codeänderung erforderlich – der Scanner liest sie beim Start und gibt die geladene Version im Banner aus.
Abhängigkeiten
Erforderlich: bash, find, grep, awk, sed, git. Optional: jq (bevorzugt für §1 – fällt ohne jq auf eine grep-Heuristik zurück), npm (erforderlich für den §10-Paket-Globalcheck; der Abschnitt wird bei Nichtverfügbarkeit still übersprungen).
scanner/pkg_version_check.sh)Begleitwerkzeug zum IOC-Scanner. Liest eine CSV mit betroffenen package,version-Paaren (z. B. den Mini-Shai-Hulud-IOC-Feed unter ~/Downloads/Mini Shai-Hulud - Sheet1.csv – 633 npm-Paket/Version-Paare) und prüft, ob diese in Folgendem vorkommen:
package.json, package-lock.json, yarn.lock, pnpm-lock.yaml sowie installierte node_modules/<pkg>/package.json. PyPI-Manifeste (requirements.txt, poetry.lock, Pipfile.lock) werden ebenfalls geprüft, wenn die CSV nicht-scoped Namen enthält.gh-CLI: Code-Suche über Lockfile-Typen, dann Exakt-Versionsvalidierung über die Dependency-Graph-SBOM-API (/repos/{owner}/{repo}/dependency-graph/sbom).Schweregradmodell: exakter pkg@version-Treffer in einer Lockfile, node_modules/ oder SBOM → [CRITICAL]. Bereichsangabe (^1.2.3, ~1.2.3, >=…), die die betroffene Version einschließen könnte → [REVIEW]. Paketnamen-Treffer ohne Versionsbestätigung → [REVIEW]. Ausgabe auf dem Terminal und in ./shai-hulud-pkg-scan-YYYYMMDD-HHMMSS.log (ANSI-bereinigt), mit einer Schweregrad-Zusammenfassung am Ende.
Nutzung:
# 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
CSV-Format: Spalte 1 = Paketname (scoped Namen wie @scope/pkg werden unterstützt), Spalte 2 = exakte betroffene Version. Eine Kopfzeile wird automatisch erkannt und übersprungen. Pfad mit IOC_CSV=… überschreiben.
Abhängigkeiten: bash, find, grep, awk, sed. Optional: jq (verbessert die Parse-Genauigkeit von node_modules/<pkg>/package.json), gh (für die GitHub-Phase erforderlich – die Phase wird bei fehlendem oder nicht authentifiziertem gh mit einer klaren Meldung übersprungen).
Bekannte Einschränkungen:
grep-basiert, nicht vollständig geparst – tief verschachtelte oder ungewöhnliche Formatierungen können zu falsch-negativen Ergebnissen führen. Der wertvollste nächste Schritt ist eine jq-basierte Lockfile-Analyse.[REVIEW] zurück.claude-code-policy/)Präventionsebene für Claude Code, die die oben genannte Erkennungsebene ergänzt.
allowManagedHooksOnly).claude/settings.jsoncurl-, wget- und bun-Befehle aus der Agent-WerkzeugnutzungInstallation:
# 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 angebunden).pre-receive-Hook, um Pushes abzulehnen, die .claude/settings.json, .vscode/tasks.json oder .gemini/-Dateien von nicht-allowlisteten Autoren hinzufügen.Issues und PRs sind willkommen – insbesondere für neue IOC-Einreichungen (in scanner/iocs.txt ergänzen und den Versions-Header erhöhen), zusätzliche plattformspezifische Scan-Roots und Erkennungsmuster für verwandte agentische Werkzeuge (Continue, Cody, Codex CLI, Aider).
MIT
| § | Prüfung | Abgedeckte Bedrohung |
|---|
| 1 | Claude-Code-SessionStart-Hook-Injektion in beliebigen settings.json (jq-basiert, niedrige Fehlalarmrate) | Mini-Shai-Hulud-Persistenz |
| 2 | Bun-Runtime-Dropper-Signaturen in setup.mjs | Mini-Shai-Hulud-Installationsphase |
| 3 | Verschleierte execution.js-Payloads – Größe plus Verschleierungssignal (einzeilig, base64, eval(atob(, child_process) | Mini-Shai-Hulud-Credential-Dieb |
| 4 | Malware-Lock-Dateien in $TMPDIR (Namen aus der IOC-Liste) | Mini-Shai-Hulud-Sentinel |
| 5 | preinstall-Skripte in package.json, die auf Dropper-Dateinamen verweisen | Generischer Einstiegspunkt für Supply-Chain-Würmer |
| 6 | KI-verfasste Commits, die .github/workflows/ betreffen (E-Mail-Allowlist-Filter) | CI-Manipulation durch kompromittierte KI-Agenten-Identität |
| 7 | .gemini/-Konfigurationsdateien mit Shell-Metazeichen-Mustern | Gemini-CLI-RCE mit CVSS 10.0 (vor v0.39.1) |
| 8 | Cursor-AGENTS.md- und .cursor/-Konfigurationen, die auf Git-Hooks / Bare-Repos verweisen | Cursor CVE-2026-26268 |
| 9 | Git-post-checkout-/post-merge-/post-rewrite-/pre-commit-Hooks mit Fetch-und-Execute-Primitiven, plus core.hooksPath, das außerhalb der sicheren Allowlist umgeleitet wird | CVE-2026-26268-Exec-Primitive + generische Hook-Übernahme |
| 10 | Global installierte und lokale node_modules-Pakete, abgeglichen gegen die IOC-Liste | Mini-Shai-Hulud-SAP-CAP-Set, DPRK PromptMink, zukünftige bösartige Pakete |
| 11 | Git-Remotes, die mit bekannten Wurm-Exfiltrations-Repo-Namen übereinstimmen (Shai-Hulud, A Mini Shai-Hulud has Appeared) | Signal für bestätigte Kompromittierung |
.git eine Datei ist (mit gitdir: …), wird das tatsächliche Git-Verzeichnis vor der Prüfung aufgelöst.| Typ | Verwendet von | Beispiel |
|---|
FILENAME | §5 Preinstall-Muster | setup.mjs |
LOCKFILE | §4 Lock-Datei-Scan | tmp.987654321.lock |
NPM | §10 globaler + lokaler Paket-Scan | @validate-sdk/v2 |
PYPI | §10 (wird abgeglichen, sobald ein PyPI-Scanner hinzugefügt wird) | lightning |
HOOKSTRING | §1 Hook-Inhaltsabgleich (derzeit inline codiert) | SessionStart |
REPONAME | §11 Git-Remote-Abgleich | A Mini Shai-Hulud has Appeared |
EMAILSUBSTRING | reserviert für zukünftigen Commit-Autor-IOC-Abgleich | — |
CONFIGPATH | Referenzliste der Konfigurationspfade agentischer Werkzeuge | .claude/settings.json |