tamish560/mcprobe

GitHub: tamish560/mcprobe

mcprobe 是一款 MCP 服务器安全扫描与内省工具,用于在接入 AI agent 前检测 prompt injection、tool shadowing、路径穿越等风险,并通过基线对比发现 rug-pull 式功能篡改。

Stars: 2 | Forks: 0

# mcprobe 用于 MCP (Model Context Protocol) 服务器的安全扫描和内省工具。 连接到任何 MCP 服务器,内省其 tools/prompts/resources,检测工具描述中的 prompt injection 模式,发现跨服务器的 tool shadowing,并进行基线建立以用于漂移检测(rug-pull 攻击)。 单一二进制文件。零依赖。仅使用 Go stdlib。 ## 为什么需要 MCP 服务器让 AI agent 可以访问你的文件系统、shell、数据库和 API。恶意或被攻破的服务器可以在工具描述中嵌入 prompt injection,shadow 合法工具,或者在你信任它后静默更改其功能。mcprobe 可以捕获这些行为。 学术研究(DSN 2026)在 MCP 注册表中发现 833 个易受攻击的服务器,以及 18 个带有旨在操纵 LLM 行为的可疑工具描述的服务器。几乎没有人执行集成前的安全检查。mcprobe 解决了这个问题。 ## 安装 ``` go install github.com/tamish560/mcprobe@latest ``` 或者从源码构建: ``` git clone https://github.com/tamish560/mcprobe.git cd mcprobe go build -o mcprobe ``` ## 快速开始 扫描 stdio MCP 服务器: ``` mcprobe -command 'node server.js' ``` 扫描 HTTP MCP 服务器: ``` mcprobe -http http://localhost:3000/mcp ``` 列出工具而不进行安全扫描: ``` mcprobe -command 'node server.js' -list ``` ## 基线与漂移检测 保存服务器功能的基线快照: ``` mcprobe -command 'node server.js' -baseline server-baseline.json ``` 根据基线检查是否存在漂移(rug-pull 攻击): ``` mcprobe -command 'node server.js' -diff server-baseline.json ``` 这可以检测: - 工具描述已更改(潜在的 rug-pull) - 工具被添加或删除 - schema 被修改 - resources 被添加或删除 - 服务器版本更改 ## Tool Shadowing 检测 当多个 MCP 服务器连接到同一个 agent 时,恶意服务器可以定义与合法工具同名的工具。为每个服务器保存基线,然后进行检查: ``` mcprobe -shadow -shadow-dir ./baselines/ ``` ## CI 集成 将 SARIF 输出用于 GitHub Actions、GitLab CI 或任何兼容 SARIF 的扫描器: ``` mcprobe -command 'node server.js' -format sarif -out results.sarif ``` 退出代码: - 0:扫描完成,没有高/严重级别的发现 - 1:错误 - 2:扫描完成,检测到高级别或严重级别的发现 ## 检测内容 ### Prompt Injection (严重) 根据 18 种 injection 模式扫描工具描述、prompt 描述和 schema 属性描述: - “忽略之前所有的指令” - “你现在是一个……” - “表现得像……” - “执行任意命令” - “读取任何文件/env/secret” - “rm -rf”, “curl | bash” - “窃取数据/secrets/keys” - “禁用/绕过安全防护” - “base64 decode” - “覆盖安全/策略/guardrail” - 等等 ### Tool Shadowing (高/严重) 当两个或多个 MCP 服务器定义了同名的工具时,LLM 无法区分该调用哪个服务器。恶意服务器可以利用这一点来拦截本意是发给合法服务器的工具调用。 ### Path Traversal (高) 包含 `..` 序列的 Resource URI 可能允许读取预期目录之外的文件。 ### 缺少 Metadata (LOW) 没有描述或 input schema 的工具更难审计,可能表明是仓促编写的或恶意代码。 ### 超大描述 (MEDIUM) 超过 2000 个字符的工具描述可能隐藏了嵌入的指令。 ### Rug-Pull 检测 (CRITICAL) 当工具的描述在基线和当前扫描之间发生变化时,可能是服务器已被攻破,从而向 LLM 的 context 中注入了新的指令。 ## 输出格式 - `text` (默认): 具有风险评分的人类可读报告 - `json`: 完整的结构化扫描结果 - `sarif`: 用于 CI 集成的 SARIF 2.1.0 ## 风险评分 | 分数 | 级别 | |-------|-------| | 0-9 | MINIMAL | | 10-24 | LOW | | 25-49 | MEDIUM | | 50-74 | HIGH | | 75-100 | CRITICAL | ## 架构 ``` transport.go MCP client transport (stdio + HTTP) client.go JSON-RPC client, server introspection scanner.go Security analysis engine, pattern detection, shadowing baseline.go Snapshot persistence, drift detection report.go Text, JSON, SARIF output renderers main.go CLI entry point, flag parsing ``` 没有外部依赖。纯 Go 标准库。构建为单一静态二进制文件。 ## 许可证 MIT
标签:LNA, 日志审计