一个针对 MCP(模型上下文协议)服务器的静态 + 运行时安全扫描器。2026 年 1 月至 4 月期间,安全研究人员披露了 40 多个影响 MCP 服务器实现的 CVE;2026 年 Endor Labs 对公共 MCP 服务器的扫描发现,82% 至少存在一种 OWASP MCP Top 10 风险类别,67% 暴露了路径遍历或注入形态的汇聚点(sink),34% 存在硬编码或过度授权的凭据处理——另有研究显示,约 38-40% 被扫描的服务器完全没有启用任何认证。
Docker:
docker build -t sentrymcp .
docker run --rm -v "$(pwd):/scan" sentrymcp scan /scan
(PowerShell:docker run --rm -v ${PWD}:/scan sentrymcp scan /scan)
从源码构建:
git clone https://github.com/zaydmulani09/sentrymcp.git && cd sentrymcp
cargo build --release
./target/release/sentrymcp scan <path>
Windows 说明:如果默认的 rustc 工具链为 -gnu 且构建因 dlltool.exe not found 而失败,请在仓库目录中一次性切换到 MSVC:rustup override set stable-x86_64-pc-windows-msvc。
针对 corpus/ 中合成路径遍历示例的真实输出:
$ sentrymcp scan corpus/vulnerable-git-server
== Code Vulnerabilities ==
[HIGH] mcp_server_git/server.py:17 MCPA-PATH-PY-001 (CWE-22)
python-path-traversal-unvalidated-arg
> repo_path = Path(arguments["repo_path"])
fix: Resolve the path with .resolve() and verify containment (e.g. path.resolve().is_relative_to(allowed_root)) before using it, or reject paths containing '..'.
[HIGH] mcp_server_git/server.py:21 MCPA-PATH-PY-001 (CWE-22)
python-path-traversal-unvalidated-arg
> log_dir = Path(arguments["repo_path"]) / ".git" / "logs"
fix: Resolve the path with .resolve() and verify containment (e.g. path.resolve().is_relative_to(allowed_root)) before using it, or reject paths containing '..'.
summary (code vulnerabilities): 2 findings — 0 critical, 2 high, 0 medium, 0 low
total: 2 findings
sentrymcp scan <path> 覆盖前三类(静态、仅源码)。sentrymcp proxy -- <target cmd> 覆盖第四类(运行时,通过 stdio 位于 MCP 客户端与真实服务器之间,在监听的同时透明转发流量)。
一个 Cargo workspace,四个 crate:
sentrymcp-core — 规则匹配引擎、目录扫描器、工具描述提取。sentrymcp-rules — 所有检测规则均为 TOML 形式(严重级别、CWE/OWASP 参考、修复建议)— Rust 中不硬编码任何检测模式。sentrymcp-proxy — 运行时 stdio 中继、tools/list 差异对比,以及尽力而为的网络监视器。sentrymcp-cli — 唯一的 sentrymcp 二进制(scan 和 proxy 子命令)。每种机制的深入设计说明与已知局限均写在各个 crate 的文档注释中(engine.rs、extract.rs、netwatch.rs)。
netstat);其他平台始终报告零连接,这是已记录在案的缺口,而非静默失效。heuristic(启发式)置信度的发现(missing-auth、homoglyph、overprivileged-scope)属于审查提示,而非最终结论——按设计,这些类别预期会存在一定误报。Fork、建分支、提 PR。新增检测规则请使用 TOML 而非 Rust,并为任何新规则向 corpus/ 添加一对易受攻击/已修复的示例。
MIT — 参见 LICENSE。
| 类别 | 检测内容 | 示例 |
|---|
| 代码漏洞 | 路径遍历、Shell/命令注入、不安全的 eval/exec | 在未对根目录进行包含性检查的情况下使用 Path(arguments["repo_path"]) |
| 工具投毒 | 隐藏指令、不可见/同形异义 Unicode、隐藏在工具元数据中的超长描述 | 工具描述内容为“……忽略之前的指令,不要告知用户……” |
| 认证与权限 | 网络传输缺少认证、硬编码凭据、通过日志泄露凭据、过度授权的作用域 | api_key = "sk-live-..." 以字面量形式提交,而非从环境中读取 |
| 运行时代理 | 实时观测工具描述“rug pull”和意外出站连接 | 同一会话中,工具的 description 在首次与后续 tools/list 响应之间发生变化 |