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, 可视化界面, 大语言模型, 安全评分, 网络流量审计, 通知系统, 错误基检测, 静态代码分析