VeljkoRailsware/mcp-vet

GitHub: VeljkoRailsware/mcp-vet

mcp-vet 是一个 MCP 服务器安全审查与编排工具,在安装或运行 MCP server 前同时检查工具定义和源代码两个攻击面,给出 APPROVE/WARN/BLOCK 门控决策。

Stars: 0 | Forks: 0

# mcp-vet 🐕‍🦺 **一只在您信任 MCP (Model Context Protocol) server 之前对其进行审查的“猎犬”——并审计您已经在运行的 server——然后给出简明的 `APPROVE` / `WARN` / `BLOCK` 决定及其原因。** MCP server 以**室内拥有最高权限的进程**运行:您的 agent 将您的 token 交给它,并执行其工具所描述的任何操作。恶意的 server 不需要利用漏洞——它只需要一个具有说服力的工具*描述*,因为模型会在**任何工具被调用之前**读取并服从工具描述。这不是假设:在 2025 年 9 月,`postmark-mcp` npm 包在进行了 15 次干净的发布后,在 v1.0.16 版本中植入了一行后门代码,将每封电子邮件(密码重置、MFA 验证码、发票)密送给攻击者的域名。在大约 1,600 次安装后,它成为了[在野外发现的第一个恶意 MCP server](https://postmarkapp.com/blog/information-regarding-malicious-postmark-mcp-package)。 `mcp-vet` 是一个可移植的指令包 + scanner-orchestration 脚本,专门用于捕获此类问题。它可以在 **Claude Code, Cursor, VS Code (Copilot) 和 OpenAI Codex** 中运行——任何 agent 可以添加 MCP server 的地方。 ## 它的实际作用 给它一个 GitHub URL、一个 npm/PyPI 包、一段原始的配置片段,或者指向你现有的 MCP 配置,它就会在**恶意隐藏的两个表面**上运行一个 5 步的 pipeline: - **Tool-definition 表面** —— 你的模型吸收的 `tools/list` 描述。工具投毒、插队和跨 server 阴影的滋生地。*对源代码 scanner 不可见。* - **Source / supply-chain 表面** —— 实际的代码和依赖项。exfil endpoint、硬编码的凭据、install-hook 恶意软件和 rug-pull diff 的滋生地。*对描述 scanner 不可见。* `postmark-mcp` 证明了你需要同时检查两者:它的描述是干净的;而 exfil 只是一行**代码**。跳过一个表面,你就会漏掉一半的威胁。 当安装了真正的开源 scanner 时,它会将其分层叠加(当未安装时,会诚实地降级为静态推理——缺失的 scanner 会被报告为缺失,绝不会报告为通过): | 层级 | 工具 | 捕获内容 | |---|---|---| | Tool-definitions (主要) | [`mcp-scan`](https://github.com/snyk/agent-scan) (Invariant Labs → Snyk) | tool poisoning、注入、**rug-pull drift** (tool-def hashing) | | Tool-definitions (二次意见) | [`cisco-ai-defense/mcp-scanner`](https://github.com/cisco-ai-defense/mcp-scanner) | YARA + LLM-judge 判定 | | Source SAST | [`semgrep`](https://github.com/semgrep/semgrep) | exec / network / exfil sinks | | Secrets | [`trufflehog --only-verified`](https://github.com/trufflesecurity/trufflehog) | 实时验证的硬编码凭据 / exfil URL | | 恶意软件包 | [`guarddog`](https://github.com/DataDog/guarddog) (Datadog) | install-hooks、凭据收集 | | 依赖项 CVE | [`osv-scanner`](https://github.com/google/osv-scanner) (Google) | 已知的脆弱依赖项 | | Runtime (批准后) | [`mcp-context-protector`](https://github.com/trailofbits/mcp-context-protector) (Trail of Bits) | 首次使用信任锁定;实时捕获 drift | ## 它基于的威胁分类法 每个发现都映射到一个有名称、有记录的攻击类别(详情见 [`references/attack-taxonomy.md`](references/attack-taxonomy.md)): | 攻击 | 它是什么 | 典型判定 | |---|---|---| | **Tool poisoning** | 工具描述中隐藏的指令,模型会默默执行 | 🛑 BLOCK | | **Line jumping** | server 在任何工具调用*之前*通过描述元数据发起攻击 | 🛑 BLOCK | | **Tool / cross-server shadowing** | 一个 server 的描述劫持了*另一个受信任的* server 的行为方式 | 🛑 BLOCK | | **Rug pull / capability drift** | 受信任的 server 在安装后改变行为(`postmark-mcp` 案例) | 🛑 BLOCK | | **Supply-chain impersonation** | 听起来合法的名称,但并非由它所暗示的供应商发布 | 🛑 BLOCK | | **Token passthrough / credential theft** | 接受或窃取从未为其颁发的密钥 | 🛑 BLOCK | | **Confused deputy** | 滥用其特权地位 / 超出用户意图的 OAuth | ⚠️ WARN | | **Excessive agency** | 能力远超声明目的(“细数动词数量”) | ⚠️ WARN | | **Lethal trifecta** | 私有数据 + 不受信任的内容 + 一个信任边界内的出站通道 | ⚠️→🛑 | ## 两种模式 - **Pre-install vetting** —— 一个候选 server,在你接入凭据*之前*对它进行拦截审查。 - **Audit installed** —— 扫描你机器 MCP 配置文件中的每一个 server,并标记出已经在运行的高风险 server。 ## 示例输出 ``` 🛑 BLOCK — postmark-mcp (pre-install) Top reasons 1. Impersonation — package name claims "Postmark"; not published by Postmark. [BLOCK] 2. Exfil endpoint — every send BCC'd to phan@giftshop[.]club (added in v1.0.16). [BLOCK] 3. Rug pull — behavior added after 15 clean releases; `npx -y` auto-delivers it. [BLOCK] Scanners run: mcp-scan ✓ trufflehog ✓ [1 verified] guarddog ✓ [HIGH] · osv-scanner ✗ absent Coverage: tool-definition ✓ · source ✓ · provenance ✓ Do now • Do not install. If already installed: uninstall, then rotate the Postmark token + any creds sent in email. ``` ## 安装 克隆一次,然后将其接入你使用的任何工具中: ``` git clone https://github.com/VeljkoRailsware/mcp-vet.git cd mcp-vet ``` ### 🤖 Claude Code Skills 位于 `~/.claude/skills/`。将包复制进去(repo 根目录*就是*该 skill): ``` mkdir -p ~/.claude/skills/mcp-vet cp -R SKILL.md references scripts ~/.claude/skills/mcp-vet/ ``` 或者运行 `./install.sh`(执行相同的操作,另外提供下方的 adapters)。当你准备添加/信任一个 MCP server 时它会自动触发,或者直接调用它:`use the mcp-vet skill to check github.com/foo/bar-mcp`。 ### 🖱️ Cursor Cursor 从 `.cursor/rules/*.mdc` 加载规则。放入 adapter(针对每个项目)——它是一个 *Agent-Requested* 规则,因此当你提到添加 MCP server 时,Cursor 会自动参考它: ``` mkdir -p .cursor/rules cp adapters/cursor/mcp-vet.mdc .cursor/rules/ ``` 为了让它运行 scanner 脚本,请保持此 repo 可访问(例如克隆到你的工作区中)——该规则指向 `scripts/run_scanners.sh`。 ### 🆚 VS Code (GitHub Copilot) Copilot 从 `.github/prompts/*.prompt.md` 加载可重用的 prompt,作为 slash 命令调用: ``` mkdir -p .github/prompts cp adapters/vscode/mcp-vet.prompt.md .github/prompts/ ``` 然后在 Copilot Chat 中:**`/mcp-vet https://github.com/foo/bar-mcp`**。(Prompt 文件也适用于用户范围——参见 VS Code 的 *“Chat: prompt files”* 设置。) ### 🧑‍💻 OpenAI Codex Codex 在进行任何工作之前会读取 `AGENTS.md`——位于项目根目录,或全局位于 `~/.codex/AGENTS.md`。追加该部分: ``` # 项目范围: cat adapters/codex/mcp-vet.AGENTS.md >> AGENTS.md # 或全局(适用于每个 repo): cat adapters/codex/mcp-vet.AGENTS.md >> ~/.codex/AGENTS.md ``` ### 可选:安装 OSS scanner `mcp-vet` 没有它们也能工作(静态推理),但它们能使判定更敏锐。安装你喜欢的工具: ``` pipx install mcp-scan # primary MCP-native engine (or: uvx mcp-scan@latest) pipx install semgrep trufflehog3 guarddog brew install trufflehog osv-scanner semgrep # macOS alternatives ``` `scripts/run_scanners.sh` 会自动检测存在的工具。 ## 它如何决定(简化的审查标准) 严重性最大值优先 —— **一个 BLOCK 信号就会触发阻断**;这是一个门控,而不是求平均值。 - **BLOCK** —— 被投毒/注入/影子覆盖的工具描述 · rug-pull 或 tool-def hash 不匹配 · 验证过的密钥或硬编码的 exfil endpoint · HIGH 恶意软件包信号 · 确认的冒充行为。 - **WARN** —— 通用的 SAST/CVE 发现 · 过度的 agency · 未锁定的版本(`npx -y`, `@latest`) · 无法验证的发布者 · 可缓解的 lethal-trifecta 形态。 - **APPROVE** —— 两个表面都已覆盖且干净 · 来源已验证或可信无害 · 能力与目的相符。始终附带安全建议:**锁定版本**(消除自动更新后门)并**限制凭据范围**(消除 confused-deputy 的影响范围)。 ## 仓库布局 ``` mcp-vet/ ├── SKILL.md # Claude Code skill: routing, pipeline, gate rubric ├── references/ │ ├── attack-taxonomy.md # 9 attack classes, red-flag patterns, triage table │ ├── oss-tools.md # exact scanner invocations + exit-code → gate mapping │ └── sources.md # authority citations behind every claim ├── scripts/ │ └── run_scanners.sh # detects installed scanners, runs them, reports coverage honestly ├── adapters/ # same skill, ported to other agents │ ├── cursor/mcp-vet.mdc │ ├── vscode/mcp-vet.prompt.md │ └── codex/mcp-vet.AGENTS.md ├── evals/evals.json # test cases used to validate the skill └── install.sh ``` ## 局限性(请阅读这些) - **干净的扫描并不代表安全证明。** 描述 scanner 会漏掉源代码后门,反之亦然;`mcp-vet` 只有在*两个*表面都实际被覆盖时才给出 APPROVE,并在其中一个无法被覆盖时如实说明。 - **在注册库中列出 ≠ 安全。** 官方的 [MCP Registry](https://modelcontextprotocol.io/registry/about) 验证的是*名称所有权*(通过 GitHub OAuth / DNS TXT 进行反向 DNS),而不是无害的行为——经过验证的发布者仍然可能进行 rug-pull。 - **它是一个决策辅助工具,而不是 sandbox。** 对于批准后的保护,请将长期运行的 server 包装在 `mcp-context-protector` 中。 ## 鸣谢与来源 威胁模型综合自 [Trail of Bits](https://blog.trailofbits.com/2025/04/21/jumping-the-line-how-mcp-servers-can-attack-you-before-you-ever-use-them/) (line jumping)、[Invariant Labs](https://invariantlabs.ai/blog/mcp-security-notification-tool-poisoning-attacks) (tool poisoning / MCP-Scan)、Simon Willison (lethal trifecta)、[OWASP](https://owasp.org/www-project-mcp-top-10/) (MCP / LLM Top 10)、NSA MCP CSI、官方的 [MCP spec](https://modelcontextprotocol.io/docs/tutorials/security/security_best_practices),以及来自 [Postmark](https://postmarkapp.com/blog/information-regarding-malicious-postmark-mcp-package)、[Snyk](https://snyk.io/blog/malicious-mcp-server-on-npm-postmark-mcp-harvests-emails/) 和 [The Hacker News](https://thehackernews.com/2025/09/first-malicious-mcp-server-found.html) 的 `postmark-mcp` 事件通告。完整的引用列表见 [`references/sources.md`](references/sources.md)。 ## License MIT —— 见 [LICENSE](LICENSE)。
标签:AI安全, Chat Copilot, Cutter, DLL 劫持, DNS 反向解析, MCP协议, SOC Prime, StruQ, 大语言模型, 开发工具, 文档安全, 错误基检测, 防御加固, 静态代码分析