dhawaldesai/agentic-ioc-scanner
GitHub: dhawaldesai/agentic-ioc-scanner
一个专门用于检测AI编程工具入侵迹象的IOC扫描器。
Stars: 0 | Forks: 0
# agentic-ioc-scanner
一套用于检测 AI 编程助手(Claude Code、Gemini CLI、Cursor)及其拉入代码库的依赖项是否被入侵的检测工具包。包含十一项检查,涵盖钩子注入、RCE 配置、恶意依赖、git-hook 后门和 CI 工作流篡改。IOC 列表已外部化——添加新指标无需更改代码。
配套博客文章:[当工具反击时](https://cisomandate.com/when-the-tool-fights-back-three-ways-ai-coding-assistants-have-become-an-attack-surface/)。
## 包含内容
### 1. IOC 扫描器 (`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 | `setup.mjs` 中的 Bun 运行时投放器签名 | Mini Shai-Hulud 安装阶段 |
| 3 | 混淆的 `execution.js` 载荷——大小 **加上** 混淆信号(单行、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 | 含有 shell 元字符模式的 `.gemini/` 配置文件 | 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 钩子引用、§9 可疑钩子内容。
- §11 蠕虫远程仓库发现还会报告有问题的 **`.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`。支持的类型:
| 类型 | 使用于 | 示例 |
|------|---------|---------|
| `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` | AI 代理工具配置路径参考列表 | `.claude/settings.json` |
当出现新 IOC 时无需更改代码——扫描器在启动时读取它们,并在横幅中打印加载的版本。
**依赖项**
必需:`bash`、`find`、`grep`、`awk`、`sed`、`git`。可选:`jq`(§1 优选;若缺失则回退到 grep 启发式)、`npm`(§10 全局包检查必需;若不可用则静默跳过该章节)。
### 2. 受影响包版本扫描器 (`scanner/pkg_version_check.sh`)
IOC 扫描器的配套工具。读取受影响的 `package,version` 对的 CSV(例如 `~/Downloads/Mini Shai-Hulud - Sheet1.csv` 中的 Mini Shai-Hulud IOC 数据源——633 个 npm 包/版本对)并检查它们是否出现在:
1. 用户提供的本地项目目录中——扫描 `package.json`、`package-lock.json`、`yarn.lock`、`pnpm-lock.yaml` 和已安装的 `node_modules//package.json`。当 CSV 包含非作用域名称时,也会检查 PyPI 清单(`requirements.txt`、`poetry.lock`、`Pipfile.lock`)。
2. 用户的 GitHub 仓库中——通过 `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
# 完全脚本化(env-var 覆盖)
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//package.json` 解析准确性)、`gh`(GitHub 阶段必需——若缺失或未认证则跳过该阶段并显示明确信息)。
**已知限制:**
- GitHub 代码搜索会遗漏大于 384KB 的锁文件,并且只索引默认分支——SBOM 路径是权威检查。
- GitHub 阶段受速率限制约束(认证后 10 次请求/分钟);以每 7 秒约 5 个包的速度节流,因此完整的 633 行 CSV 对 GitHub 需要约 22 分钟。请先运行本地扫描,GitHub 阶段单独运行。
- 锁文件解析基于 `grep`,并非完全解析——深度嵌套或格式异常的文件可能产生漏报。最有价值的后续工作是使用基于 jq 的锁文件解析。
- SBOM API 要求仓库的依赖图已启用并建立索引;未启用的仓库回退到 `[REVIEW]`。
### 3. Claude Code 安全策略 (`claude-code-policy/`)
Claude Code 的预防层,补充上述检测层。
- 阻止项目级钩子运行(`allowManagedHooksOnly`)
- 阻止写入 `.claude/settings.json`
- 阻止执行已知的投放器模式
- 阻止代理工具使用 `curl`、`wget` 和 `bun` 命令
**安装:**
```
# 复制托管设置(不能被项目覆盖)
cp claude-code-policy/managed-settings.json ~/.claude/managed-settings.json
# 复制 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
```
## 路线图 / 已知缺口
- 等同于 §10 的 PyPI 全局扫描(目前仅集成了 `npm ls -g`)。
- 服务器端 `pre-receive` 钩子,用于拒绝添加来自非白名单作者的 `.claude/settings.json`、`.vscode/tasks.json` 或 `.gemini/` 文件的推送。
- 可选与 GitHub 推送保护 / 高级安全集成。
## 参考资料
- [当工具反击时](https://cisomandate.com/when-the-tool-fights-back-three-ways-ai-coding-assistants-have-become-an-attack-surface/) — 配套分析
- [Sophos: SAP npm 包上的 Mini Shai-Hulud 供应链攻击](https://www.sophos.com/en-us/blog/-mini-shai-hulud-supply-chain-attack-targets-sap-npm-packages)
- [Mend.io: Shai-Hulud 袭击 SAP — 供应链蠕虫将 Claude Code 武器化](https://www.mend.io/blog/shai-hulud-sap-cap-supply-chain-attack-claude-code/)
- [Wiz: SAP npm 上的 Mini Shai-Hulud 供应链](https://www.wiz.io/blog/mini-shai-hulud-supply-chain-sap-npm)
- [Novee Security: Google Gemini CLI RCE — CVSS 10.0 公告](https://novee.security/blog/google-gemini-cli-rce-vulnerability-cvss-10-critical-security-advisory/)
- [The Hacker News: Google 修复 CVSS 10 Gemini CLI CI/CD RCE(也涵盖 Cursor CVE-2026-26268)](https://thehackernews.com/2026/04/google-fixes-cvss-10-gemini-cli-ci-rce.html)
- [ReversingLabs: PromptMink — 通过 Claude 插入代码库的朝鲜恶意软件](https://www.reversinglabs.com/blog/claude-promptmink-malware-crypto)
- [Endor Labs: Mini Shai-Hulud 卷土重来 — 42 个带有伪造 Sigstore 徽章的恶意 npm 包针对 @antv 生态系统](https://www.endorlabs.com/learn/mini-shai-hulud-returns-42-malicious-npm-packages-fake-sigstore-badges-in-antv-ecosystem-attack)
## 贡献
欢迎提交 Issue 和 PR — 尤其是新的 IOC 提交(添加到 `scanner/iocs.txt` 并更新版本标题)、额外的平台特定扫描根目录,以及针对相邻 AI 代理工具(Continue、Cody、Codex CLI、Aider)的检测模式。
## 许可证
MIT
标签:应用安全, 暗色界面, 网络安全研究, 逆向工具