
エージェント型AIコーディングツール向けIOCスキャナー — Mini Shai-Hulud、Gemini CLI RCE、Cursor CVE-2026-26268、DPRK PromptMinkを検出
エージェンティックAIコーディングツール向けIOCスキャナー — Mini Shai-Hulud、Gemini CLI RCE、Cursor CVE-2026-26268、DPRK PromptMinkを検出します。
エージェンティックAIコーディングアシスタント(Claude Code、Gemini CLI、Cursor)とそれらがリポジトリに取り込む依存関係の侵害を検出するキットです。フックインジェクション、RCE設定、悪意のある依存関係、gitフックのバックドア、CIワークフローの改ざんにわたる11のチェックを実施します。IOCリストは外部化されており、新しい指標を追加するためにコードの変更は不要です。
関連ブログ記事: When the Tool Fights Back.
scanner/ais.sh)11のチェックがあり、各チェックにはセクションヘッダーの下にWhat:(目的)とFix:(修復)がインラインで表示され、レポートが自己説明的になります。IOCリストはscanner/iocs.txtにあります(バージョン管理されています;IOC_FILE=/path/to/iocs.txtで上書き可能)。
| § | チェック | 対象脅威 |
|---|---|---|
| 1 | 任意のsettings.jsonにおけるClaude Code SessionStartフックインジェクション(jqベース、低誤検出) | Mini Shai-Huludの永続化 |
| 2 | setup.mjs内のBunランタイムドロッパーシグネチャ | Mini Shai-Huludのインストール段階 |
| 3 | 難読化されたexecution.jsペイロード — サイズプラス難読化シグナル(1行、base64、eval(atob(、child_process) | Mini Shai-Huludの認証情報窃取者 |
| 4 | $TMPDIR内のマルウェアロックファイル(IOCリストから取得した名前) | Mini Shai-Huludのセンチネル |
| 5 | ドロッパーファイル名を参照するpackage.jsonのpreinstallスクリプト | 汎用サプライチェーンワームのエントリポイント |
| 6 | .github/workflows/に触れるAI作成のコミット(メール許可リストフィルター) | 侵害されたAIエージェントIDによるCI改ざん |
| 7 | シェルメタ文字パターンを含む.gemini/設定ファイル | Gemini CLI CVSS 10.0 RCE(v0.39.1以前) |
| 8 | gitフック/ベアリポジトリを参照するCursorのAGENTS.mdおよび.cursor/設定 | Cursor CVE-2026-26268 |
| 9 | フェッチアンド実行プリミティブを含むGitのpost-checkout / post-merge / post-rewrite / pre-commitフック、さらに安全な許可リストの外部にリダイレクトされたcore.hooksPath | CVE-2026-26268の実行プリミティブ + 一般的なフックハイジャッキング |
| 10 | グローバルインストールおよびローカルのnode_modulesパッケージをIOCリストと相互参照 | Mini Shai-Hulud SAP CAPセット、DPRK PromptMink、将来の悪意のあるパッケージ |
| 11 | 既知のワーム流出リポジトリ名と一致するGitリモート(Shai-Hulud、A Mini Shai-Hulud has Appeared) | 侵害確定シグナル |
使用方法:
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
出力
agentic-ioc-scan-YYYYMMDD-HHMMSS.log、tee → sedでANSIストリップ)に出力されます。[CRITICAL](直ちに対処)、[WARNING](悪意の可能性あり — 確認)、[REVIEW](正当な使用の可能性あり — 確認)、[OK](クリーン)。path:line形式)。行番号を表示するセクション: §1フック、§2 Bunシグネチャ、§3難読化シグナル、§5 preinstallキー、§7 Geminiメタ文字、§8 AGENTS.md gitフック参照、§9疑わしいフックコンテンツ。.git/config行**と一致するリモートURLも報告されるため、削除が必要なエントリに直接ジャンプできます。core.hooksPathリダイレクト(§9)は、リポジトリの.git/configへの絶対パスを報告するため、再割り当ての監査が可能です。.gitがファイルの場合(gitdir: …を含む)、検査前に実際のgitディレクトリが解決されます。サンプル検出結果
[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
IOCの更新
scanner/iocs.txtを編集し、# version:ヘッダーを更新します。形式はTYPE|VALUE|NOTESです。サポートされているタイプ:
新しいIOCが出現してもコード変更は不要です — スキャナーは起動時にそれらを読み込み、バナーにロードされたバージョンを表示します。
依存関係
必須: bash、find、grep、awk、sed、git。オプション: jq(§1に推奨 — ない場合はgrepヒューリスティックにフォールバック)、npm(§10のグローバルパッケージチェックに必須;利用不可の場合はセクションが静かにスキップされます)。
scanner/pkg_version_check.sh)IOCスキャナーのコンパニオンです。影響を受けるpackage,versionペアのCSV(例: ~/Downloads/Mini Shai-Hulud - Sheet1.csvにあるMini Shai-Hulud IOCフィード — 633のnpmパッケージ/バージョンペア)を読み込み、それらが次の場所に現れるかどうかをチェックします:
package.json、package-lock.json、yarn.lock、pnpm-lock.yaml、およびインストール済みのnode_modules/<pkg>/package.jsonをスキャンします。CSVにスコープなしの名前が含まれている場合、PyPIマニフェスト(requirements.txt、poetry.lock、Pipfile.lock)もチェックされます。gh CLI経由: ロックファイルタイプ全体のコード検索、その後依存関係グラフSBOM API(/repos/{owner}/{repo}/dependency-graph/sbom)による正確なバージョン検証。重大度モデル: ロックファイル、node_modules/、またはSBOM内での正確なpkg@version一致 → [CRITICAL]。影響を受けるバージョンを含む可能性のある範囲指定子(^1.2.3、~1.2.3、>=…) → [REVIEW]。バージョン確認なしのパッケージ名一致 → [REVIEW]。出力はターミナルおよび./shai-hulud-pkg-scan-YYYYMMDD-HHMMSS.log(ANSIストリップ)にストリームされ、最後に重大度内訳のサマリーが表示されます。
使用方法:
# 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形式: col1 = パッケージ名(@scope/pkgのようなスコープ名もサポート)、col2 = 正確な影響を受けるバージョン。ヘッダー行は自動検出されスキップされます。パスはIOC_CSV=…で上書き可能。
依存関係: bash、find、grep、awk、sed。オプション: jq(node_modules/<pkg>/package.jsonの解析精度を向上)、gh(GitHubフェーズに必須 — なしまたは認証されていない場合は明確なメッセージとともにスキップ)。
既知の制限:
grepベースで、完全には解析されません — 深くネストされたり珍しい書式の場合、偽陰性を生じる可能性があります。最も価値のあるフォローアップはjqベースのロックファイル解析です。[REVIEW]にフォールバックします。claude-code-policy/)Claude Codeの予防層であり、上記の検出層を補完します。
allowManagedHooksOnly).claude/settings.jsonへの書き込みをブロックcurl、wget、bunコマンドをブロックインストール:
# 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のみ配線済み)。.claude/settings.json、.vscode/tasks.json、または.gemini/ファイルを追加するプッシュを拒否するサーバーサイドpre-receiveフック。IssueおよびPRを歓迎します — 特に新しいIOCの提出(scanner/iocs.txtに追加しバージョンヘッダーを更新)、追加のプラットフォーム固有スキャンルート、および隣接するエージェンティックツール(Continue、Cody、Codex CLI、Aider)向けの検出パターン。
MIT
| タイプ | 使用箇所 | 例 |
|---|
FILENAME | §5 preinstallパターン | setup.mjs |
LOCKFILE | §4 ロックファイルスキャン | tmp.987654321.lock |
NPM | §10 グローバル+ローカルパッケージスキャン | @validate-sdk/v2 |
PYPI | §10(PyPIスキャナーが追加されたときに相互チェック) | lightning |
HOOKSTRING | §1 フックコンテンツ一致(現在はインラインコード) | SessionStart |
REPONAME | §11 gitリモート一致 | A Mini Shai-Hulud has Appeared |
EMAILSUBSTRING | 将来のコミット作成者IOCマッチング用に予約 | — |
CONFIGPATH | エージェンティックツール設定パスの参照リスト | .claude/settings.json |