扫描仓库中的 AI-IDE 配置文件,这些文件可能在 Claude Code、Cursor、Windsurf、Continue 或任何 VS Code 分支中打开仓库时触发 RCE、凭据窃取或开发者机器的持久化攻击。
响应于 2026 年 4 月 AI-IDE 披露浪潮而构建:
settings.json 中的 SessionStart / PreToolUse / PostToolUse / UserPromptSubmit 钩子在打开工作区时执行任意 shell 命令。.cursorrules / .windsurfrules / .github/copilot-instructions.md / .continue/*.md 中的 Unicode 走私指令,可隐藏攻击者指令,使人类审查者难以察觉。ANTHROPIC_BASE_URL / OPENAI_BASE_URL / OPENAI_API_BASE 重定向到攻击者控制的端点(导致提示和 API 密钥泄露)。mcp.json / .mcp.json / .cursor/mcp.json / .claude/mcp.json 自动注册 MCP 服务器,携带任意 command stdio 调用。.vscode/tasks.json 在打开工作区时自动运行。在克隆每个第三方仓库后,打开 AI 编辑器之前,请对其运行此工具。
无需安装——使用 npx:
npx valtik-ai-ide-config-guard <path>
或全局安装:
npm i -g valtik-ai-ide-config-guard
ai-ide-config-guard <path>
需要 Node 20+。
$ npx valtik-ai-ide-config-guard ./my-cloned-repo
带失败阈值(用于 CI):
$ npx valtik-ai-ide-config-guard . --fail-on high
JSON 输出:
$ npx valtik-ai-ide-config-guard . --json > report.json
SARIF 2.1.0(用于 GitHub 代码扫描):
$ npx valtik-ai-ide-config-guard . --sarif > report.sarif
运行部分检查:
$ npx valtik-ai-ide-config-guard . --checks G1,G3,G5
完整标志列表:npx valtik-ai-ide-config-guard --help。
查找 .claude/settings.json 并解析 hooks.SessionStart / hooks.PostToolUse / hooks.PreToolUse / hooks.UserPromptSubmit(及相关的生命周期事件)。如果任何条目设置了 command 字符串(或分组语法中的 type: "command"),则结果为 CRITICAL——在 Claude Code 中打开仓库将执行该命令,且以开发者的 shell、环境、SSH 密钥和令牌运行。
扫描 .cursorrules、.cursor/rules/*.md[c]、.windsurfrules、.windsurf/rules/*.md[c]、.github/copilot-instructions.md、.continue/*.md 中的:
ignore previous、from now on、system: 等)纯西里尔文文本、表情符号和文件开头的 BOM 会被忽略——我们只标记那些对人类审查者隐藏内容的字符。
解析 mcp.json、.mcp.json、.claude/mcp.json、.cursor/mcp.json、.windsurf/mcp.json、.vscode/mcp.json、.continue/config.json。对每个注册的服务器:
command 匹配 src/fixtures/known-malicious-mcp.json → CRITICALcommand 是本地二进制文件 → HIGHcommand 是 npx / uvx / pipx 拉取未验证的包 → MEDIUMurl 不是 https → MEDIUMurl 指向 localhost / LAN → MEDIUM标记任何具有 runOptions.runOn: "folderOpen" 的任务。如果命令使用 shell 插值(curl | sh、wget | bash、eval、base64 -d、反引号、$(...))或引用了外部 URL,则严重性升级。
扫描 .env*、.claude/settings.json、.cursor/config.json、.vscode/settings.json 以及任何 mcp.json 中的:
ANTHROPIC_BASE_URL、ANTHROPIC_API_URLOPENAI_BASE_URL、OPENAI_API_BASE、OPENAI_API_URL如果主机不是规范的供应商端点(api.anthropic.com / api.openai.com),则结果为 CRITICAL——每个请求和 API 密钥都会发送到攻击者的端点。非云主机(localhost、LAN IP)标记为 HIGH。
标记那些自带 security.workspace.trust.enabled: false(或 Cursor 中的对应配置)的 .vscode/settings.json 文件,这会静默退出本机阻止自动运行行为的门控。
在规则 .md / .mdc 文件中,扫描围栏代码块中是否包含 curl | sh、wget | bash、rm -rf、eval、base64 -d、python -c、/dev/tcp、反向 shell mkfifo、chmod +x。如果周围文本是命令式的(“运行此命令”、“执行以下命令”),则严重性升级。
对于名为 claude*、cursor*、windsurf*、mcp*、continue*、copilot*、aider*、cline* 的脚本,标记为信息性。如果同一名称与 npm 生命周期钩子(preinstall、postinstall 等)冲突,则标记为 HIGH——生命周期钩子在执行 npm install 时无需用户确认即可运行。
GitHub Actions:
- name: AI-IDE config guard
run: npx valtik-ai-ide-config-guard . --fail-on high
或 SARIF 上传:
- run: npx valtik-ai-ide-config-guard . --sarif > ai-ide.sarif
- uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: ai-ide.sarif
test/fixtures/safe/ 零误报是设计目标——我们宁可漏掉边界情况,也不想让用户学会忽略我们。npx 预运行,不获取 URL)。此工具是静态分析。干净的报告意味着“此版本附带的 8 项检查未触发”,而非“该仓库打开到 AI-IDE 中安全”。请将每个非您自己的仓库视为恶意,并手动应用工作区信任、钩子审查和 MCP 审查。
MIT 许可证 — 版权所有 (c) 2026 Valtik Studios LLC。
| ID | 严重性 | 检测内容 |
|---|
| G1 | CRITICAL | Claude Code 钩子,在会话/工具使用事件时运行 shell |
| G2 | HIGH / MEDIUM | 规则文件中的双向/零宽度/标记字符、同形异义词或角色覆盖模式 |
| G3 | CRITICAL / HIGH / MEDIUM | 注册了具有危险 command 或 url 的 MCP 服务器 |
| G4 | HIGH / MEDIUM | .vscode/tasks.json 包含 runOn: folderOpen |
| G5 | CRITICAL / HIGH | ANTHROPIC_BASE_URL / OPENAI_BASE_URL / OPENAI_API_BASE 被重定向 |
| G6 | HIGH / INFO | 工作区信任已禁用,task.autoDetect: on |
| G7 | HIGH / MEDIUM | 规则 markdown 中围栏代码块内的危险 shell 模式 |
| G8 | HIGH / INFO | package.json 中脚本名称以 AI 代理命名(或代理名称出现在安装钩子中) |