关于 Server Attestation
Server Attestation 是面向开发者的 Node.js 库及参考 MCP 服务,用于限制 MCP 服务可公开的工具和可启动的进程。它通过签名清单、进程启动校验和默认拒绝的参数检查实现防护。
主要功能
- 01Ed25519 清单签名与验证
- 02运行时进程启动证明
- 03默认拒绝的参数清理器
- 04首次使用信任密钥固定
- 05用于密钥和清单操作的 CLI
适用场景
- 01在启动时验证服务工具清单
- 02限制子进程命令及参数
- 03在后续校验中发现密钥变更
MCP 相关
参考 MCP 服务提供五种工具,用于清单验证、进程启动检查、模板生成、签名和密钥生成。该库可集成到 MCP 服务中,验证获准工具及进程启动。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
5收录的工具列表 · 更新于 3 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| manifestPath | string | 是 | 已签名 manifest JSON 文件的路径。 |
| publicKeyPath | string | 是 | 十六进制编码公钥的路径(说明性参数;若 manifest 自带 publicKey 字段,则忽略)。 |
详细介绍
StudioMeyer MCP Stack 的一部分 — 源自马略卡 🌴 · 如果你在使用,请给个 ⭐
mcp-server-attestation
为 Model Context Protocol 服务提供第二层供应链加固。采用 Ed25519 签名的工具清单、运行时启动证明,以及默认拒绝的参数清理器。
直接回应以下事件:
- OX Security 市场投毒事件,2026 年 4 月 — 11 个 MCP 注册表中有 9 个接受了恶意服务。Anthropic 公布的立场是:“预期行为”。
- CVE-2025-69256 — Serverless Framework MCP 通过
child_process.exec()命令注入导致远程代码执行。 - CVE-2025-61591 — Cursor MCP 因通过 OAuth 安装的恶意服务劫持进程启动而导致远程代码执行。
此软件包提供了 Anthropic 选择不提供的功能:以密码学方式验证服务获准公开哪些工具,以及获准执行哪些启动调用。它是一个即插即用的依赖项,不会替换运行时。
我们的一点说明
过去两年,我们一直在为自己构建工具和系统。这个仓库规模小、星标少,并不是因为它刚刚诞生,而是因为我们直到最近才决定分享自己的成果。这不是一个全新的实验,而是一段漫长历程最近的一次提交。
我们热爱构建和分享,不喜欢社交媒体策略、增长技巧,也不热衷于追逐星标和关注者。因此,这个仓库规模不大。代码是真实的,也确实在使用,问题也会得到答复。欢迎自行判断。
如果它对你有帮助,分享、测试和反馈都能帮到我们。如果你觉得有改进空间,提交问题会更有用。如果你用它构建了什么,请发邮件告诉我们:[email protected]。这真的会让我们开心一整天。
来自马略卡岛帕尔马的一间小型工作室。
软件包(npm 工作区)
| 软件包 | 用途 |
|---|---|
mcp-server-attestation(packages/lib) | 库:Ed25519 签名与验证、清单架构、参数清理器、启动证明器、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,也无需守护进程。
如果你更希望在每次启动时重新验证签名(纵深防御,防止未经验证或被替换的清单进入验证关卡),请改用这个单一的故障安全调用——它会先验证,再进行证明:
import { attestSpawnVerified, type SignedManifest } from "mcp-server-attestation";
attestSpawnVerified(signed as SignedManifest, { command, args });
工具(参考服务 mcp-attest-demo)
| # | 名称 | readOnlyHint | destructiveHint |
|---|---|---|---|
| 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规则还设有maxLength输入长度上限(默认为 4096)。 - 可防目录遍历的
prefix规则。prefix规则默认拒绝..路径组件(denyTraversal: true,包括%2e%2e编码形式),因此即使/safe/../../etc/passwd符合prefix: "/safe/",也会被拦截。 - 先验证,再证明。
attestSpawnVerified会在一次故障安全调用中先检查清单签名,再证明 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 使用
--provenance发布到 npm。 - 已向 mcp.so 和 FastMCP Directory 提交参考服务。
- 该库另行发布为
mcp-server-attestation。
关于 StudioMeyer
StudioMeyer 是一家位于马略卡岛帕尔马、服务全球客户的 AI 与设计工作室。我们为中小型企业打造定制网站和 AI 基础设施。生产技术栈基于 Claude Agent SDK、MCP 和 n8n,并使用 Sentry、Langfuse 和 LangGraph 进行可观测性管理,同时配备自研防护层。
许可证
MIT,版权所有 © 2026 Matthias Meyer(StudioMeyer)。详见 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。