anwen-labs/sentinel-mcp
GitHub: anwen-labs/sentinel-mcp
一个为 MCP 服务器提供可复现、基于源码静态分析的安全评分引擎,每条发现均精确指向具体代码行。
Stars: 0 | Forks: 0
# sentinel-mcp
为 **Model Context Protocol (MCP) servers** 提供开放、可复现的安全评分 —— 这是
Sentinel MCP Scorecard 背后的引擎。每个评分都是特定 commit 下代码库的确定性函数,并且每个发现都
指向具体的代码行。*可证明,而非仅仅承诺。*
这是一个与 [`anwen-labs/sentinel`](https://github.com/anwen-labs/sentinel)
(配置错误扫描器)**独立**的工具。它**复用**了该引擎 —— 包括事实图(fact-graph)、发现(findings),
以及内容寻址的报告摘要(content-addressed report digest) —— 并在此之上添加了 MCP 特定的规则。这是对
MCP 服务器的源代码分析,与配置扫描是不同的工作,因此它存放在自己的代码库中。
## 功能说明
- 将 MCP 服务器代码库解析为标准的事实模型(`mcp-parser`):传输方式(transport)、依赖版本固定
+ 锁文件(lockfiles)、工具清单(tool inventory),以及(通过 source-flow 阶段)的污点事实(taint facts)。
- 根据跨五个加权维度的 16 条 MCP 规则(`pack-mcp-core`)对其进行评分 —— 工具描述注入(tool-description
injection)、凭证处理与窃取、网络出站(network egress) / SSRF、权限范围(permission scope)与声明
功能的一致性,以及供应链来源(supply-chain provenance) —— 并映射到 CWE、OWASP MCP Top 10、MAESTRO 和 ETDI。请参阅
[`docs/METHODOLOGY.md`](docs/METHODOLOGY.md) 了解完整的规则集、评分、评级上限和覆盖范围门控(coverage gate)。
- 应用**确定性上下文修正因子**(例如,stdio、只读、无密钥的服务器不会
被当作暴露在互联网上进行评分),并记录每一个修正因子,使得评级既精细又
可复现。
- 生成 `scores.json`(0–100 → A–F,评级上限,针对单个发现的证据),该文件驱动着公共
注册表及其可嵌入的徽章。
## 目录结构
```
crates/pack-mcp-core # rules + context modifiers + scoring + scores.json
crates/mcp-parser # MCP repo -> FactModel: structural facts + same-file source-flow taint
```
## 构建 / 测试
```
cargo test # fetches the pinned Sentinel engine (git dep) and runs the rule + parser suites
```
Sentinel 引擎是 `anwen-labs/sentinel` 上的一个**固定 git 依赖**,因此干净的检出可以
实现逐字节的复现。开放的规则 + 固定的 commit + 针对单个发现的证据是其核心意义所在:你可以
重新运行任何已发布的评分并获得相同的评级。
## 发现
顶级 MCP 服务器(按安装/下载代理排名)的首份记分卡发布在
[`FINDINGS.md`](FINDINGS.md) 中,机器可读的数据位于 [`results/`](results/) 下:
- [`results/registry.json`](results/registry.json) — 已评级的处理程序以及我们**保留(withhold)**的那些,
每一个都有具体的原因(我们不会发布无法用证据支持的评级)。
- [`results/scores.json`](results/scores.json) — 固定 commit 下每个处理程序的原始输出,包含
针对单个发现的 `file:line` 证据 —— 这是可复现性的锚点。
在前 35 名中,有 26 个可以进行静态评级(25 个 A,1 个 B);其余的均因特定原因被保留。
唯一的 B 是 `microsoft/markitdown`,它的 `convert_to_markdown(uri)` 会在
进程内获取任意的 URI —— 这就是之前被公开披露的针对它的 SSRF 漏洞 —— 现在在具名代码行被确定性地标记出来。
## 如何解读评分
[`results/scores.json`](results/scores.json) 中的每个处理程序都是一个对象。以下是
`microsoft/markitdown` 真实的(经过精简和注释的)条目:
```
{
"server": "microsoft/markitdown",
"commit": "e144e0a...", // the exact commit scored — the determinism anchor
"status": "scored", // "scored" | "insufficient_coverage" (withheld)
"grade": "B", // A–F, the headline
"composite": 94, // 0–100 weighted average across the five dimensions
"grade_caps_applied": ["high-unresolved:cap-B"], // why the letter can sit below the band
"context_modifiers": [], // deterministic severity downgrades for reachability
"dimensions": [
{ "id": "network-egress-ssrf", "weight": 20, "sub_score": 75, "findings": [
{ "rule": "MCP-SSRF-USER-CONTROLLED-URL", "severity": "High",
"evidence": { "file": "packages/markitdown-mcp/src/markitdown_mcp/__main__.py", "line": 21 } } ] },
{ "id": "supply-chain-provenance", "weight": 15, "sub_score": 90, "findings": [
{ "rule": "MCP-DEPS-UNPINNED", "severity": "Medium",
"evidence": { "file": "packages/markitdown-mcp/pyproject.toml", "line": 26 } } ] }
// the other three dimensions scored 100 with no findings
]
}
```
- **评级 (A–F) 是核心指标;** `composite` 是跨五个
[维度](docs/METHODOLOGY.md) 的 0–100 加权平均值。分数段:90–100 **A**,80–89 **B**,70–79 **C**,60–69 **D**,0–59 **F**。
- **评级上限可以将字母评级拉低到该分数段以下。** markitdown 计算结果为 94(属于 A 分数段),但带有一个
**High** 级别的发现,任何未解决的 High 级别都会把评级上限锁定在 **B** —— 在一个
High 级别的发现旁边列出“评级 A”会是不合逻辑的。(Critical 级别将上限锁定在 F;未经缓解的 shell-exec 攻击面锁定在 D。)
- **每个发现都引用了 `file:line`。** 这里 `convert_to_markdown(uri)` 在
进程内获取任意 URI(SSRF)发生在 `__main__.py:21` —— 在该 commit 下打开文件,你会确切地看到
扫描器看到的内容。*可证明,而非仅仅承诺。*
- **`context_modifiers`** 列出了每一个确定性的严重性降级 —— 例如,stdio(本地)服务器的
网络发现会被降级,因为不存在远程攻击者 —— 因此评级既精细又
可复现。
- **`status: "insufficient_coverage"`** 意味着无法在该 commit 分析工具面(tool surface),
因此评级被**保留**,而不是默认为 A。它是“尚无法评级”,而不是
不及格 —— 请参阅 [`FINDINGS.md`](FINDINGS.md) 中的保留列表了解原因。
- **复现它:** 在 `commit` 处克隆代码库,运行扫描器,你将获得相同的评级和
相同的证据指针。
## 状态
v0.1。结构化评分**和** source-flow 污点传递分析目前已实现端到端运行:SSRF(包括
封装的本地请求获取)、shell-exec、文件系统遍历和凭证窃取,并带有针对单个工具的
作用域限制和 URL/路径验证防护。污点分析目前限于同一文件内;跨文件 / 过程间分析、
Go tool 级别的污点分析以及类/注册表形式的工具结构已列入路线图(请参阅
`FINDINGS.md` 中的保留列表,了解确切尚未覆盖的内容)。
## 贡献与安全
- [`docs/METHODOLOGY.md`](docs/METHODOLOGY.md) — 代码库如何转变为评级(规则、评分、上限、覆盖范围)。
- [`CONTRIBUTING.md`](CONTRIBUTING.md) — 报告不准确的发现、请求扫描或提出规则建议。
- [`SECURITY.md`](SECURITY.md) — 如何报告扫描器中的问题,以及我们针对
关于其他项目发现(包括维护者的答辩权)的披露政策。
## 许可证
MIT — 请参阅 [`LICENSE`](LICENSE)。
标签:DLL 劫持, MCP协议, Rust, 可视化界面, 大语言模型, 安全评分, 网络流量审计, 通知系统, 错误基检测, 静态代码分析