
mcp-server-attestation v0.2.0
面向MCP服务器的第二层供应链加固 — Ed25519签名的工具清单、运行时进程派生证明、默认拒绝的参数清理器。防御市场投毒攻击 + CVE-2025-69256 + CVE-2025-61591。
StudioMeyer MCP Stack 的一部分 — 在 Mallorca 构建 🌴 · 如果使用请 ⭐
mcp-server-attestation
Layer-2 供应链加固,用于 Model Context Protocol 服务器。Ed25519 签名的工具清单、运行时 spawn 认证、默认拒绝参数清理器。直接回应:
- OX Security 市场投毒,2026 年 4 月 — 11 个 MCP 注册中心中有 9 个接受了恶意服务器。Anthropic 的公开立场:“预期行为”。
- CVE-2025-69256 — 通过
child_process.exec()命令注入的 Serverless Framework MCP 远程代码执行。 - CVE-2025-61591 — 通过 OAuth 安装的恶意服务器进行 spawn 劫持的 Cursor MCP 远程代码执行。
此包提供了 Anthropic 选择不提供的内容:对服务器允许暴露哪些工具以及允许进行哪些 spawn 调用的密码学验证。它是一个即插即用的依赖,而不是运行时的替代品。
来自我们的说明
在过去两年里,我们一直在为自己构建工具和系统。这个仓库很小且星标很少,并不是因为它很新。而是因为我们才刚刚决定分享我们构建的东西。这不是一个全新的实验,这是一个有着最近提交的长久故事。
我们喜欢构建和分享东西。我们不喜欢社交媒体策略、增长黑客或追逐星标和关注者。所以这个仓库很小。代码是真实的,正在被使用,问题会得到回复。请自行判断。
如果对你有帮助,分享、测试和反馈对我们有帮助。如果可以更好,提一个 issue 更有用。如果你用它构建了什么东西,请告诉 [email protected]。这真的会让我们开心。
来自马略卡岛帕尔马的一个小工作室。
包(npm workspaces)
| Package | 用途 |
|---|---|
mcp-server-attestation (packages/lib) | 库:Ed25519 签名/验证、清单模式、清理器、spawn 认证、TOFU 信任存储。 |
mcp-attest-cli (packages/cli) | CLI mcp-attest:keygen、sign、verify、inspect、fingerprint、check-pin。 |
mcp-attest-demo (packages/demo-server) | 参考 MCP 服务器(stdio,规范 2025-06-18),暴露了 5 个演示该库的工具。 |
安装
npm install mcp-server-attestation
# CLI:
npm install -g mcp-attest-cli
# Reference MCP server:
npx mcp-attest-demo
Node 20+。无外部加密依赖——使用 node:crypto Ed25519 原语。
五行服务器快速入门
import { verifyManifestStrict, attestSpawnStrict, type SignedManifest } from "mcp-server-attestation";
import signed from "./signed/manifest.json" assert { type: "json" };
// 1. At startup: prove the manifest you ship is the manifest you signed.
verifyManifestStrict(signed);
// 2. Before every child_process.spawn:
attestSpawnStrict(signed as SignedManifest, { command, args });
这就是整个集成。两个函数调用,无需 SaaS,无需守护进程。
如果你更愿意在每次 spawn 时重新验证签名(防御深度,防止未经验证或已交换的清单到达网关),请改用单个故障安全调用——它先验证再认证:
import { attestSpawnVerified, type SignedManifest } from "mcp-server-attestation";
attestSpawnVerified(signed as SignedManifest, { command, args });
工具(参考服务器 mcp-attest-demo)
| # | 名称 | 只读提示 | 破坏性提示 |
|---|---|---|---|
| 1 | attest_verify_manifest | true | false |
| 2 | attest_inspect_spawn | true | false |
| 3 | attest_generate_manifest_template | true | false |
| 4 | attest_sign_manifest | false | false |
| 5 | attest_keygen | false | false |
注释是诚实的:attest_sign_manifest 和 attest_keygen 在磁盘上写入文件,因此不是只读的,但不会销毁现有数据,因此 destructiveHint 保持为 false。有关每个工具的能力表,请参阅 docs/THREAT-MODEL.md。
CLI
mcp-attest keygen --out-dir ./keys --name prod
mcp-attest sign --manifest manifest.json --private-key keys/prod.key --out signed.json
mcp-attest verify --signed signed.json --pin # TOFU pin
mcp-attest verify --signed signed.json --sigstore # opt-in Rekor cross-ref
mcp-attest inspect --signed signed.json --command /usr/bin/echo --arg "hello"
mcp-attest fingerprint --public-key keys/prod.pub
mcp-attest check-pin --server my-server --signed signed.json
verify 在签名错误时退出代码 2,在引脚不匹配时退出代码 3。
MCP 规范兼容性
| 规范版本 | 状态 |
|---|---|
| 2024-11-05 | 可在清单中解析,不是参考服务器的目标 |
| 2025-03-26 | 可在清单中解析,不是参考服务器的目标 |
| 2025-06-18 | 完全目标 |
该库与传输无关。参考服务器仅支持 stdio。
安全模型
- 首次使用即信任是默认行为。第一次验证服务器时,其公钥会被固定到
~/.mcp-attest/trust.json(可通过MCP_ATTEST_TRUST_FILE覆盖)。后续验证将拒绝同一服务器名称的任何新密钥,错误为TRUST_PIN_MISMATCH。这可以捕捉 Cursor 风格的恶意更新向量。 - 没有捆绑的受信任密钥列表。 此包不充当看门人。如果你想要更强的保证,可以选择
--sigstore将公钥指纹与 Sigstore Rekor 透明度日志进行交叉引用。 - 默认拒绝参数清理器。
shellSafeString会阻止每个 ASCII shell 元字符、NUL、CR、LF、VT、FF、NEL、零宽度字符、BOM、RTL/LTR 覆盖符、Trojan-Source 隔离符和全角拉丁语易混淆字符。白名单行为需要显式的regex/enum/prefix/literal规则类型。 - ReDoS 安全的
regex规则。 一个regex规则的模式由作者签名,但参数值由攻击者控制。清理器会静态检测容易导致回溯的模式(如嵌套的无界量词(a+)+)并拒绝运行它们,因此单个精心构造的参数不会冻结 spawn 热路径。regex规则还带有一个输入长度上限(默认 4096)。 - 遍历安全的
prefix规则。prefix规则默认拒绝..路径组件(denyTraversal: true,包括%2e%2e编码形式),因此即使满足prefix: "/safe/",/safe/../../etc/passwd也会被阻止。 - 先验证再认证。
attestSpawnVerified在认证 spawn 之前检查清单签名,使用一个故障安全调用——除非你已测量过每个 spawn 的 Ed25519 验证在真正的热循环之外,否则请使用它而不是attestSpawnStrict。 - 规范 JSON 是签名的表面。重新序列化不能改变已签名的字节。
此包不做什么(不在范围内):
- 不对服务器进程进行沙箱或容器化。
- OAuth 流程加固(单独的
mcp-oauth-shield构建)。 - 网络出口控制。
- 自动修补现有服务器。
测试
npm install
npm run typecheck
npm test
测试语料包括 CVE 重放固定数据(packages/lib/tests/fixtures/cve-2025-69256-payloads.json、cve-2025-61591-payloads.json)。构建是一个回归检查:每个有效负载都必须被阻止。
分发
- 通过 GitHub Actions OIDC 进行 npm 发布,并带有
--provenance。 - 参考服务器已提交到 mcp.so 和 FastMCP 目录。
- 库以
mcp-server-attestation单独发布。
关于 StudioMeyer
StudioMeyer 是一家位于马略卡岛帕尔马的人工智能与设计工作室,与全球客户合作。我们为中小企业构建定制网站和 AI 基础设施。生产栈使用 Claude Agent SDK、MCP 和 n8n,并结合 Sentry、Langfuse 和 LangGraph 进行可观测性,以及内部防护层。
许可证
MIT,版权 2026 Matthias Meyer (StudioMeyer)。参见 LICENSE。