用于自主式 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工作流篡改。IOC列表外部化——添加新指标无需修改代码。
配套博客文章:When the Tool Fights Back。
scanner/ais.sh)十一个检查项,每个检查项下方均内嵌 What:(目的)和 Fix:(修复措施),使得报告自说明。IOC列表存储在 scanner/iocs.txt 中(受版本控制;可通过 IOC_FILE=/path/to/iocs.txt 覆盖)。
| § | 检查项 | 所覆盖威胁 |
|---|---|---|
| 1 | Claude Code SessionStart 钩子注入(任何 settings.json 中,基于 jq,低误报率) | Mini Shai-Hulud 持久化 |
| 2 | Bun运行时的投放器签名(setup.mjs) | Mini Shai-Hulud 安装阶段 |
| 3 | 混淆后的 execution.js payload——大小 加上 混淆信号(单行、base64、eval(atob(、child_process) | Mini Shai-Hulud 凭证窃取器 |
| 4 | $TMPDIR 中的恶意软件锁文件(名称来源于 IOC 列表) | Mini Shai-Hulud 哨兵 |
| 5 | package.json 中引用投放器文件名的 preinstall 脚本 | 通用供应链蠕虫入口点 |
| 6 | AI 作者提交(修改 .github/workflows/,经电子邮件白名单过滤) | 被入侵AI代理身份导致的CI篡改 |
| 7 | .gemini/ 配置文件中包含 shell 元字符模式 | Gemini CLI CVSS 10.0 RCE(v0.39.1 之前) |
| 8 | Cursor 的 AGENTS.md 和 .cursor/ 配置引用 git 钩子 / 裸仓库 | 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
# 根据提示输入项目文件夹路径
# 自定义 IOC 列表:
IOC_FILE=./my-iocs.txt bash scanner/ais.sh
# 自定义报告路径(默认为 ./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-hook 引用、§9 可疑钩子内容。.git/config 行 以及匹配的远程 URL,以便直接跳转到需要删除的条目。core.hooksPath 重定向(§9)报告仓库的 .git/config 绝对路径,使重新分配可审计。.git 是一个文件(包含 gitdir: …)时,会在检查前解析出实际的 git 目录。示例发现
[CRITICAL] 仓库指向已知蠕虫外泄名称
仓库: /home/dev/projects/myrepo
配置: /home/dev/projects/myrepo/.git/config:9
URL: https://github.com/dhawaldesai/A-Mini-Shai-Hulud-has-Appeared
[CRITICAL] 恶意钩子: /home/dev/projects/myrepo/.claude/settings.json:3
[CRITICAL] 可疑 git post-checkout 钩子: /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(例如 Mini Shai-Hulud IOC 源文件 ~/Downloads/Mini Shai-Hulud - Sheet1.csv——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 转义码),末尾附带严重性分类摘要。
用法:
# 交互式——提示输入项目目录
bash scanner/pkg_version_check.sh
# 完全脚本化(环境变量覆盖)
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 格式: 第1列 = 包名(支持作用域名称如 @scope/pkg),第2列 = 精确受影响版本。自动检测并跳过表头行。通过 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.jsoncurl、wget 和 bun 命令安装:
# 复制托管设置(项目无法覆盖)
cp claude-code-policy/managed-settings.json ~/.claude/managed-settings.json
# 复制 PreToolUse 钩子
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 钩子,拒绝从非白名单作者推送添加 .claude/settings.json、.vscode/tasks.json 或 .gemini/ 文件。欢迎提交 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 |