vaultmcp/vault

GitHub: vaultmcp/vault

Vault 是一个 MCP prompt 注入防火墙代理,在 AI agent 读取工具响应前进行三层安全扫描以拦截恶意指令注入。

Stars: 114 | Forks: 17

# Vault — MCP Prompt 注入防火墙 Vault 是一个用于 MCP 的生产级 prompt 注入防火墙。它会在你的 agent 读取每个工具响应之前对其进行拦截,并通过三层检测进行扫描。 ## 要求 Vault 在生产环境中的 Layer 3 需要 LLM。有三个选项: - **Anthropic** (`claude-haiku-4-5-20251001`,推荐) — 设置 `ANTHROPIC_API_KEY` - **OpenAI-compatible** (`gpt-4o-mini`,或通过 vLLM/llama.cpp 自托管) — 设置 `OPENAI_API_KEY` - **Ollama** (本地,气隙隔离) — 设置 `OLLAMA_HOST=http://localhost:11434` 如果没有上述任何配置,Vault 将以离线模式运行(仅包含 L1+L2)。离线模式存在已知的局限性 — 详见 [局限性 §11](packages/LIMITATIONS.md)。 ### 使用 Ollama 进行离线运行 Ollama 允许你在本地运行 L3,无需依赖云端 — 这对于气隙隔离环境、无 API key 开发以及对成本敏感的 pipeline 非常有用。 ``` # 安装 Ollama 并拉取模型(一次性) curl -fsSL https://ollama.ai/install.sh | sh ollama pull llama3.2:3b # 使用 Ollama 作为 L3 后端运行 Vault export OLLAMA_HOST=http://localhost:11434 npx @aimcpvault/mcp-proxy -- npx -y @modelcontextprotocol/server-filesystem /data ``` 要使用不同的模型或远程 Ollama 实例: ``` export VAULT_LAYER3_PROVIDER=ollama export VAULT_LAYER3_MODEL=mistral:7b export VAULT_LAYER3_BASE_URL=http://gpu-box:11434 ``` **注意事项:** - 本 README 中测量出的 TPR 数据是基于 Anthropic Haiku 的。本地 3B 模型差异很大;在生产环境中依赖它们之前,请先运行评估工具。根据经验,在冒烟测试中,`llama3.2:3b` 漏掉了隐蔽的 role-hijack 和 multi-turn-setup 攻击,而 Haiku 则能捕捉到这些攻击。 - 可达性是在首次扫描时验证的,而不是在启动时。如果 Ollama 未运行,Vault 会在每次请求时记录 `vault: layer-3 failed (...)` 并回退到 L1+L2。 - **延迟:** 默认的 L3 超时时间为 15 秒,旨在吸收本地 3B 模型在 CPU 上的冷启动延迟。如果你在较慢的硬件或更大的模型上运行,请通过 `VAULT_LAYER3_TIMEOUT_MS=30000` 进一步增加超时时间。Ollama 加载模型后的首次扫描时间可能比稳定状态长得多 — 后续调用通常在 1–2 秒内完成。 - **安全性:** 默认 URL 为 `http://localhost:11434`。如果你设置了 `VAULT_LAYER3_BASE_URL=http://0.0.0.0:11434` 或指向远程主机,工具响应内容(可能包含敏感数据)将通过网络发送到该主机。请仅指向受信任的本地网络 Ollama 实例。 ## 链上信誉检查器 `vault inspect` 会读取你的 Claude Desktop MCP 配置,并报告 Vault 为你配置的每个服务器积累的链上信誉。 ``` npx @aimcpvault/mcp-proxy inspect # vault inspect(3 个 MCP server) # 配置: /Users/you/Library/Application Support/Claude/claude_desktop_config.json # 网络: Sepolia (testnet) # 合约: 0x3A977E4D8BA43367cc41BB4695feFF4615fec189 # # TRUSTED filesystem [stdio:npx:@modelcontextprotocol/server-filesystem] # score=0.980 scans=412 blocks=2 maliciousRate=0.5% # NEW git [stdio:uvx:mcp-server-git] # score=1.000 scans=0 blocks=0 maliciousRate=0.0% # UNTRUSTED sketchy [stdio:npx:some-untrusted-pkg] # score=0.400 scans=83 blocks=14 maliciousRate=16.9% ``` **信任阈值(透明,无魔法数字):** - `TRUSTED` score ≥ 0.95 且 totalScans ≥ 100 - `UNTRUSTED` maliciousRate ≥ 0.10 - `CAUTION` totalScans ≥ 10 且 maliciousRate ≥ 0.01 - `NEW` totalScans < 10 **Flags:** - `--config ` 覆盖 Claude Desktop 配置路径 - `--rpc ` 和 `--contract ` 指向不同的网络/部署 - `--json` 每个服务器输出一条 JSON 记录(适用于 CI / 脚本) - `--strict` 如果有任何服务器为 UNTRUSTED 则退出码为 1 — 在 CI 检查中很有用 目前的信誉合约位于 **Base Sepolia (testnet)**。主网部署待定;在主网上线之前,检查器将继续默认使用 Sepolia,并在每次运行时打印黄色警告。 ## 本地扫描历史记录(主动启用) Vault 可以将每次扫描持久化到本地 SQLite 数据库 (`~/.vault/scans.db`) 中,以便你查看被拦截的内容、按工具/服务器/结论进行搜索,并查看本地仪表板。 **默认关闭。** 使用 `VAULT_PERSIST=1` 启用: ``` VAULT_PERSIST=1 npx @aimcpvault/mcp-proxy -- npx -y @modelcontextprotocol/server-filesystem /data # vault: 正在将扫描历史记录持久化到 /Users/you/.vault/scans.db(设置 VAULT_PERSIST=0 以禁用) ``` **从 CLI 查询:** ``` npx @aimcpvault/mcp-proxy history # last 50 npx @aimcpvault/mcp-proxy history --verdict malicious # only blocks npx @aimcpvault/mcp-proxy history --since 7d --json # last week, JSON npx @aimcpvault/mcp-proxy history --server stdio:npx:@modelcontextprotocol/server-filesystem ``` **浏览仪表板:** ``` npx @aimcpvault/mcp-proxy dashboard # vault dashboard: http://127.0.0.1:9876 ``` 带有判定结果卡片、每日堆叠柱状图(30 天)、热门工具以及最近扫描表的深色主题单页仪表板。每 5 秒自动刷新一次(可通过 `--refresh ` 配置)。 **隐私保证:** - 默认关闭 — 除非设置 `VAULT_PERSIST=1`,否则不会写入任何数据。 - 所有数据都保留在本地。仪表板和历史记录读取器都直接从 `~/.vault/scans.db` 提供服务;不会上传任何内容。 - 内容预览在存储前会经过 regex 脱敏处理(API keys、GitHub/AWS tokens、JWTs、电子邮件、类似 SSN 的字符串、类似信用卡的数字、通用的 `password:` / `token:` header)。这是一个尽力而为的过滤器;如果你需要更强的保证,请保持关闭持久化。 - 30 天滚动保留期。使用 `VAULT_RETENTION_DAYS=` 覆盖(设置为 `0` 则禁用清理)。 - 使用 `VAULT_PERSIST_PATH=/path/to/scans.db` 覆盖数据库路径。 ``` # 封装任意 MCP server — 无需更改您的 agent 配置 npx @aimcpvault/mcp-proxy -- npx -y @modelcontextprotocol/server-filesystem /path/to/data ``` ## 测量性能 以下所有数据均可从提交在此 repo 中的测试工具重现。每项数据都附有测量时所基于的 commit 和数据集作为脚注。 | 指标 | 值 | 来源 | |---|---|---| | TPR — v2 留出集(启用 L3,80 次攻击) | **100%** (80 / 80) · 95% 置信区间下限 95.5%+ | [^holdout-l3] | | TPR — 仅 L1+L2,无 API key | 实质性降低(生产环境中必需 L3) | [^holdout-degraded] | | 误报率(良性内容被标记) | **0.0%** (0 / 100) | [^holdout-l3] | | L1 延迟 (p50 / p99) | 0.03 ms / 0.53 ms | [^holdout-l3] | | L2 延迟 (p50 / p99) | 11.05 ms / 69.75 ms | [^holdout-l3] | | L3 延迟 (p50 / p99) | 1541 ms / 3499 ms | [^holdout-l3] | | 持续吞吐量(单个 proxy) | 100 req/s,30,000 次请求中 0 错误 | [^load] | | 稳态内存 (RSS) | 预热后 135–180 MB,未观察到内存泄漏 | [^load] | | 500 KB 响应扫描时间 | ~25 秒(受限于 embedder,见局限性 §14) | [^edge] | [^holdout-l3]: `packages/eval/results/eval-clean-baseline-v2-L3-enabled-2026-05-21.md` — 在检测代码被冻结在 commit `8d230e4` 后,针对构建的 v2 留出集进行的一次性评估。数据集:`packages/eval/datasets/holdout-v2-novel/`(50 次攻击)+ `packages/eval/datasets/holdout-v2-paraphrase/`(30 次攻击)+ `packages/eval/datasets/benign-v2/`(100 条记录)。已启用 L3(Anthropic Haiku 4.5)。在构建留出集和运行评估之间没有进行调整。 [^holdout-degraded]: 如果没有 `ANTHROPIC_API_KEY`,Vault 仅运行 L1+L2。在 v2 novel 留出集(旨在位于 L2 检测范围之外的攻击)上,TPR 接近 0%;在 paraphrase 攻击上约为 7%。L3 是针对分布外攻击的检测骨干。离线模式限制请参阅 `packages/LIMITATIONS.md` §11。 [^load]: `packages/eval/load/report.md` — 100 req/s × 300 秒 × 单个 stdio proxy 实例 × ~200 字节的 stub-MCP 响应,仅限 L1+L2。超过 100 req/s 后的断崖式下降尚未测量。 [^edge]: `packages/proxy/test/edge-cases.test.ts` 场景 4。延迟受到 L2 embedder 迭代约 140 个流式数据块的限制;L1 在任何大小下都保持在亚毫秒级。见局限性 §14。 ## Vault 能捕获的内容 启用 L3 后(已设置 Anthropic API key),Vault 在我们包含 80 条记录的公开结构泛化评估中捕获了 100% 的攻击,而在 100 份良性文档中的误报率为 0%。检测方法和数据集是公开的 — 详见 `/packages/eval/`。 按类别划分(80 次攻击,holdout-v2 结构泛化评估,2026-05-21): | 攻击类别 | 捕获 / 总计 | TPR | |---|---|---| | exfiltration | 60 / 60 | 100.0% | | instruction_override | 13 / 13 | 100.0% | | multi_turn_setup | 6 / 6 | 100.0% | | encoded_payload | 1 / 1 | 100.0% | 数据来自 `packages/eval/results/eval-clean-baseline-v2-L3-enabled-2026-05-21.md`,启用了 L3(Anthropic Haiku 4.5)。数据集:`packages/eval/datasets/holdout-v2-novel/`(50 次攻击)和 `packages/eval/datasets/holdout-v2-paraphrase/`(30 次攻击),经验证与检测语料库不重叠。延迟和吞吐量背景请参见[测量性能](#measured-performance)。 ## Vault 无法捕获的内容 - **用户发起的越狱** — 根据设计,这不在范围内。Vault 位于 agent 和上游 MCP 服务器之间,而不是位于用户和 agent 之间。用户直接键入的越狱是模型提供商的责任,而不是 proxy 的责任。 - **真正新颖的注入模式** — 远离所有已知示例进行改写的攻击(L2 余弦距离 > 0.50 且未设置 L3 key)会逃避检测。该语料库涵盖了 2022–2024 年发布的攻击文献;截止日期之后的新技术可能未被包含在内。请参阅 [`packages/LIMITATIONS.md`](packages/LIMITATIONS.md) §3。 - **无 L3 的协议编码数据** — 返回 Pub/Sub 消息、SQS payloads、二进制 blob 或加密内容的 MCP 工具在禁用 L3 时会产生误报(该流量类别的误报率约为 40%)。见局限性 §11。 - **跨会话拆分的多轮攻击** — Vault 独立扫描每个 MCP 响应。在会话 A 中建立、在会话 B 中激活的潜伏指令不在 Vault 的检测窗口内。见局限性 §10。 - **图像/音频嵌入的指令** — Vault 仅支持文本。工具响应中的二进制内容(图像、音频文件、PDF)未扫描即转发给 agent。如果你的 MCP 服务器返回图像数据或视觉模型输入,Vault 无法对隐藏在该内容中的指令提供保护。 完整的差距分类法:[`packages/LIMITATIONS.md`](packages/LIMITATIONS.md) — 15 个章节,涵盖多语言、语义、结构、规范化、自引用、协议编码和规模差距。[`packages/SECURITY_MODEL.md`](packages/SECURITY_MODEL.md) 将每个差距映射到其留下的威胁。 ## 离线模式(无 API key) 当 `ANTHROPIC_API_KEY` 和 `OPENAI_API_KEY` 均未设置时,Vault 以离线模式运行: - Layer 0 (decoder) 和 Layer 1 (heuristics) 正常运行 - Layer 2 (embedding similarity) 正常运行 - Layer 3 (LLM judge) 被禁用 **适用于:** - 开发环境和本地测试 - agent 未运行生产流量的 CI/CD pipeline - 气隙隔离或离线部署 **不适用于:** - 返回 Pub/Sub、SQS 或 webhook payloads 的生产级 MCP 服务器 - 返回二进制内容(图像、加密 blob)的工具 - 任何误报率高于 5% 的不可接受部署 具体的误报测量数据和理由请参见[局限性 §11](packages/LIMITATIONS.md)。 ## 成本透明度 Layer 3(LLM judge)针对落入 L2 不确定区域的响应调用 Anthropic Haiku 4.5。估算: | 场景 | L3 调用率 | 预估每次请求成本 | |---|---|---| | 评估留出集(对抗性数据集) | ~91% | ~$0.0005 | | 真实 MCP 流量(预期) | ~20–% | ~$0.0001–0.0002 | | 100 个良性请求/小时(稳定状态) | 20–40% | 总计 ~$0.002–0.004/hr | - **不确定区域请求约 ~$0.0005**(Haiku 4.5 输入 + 当前定价下的小量输出) - **生产环境中 100 req/hr 约为 ~$0.04/hr**(真实流量下 20–40% 的 L3 调用率) - **无 API key 时为 $0** — 仅包含 L1+L2,在新型分布外攻击中 TPR 降至接近 0%,协议编码流量上的误报率升至 ~40%。请参阅上方的[离线模式](#offline-mode-no-api-key)。除非明确传入 `--allow-degraded`,否则评估工具将拒绝在此模式下运行。 我们评估中较高的 L3 调用率 (91%) 反映了对抗性数据集 — 几乎每个条目都是根据设计落入 L2 不确定区域的攻击。真实的 MCP 流量(大部分是干净的正常工具输出)具有低得多的 L3 调用率。 在运行之前设置 `ANTHROPIC_API_KEY`。如果没有它,Vault 在启动时会发出 `WARNING: Layer 3 unavailable — degraded mode` 消息,并回退到仅使用 L1+L2。 ## 为什么需要 每个 MCP 工具响应都是对你的 agent 上下文窗口的直接写入。恶意文件、受损的 API 或被投毒的搜索结果可能会在任务执行期间重定向你的 agent — 窃取敏感信息、覆盖文件或转而使用其他工具。MCP 没有针对此类攻击的传输级保护。Vault 增加了一层检测过程;该过程是否适合你的威胁模型,取决于 [`packages/LIMITATIONS.md`](packages/LIMITATIONS.md) 中记录的差距。 ## 工作原理 Vault 位于你的 agent host 和上游 MCP 服务器之间,拦截每个 `tools/call` 响应,并通过分层的检测 pipeline 运行: ``` Agent ──► Vault Proxy ──► MCP Server │ ▼ ┌─────────────────────────────────────────────┐ │ L1 Regex (<1ms) heuristics + unicode │ │ L2 Embeddings (~8ms) bge-small cosine sim │ │ L3 LLM judge (~1s) haiku-4.5 disambiguation│ └─────────────────────────────────────────────┘ │ ▼ clean → forward malicious → block/warn ``` **Layer 1 — Heuristics** (p50 0.02 ms, p99 0.53 ms[^holdout-l3]):针对英文指令覆盖、unicode 标签走私 (U+E0000–U+E007F)、bidi 控制字符 (U+202A–U+202E, U+2066–U+2069)、零宽字符密度、HTML 注释、长 HTML 实体序列和 Markdown 链接锚点的 Regex 模式。高可信度匹配会短路直接返回 — 无需 L2/L3 成本。L1 仅支持英文;见局限性 §1。 **Layer 2 — Embeddings** (p50 8.29 ms, p99 53.06 ms[^holdout-l3]):使用 `bge-small-en-v1.5`(完全在设备上运行,无网络调用,~30 MB WASM)针对精心策划的 31 种攻击类别的语料库进行余弦相似度比对。距离在 0.35 以内的匹配会被拦截;边缘情况升级至 L3。该语料库是公开的;改写后距离超过 0.35 的对手可逃避 L2 — 该类别交由 L3 处理。 **Layer 3 — LLM Judge**(调用时约 1 秒):Claude Haiku 4.5(或使用 OpenAI key 的 GPT-4o-mini)处理模棱两可的情况。仅在 L2 不确定时运行 — 通常小于 5% 的请求。需要 `ANTHROPIC_API_KEY` 或 `OPENAI_API_KEY`。**如果没有 key,L3 将被禁用,TPR 会降至上述报告的 L1+L2 水平。** ### Capability 防火墙 除了注入检测,Vault 还会追踪污点:进入 agent 上下文的工具响应会被标记,如果这些 token 随后出现在对敏感工具(网络请求、文件写入、shell 执行)的调用中,该调用将被拦截限制。 ``` VAULT_CAPABILITY=1 # enable taint tracking + gate VAULT_CAPABILITY_MODE=block # or: warn ``` ### Manifest 校验 Vault 会在首次连接时对每个 MCP 服务器的工具 manifest 进行指纹记录,并对随后的任何漂移(新工具、更改的 schema、版本更新)发出警报。这是一种供应链保护,防止受损的服务器静默添加 `delete_all` 工具。 ``` VAULT_MANIFEST_CHECK=on # default — warn on drift VAULT_MANIFEST_CHECK=strict # treat drift as error ``` ### 可选:链上证明(主动启用) 当操作员选择启用时(`VAULT_ATTEST=1` + 一个有资金的 hot wallet),扫描结论可以通过 Base 上的 [EAS](https://attest.sh) 在链上进行证明。然后,每个 MCP 服务器都会积累一个公开的、仅限追加的信誉评分,任何 agent 都可以在连接前进行查询。默认关闭 — 使用 proxy 不依赖任何链。 ## 安装 ``` # npm / npx(无需安装) npx @aimcpvault/mcp-proxy -- # 或全局安装 npm install -g @aimcpvault/mcp-proxy mcp-proxy -- npx -y @modelcontextprotocol/server-filesystem /data ``` ### Claude Code / Claude Desktop 集成 最快的方法是使用 `vault init` — 它会自动检测你现有的 MCP 配置,并用 proxy 包装每个服务器: ``` npx @aimcpvault/mcp-proxy && vault-init ``` `vault init` 在写入前会显示 diff 预览,将原始配置备份到 `.vault-backup`,并且是幂等的(重新运行会跳过已包装的服务器)。还原命令:`vault-init unwrap`。 或者手动包装: ``` // ~/.claude/mcp_settings.json (or claude_desktop_config.json) { "mcpServers": { "filesystem": { "command": "npx", "args": [ "@aimcpvault/mcp-proxy", "--", "npx", "-y", "@modelcontextprotocol/server-filesystem", "/path" ] } } } ``` ### 检查服务器的信誉 `vault-check` 二进制文件打包在 proxy 内部 — 无需单独安装: ``` # 如果您已安装 @aimcpvault/mcp-proxy,则表示已安装 npx --package=@aimcpvault/mcp-proxy@next vault-check stdio:npx:@modelcontextprotocol/server-filesystem npx --package=@aimcpvault/mcp-proxy@next vault-check --all # scores every server in your MCP config(s) npx --package=@aimcpvault/mcp-proxy@next vault-check --json | jq . ``` 一旦我们在 GitHub 上发布签名版本,独立的 `vault-check` 二进制文件(Homebrew tap、curl 管道安装脚本)计划在 **v0.3** 版本推出。 信誉来自 Base 上的 EAS 证明,由扫描相同服务器的每个 Vault 部署汇总而来。分数范围为 0–1000(越高 = 越安全)。主动启用的证明路径已在上方“可选:链上证明”中记录;连续公开数据流将随 v0.3 推出。 ### 将信誉徽章添加到你的 MCP 服务器 README 中 如果你维护着一个 MCP 服务器,可以将其实时 Vault 信誉分数作为徽章嵌入 — 与 shields.io 的样式相同。随着新的证明在链上落定,该徽章会自动更新。 ``` ![Vault Score](https://vaultmcp.io/badge/your-server-name.svg) ``` 将 `your-server-name` 替换为 Vault 用于你的服务器的标识符 — 对于通过 npm 启动的服务器,通常是包名(例如 `@modelcontextprotocol/server-filesystem`),或者是 HTTP/SSE 服务器的完整 URL。尚无证明的服务器将显示为中性的“未排名”徽章。 ### 公共信誉 API 由相同的链上数据支持、开启 CORS 且无需身份验证的读取 endpoint: | Endpoint | 返回 | |---|---| | `GET https://vaultmcp.io/api/score/:server` | 单个服务器的分数、扫描、拦截、basescan 链接 | | `GET https://vaultmcp.io/api/leaderboard?n=10` | 按扫描次数排名的前 N 个服务器 | | `GET https://vaultmcp.io/api/threats/recent?n=20` | 最近的 ThreatRecord 证明 | | `GET https://vaultmcp.io/badge/:server.svg` | SVG 信誉徽章 | 所有 endpoint 都接受可选的 `?network=base|base-sepolia` 查询参数。已设置缓存 header;预期有 60 秒的边缘缓存。 ### HTTP/SSE 模式 ``` # 通过 HTTP 代理远程 MCP server npx @aimcpvault/mcp-proxy --transport http \ --upstream https://mcp.example.com/v1 \ --port 8800 ``` ## 配置 所有配置均通过环境变量进行: ``` # 检测 VAULT_MODE=block # block (default) | warn | log VAULT_LAYER2_THRESHOLD=0.35 # cosine distance cutoff for L2 VAULT_LAYER3_PROVIDER=anthropic # anthropic | openai | custom VAULT_LAYER3_MODEL=claude-haiku-4-5-20251001 # model override VAULT_LAYER3_TIMEOUT_MS=5000 # judge call timeout # Keys(BYO — Vault 绝不存储或转发它们) ANTHROPIC_API_KEY=sk-ant-... OPENAI_API_KEY=sk-... # Capability firewall VAULT_CAPABILITY=1 VAULT_CAPABILITY_MODE=block VAULT_TAINT_MIN_OVERLAP=32 VAULT_SENSITIVE_TOOL_PATTERNS=^my_custom_sensitive_tool # Manifest verification VAULT_MANIFEST_CHECK=on # on | off | strict # Audit log VAULT_AUDIT_LOG=/var/log/vault-mcp.jsonl # On-chain attestation(可选,默认关闭 — 完整的托管 feed 将在 v0.3 中推出) VAULT_ATTEST=1 VAULT_ATTESTER_PRIVATE_KEY=0x... # fund with ~0.05 ETH on Base VAULT_EAS_ADDRESS=0x4200000000000000000000000000000000000021 VAULT_SCAN_RECEIPT_SCHEMA=0x... # register via packages/contracts VAULT_THREAT_RECORD_SCHEMA=0x... # Telemetry(设置 URL 时默认开启) VAULT_TELEMETRY=1 VAULT_TELEMETRY_URL=https://your-collector.example.com/ingest VAULT_TELEMETRY=0 # opt out ``` ## 审计日志 每个结论都会写入一个仅限追加的 JSONL 文件中: ``` VAULT_AUDIT_LOG=/var/log/vault-mcp.jsonl # 使用内置 CLI 查看 npx vault-audit /var/log/vault-mcp.jsonl npx vault-audit --type detection --verdict malicious npx vault-audit --tool read_file --since 1h npx vault-audit --raw | jq . ``` ## 检测模式 | 模式 | 行为 | |---------|-------------------------------------------------------------| | `block` | 恶意内容被替换为错误响应(默认) | | `warn` | 返回原始内容,并在前面加上警告 | | `log` | 内容通过;检测结果仅记录在审计日志中 | ## 隐私 Vault 绝不会将原始内容发送到任何地方。遥测 pipeline 仅传输内容和参数的 SHA-256 哈希值、结论标签、延迟测量值和模式名称。原始文本永远不会离开 proxy 进程。 完整的数据清单请参见 [PRIVACY.md](packages/proxy/PRIVACY.md)。 要完全禁用遥测:`VAULT_TELEMETRY=0`。 ## 项目结构 ``` packages/ proxy/ # @aimcpvault/mcp-proxy — the core proxy (this is what you install) corpus/ # @vaultmcp/corpus — curated attack/clean embedding corpus contracts/ # @vaultmcp/contracts — VaultReputation.sol + EAS schema registration collector/ # @vaultmcp/collector — telemetry ingest + aggregation server eval/ # @vaultmcp/eval — detection benchmarks vs. competitors demo-site/ # Next.js demo + live threat feed ``` ## 评估方法 — 如何重现 上方的[测量性能](#measured-performance)数据来自提交在此 repo 中的测试工具和数据集。重现步骤: ``` # 克隆并安装 git clone https://github.com/vaultmcp/vault.git cd vault pnpm install # 运行 eval(仅限 L1+L2,无需 API key) pnpm --filter @vaultmcp/eval run eval -- --set both # 要包含 L3,请先导出 API key export ANTHROPIC_API_KEY=sk-ant-... pnpm --filter @vaultmcp/eval run eval -- --set both ``` 输出将存放在 `packages/eval/results/eval-.{md,json}` 中。每次运行都会打印 TPR、FPR、各分类细分、各层归因、延迟百分位数,以及按严重程度划分的最严重的假阴性 和假阳性。 留出集数据集位于 `packages/eval/datasets/holdout-attacks/` — 包含跨越 `published-papers`、`garak-probes`、`blog-pocs`、`owasp-llm`、`encoded-payloads`、`multi-turn` 和 `roleplay-jailbreak` 的 188 条记录。良性数据集(110 条记录)位于 `packages/eval/datasets/benign/`。两者都有描述来源的 `MANIFEST.md` 文件。 **鼓励操作员编写自己的攻击并提交 pull request。** 按照 JSON schema 在 `packages/eval/datasets/holdout-attacks/` 下添加一个新文件,更新 `MANIFEST.md`,然后发起 PR。测试工具会自动识别新文件。 自我红队 (`packages/eval/red-team/`) 是诚实评估的另一半:包含 38 个精心设计的绕过尝试,其中 9 个在我们的 P2 修复后仍然通过了 L1+L2。它们在 [`packages/LIMITATIONS.md`](packages/LIMITATIONS.md) 中进行了分类。 ## 开发 ``` # 前提条件:Node 20+、pnpm 9+、Foundry 1.7+(仅用于 contracts) # 安装 pnpm install # 以 dev mode 运行 proxy(封装 MCP filesystem server) pnpm --filter @aimcpvault/mcp-proxy dev -- npx -y @modelcontextprotocol/server-filesystem /tmp # 运行所有测试 pnpm -r test # Typecheck pnpm -r typecheck # 构建所有 packages pnpm -r build # 运行 eval benchmark pnpm --filter @vaultmcp/eval run eval # Contracts(需要 Foundry) cd packages/contracts forge test forge build ``` ## 安全 Vault 是一个纵深防御层,而不是一个完整的解决方案。没有任何 regex 或 embedding 模型能捕获所有攻击 — 对手可以精心构造能够逃避任何单一检测策略的 payload。我们在公开的 v2 留出集上测量的检测结果是 **100% TPR / 0.0% FPR**(80 次攻击,启用 L3,95% 置信区间下限为 95.5%+)。如果没有 L3,在新型分布外攻击上的 TPR 接近 0% — L3 是检测的骨干。分层方法提高了门槛;操作员应将 Vault 视为更广泛的安全态势中的一层。 详情: - [`packages/LIMITATIONS.md`](packages/LIMITATIONS.md) — 测量出的差距、红队证据,以及计划中与已接受的缓解措施。 - [`packages/SECURITY_MODEL.md`](packages/SECURITY_MODEL.md) — Vault 能防御的威胁、不能防御的威胁、假设,以及攻击者仍然需要做的事情。 - [`SECURITY.md`](SECURITY.md) — 漏洞报告政策。 报告漏洞:请发起一个 [GitHub Security Advisory](../../security/advisories/new)(首选)或直接发送电子邮件给维护者。我们的目标是在 48 小时内进行分类,并在确认严重漏洞后的 7 天内发布补丁。 ## 许可证 MIT
标签:AI风险缓解, MITM代理, Petitpotam