- 投毒——服务器从一开始就是恶意的。它的清单看起来良性; 危险行为在工具实现中,而不是声明的范围中。
- Rug-pull——你信任了它,然后它改变了。出现了服务器运营者 悄悄添加的新工具,或者社区注册表条目被劫持并更新为回调。
1. MCP 工具投毒如何到达你的智能体
你的智能体发出的每一次tools/call 都通过 MCP 服务器声明的工具集
传输。中毒或 rug-pull 的服务器以几种方式利用这种信任:
| 载体 | 发生什么 |
|---|---|
| 未声明的工具 | 服务器的清单从未声明的新工具出现在 tools/list 中。你的智能体找到它并调用它。 |
| 劫持的注册表条目 | 社区注册表列表被接管;端点现在指向攻击者控制的服务器。 |
| 凭证收割 | 服务器的工具实现将收集的输入发送到外部主机。 |
| 通过工具结果的提示注入 | 工具返回攻击者控制的文本,重定向智能体的下一个动作。 |
2. OrcaRouter 的防御措施
2.1 每次 tools/call 在运行之前都经过防火墙评估
MCP 服务器通过 /api/v1/firewall/mcp 上的防火墙 MCP 网关连接到
你的智能体。网关在防火墙引擎对照你的策略
评估工具调用之前,不会转发它。
这意味着你的允许列表是真相来源——而不是服务器的工具清单。如果
rug-pull 添加了 shell.exec 而你的策略没有允许它的规则,判定就是
deny,调用永远不会离开网关。模型收到工具错误(firewall deny: …)
并可以做出反应;攻击者添加的工具从一开始就无效。
引擎可以返回的判定:
| 判定 | 效果 |
|---|---|
allow / audit | 调用被转发;audit 额外记录参数。 |
sanitize | 参数在转发前被改写。 |
deny | 调用被拦截;模型收到工具错误。 |
pending_approval | 调用被挂起;人工必须在继续之前批准。 |
cap_cost | 成本上限被执行;如果会超过上限,调用被拦截。 |
2.2 自动检测的能力被隔离直到审查
当智能体自安装能力——或 rug-pull 添加了你注册服务器时不存在的 新工具——时,防火墙在热路径之外自动检测 新能力,综合清单,扫描它,并分配风险带和执行模式。关键地, 自动检测的能力总是被隔离,无论扫描结果如何:它们被置于pending_approval 中,直到人工审查它们。
这就是 rug-pull 被遏制的方式。运营者无法悄悄添加新工具并让你的
智能体开始使用它——这些调用会被挂起,直到你检查并批准新能力。
2.3 技能扫描分配风险带和执行模式
每一个可安装的能力——无论是你注册的还是防火墙自动检测的——都 通过技能扫描器传递。 扫描器对清单和声明的范围运行确定性检查:- prompt_injection——试图劫持指令的清单文本。
- tool_creep——清单使用但从未声明的工具。
- network_egress——批准网络范围之外的 HTTP(S) 主机。
- fs_write_unsafe——
/tmp之外的写入模式文件系统访问。
low / medium / high / critical)
和执行模式:
| 模式 | 运行时发生什么 |
|---|---|
allow | 技能不强加任何自己的东西;你的策略规则决定。 |
quarantine | 任何非拒绝判定都升级为 pending_approval。人工必须批准每次工具调用。 |
block | 无论策略规则如何,对此技能所有工具强制 deny。 |
high 带技能自动被隔离;critical 被拦截。单个 error 发现
(例如未声明的 shell.exec 的 tool_creep)即使其数字分数看起来
很低,也足以拦截技能。模式只会向更严格的方向收紧——批准技能
永远不会放宽新鲜扫描设置的拦截。
2.4 凭证加密存储
服务器认证密钥使用工作区密钥加密静态存储,在派发时由网关注入。 它们永远不会到达模型、智能体或调用参数。被攻破的服务器无法通过 读取自己的auth_json 来外泄你的 API 密钥。
第三方 MCP 服务器审查清单在注册外部 MCP 服务器之前:
- 验证发布者的身份——谁控制端点 URL?
- 阅读源代码或变更日志;查找初始发布后添加的新工具。
- 检查技能扫描在注册时是否返回任何
tool_creep或prompt_injection发现。 - 将带
tool_name_glob: <server>.*的防火墙规则限定到audit或pending_approval,直到你有调用历史。 - 审查
network_egress发现:清单声明它只需要一个域,但 工具描述提到了其他域吗? - 在任何上游版本升级后重新探测服务器(
POST /api/workspace/firewall/mcp_servers/:id/probe)以显示新工具。
3. 怀疑 rug-pull 后该怎么做
- 立即禁用服务器——禁用的服务器从运行时注册表中删除,
其凭证永远不会被解密。使用带
"enabled": false的PUT /api/workspace/firewall/mcp_servers。 - 重新探测以显示变更——
POST /api/workspace/firewall/mcp_servers/:id/probe运行tools/list并返回自你上次探测以来出现的任何新工具。 - 重新扫描技能记录——
POST /api/workspace/firewall/skills/:id/rescan对更新后的清单重新运行扫描器。如果判定降级为flagged或blocked,防火墙会在你的信息流中发出事件。 - 审查
pending_approval队列——自 rug-pull 以来被挂起的任何 调用都在队列中。检查并拒绝它们,而不是批量批准。 - 审计调用日志——在你检测到变更之前,检查防火墙事件追踪, 查看已经通过的调用。
4. 将技能扫描与防火墙规则配对
技能扫描和防火墙规则是互补的,并可以组合:- 带
tool_name_glob: community.*设置为pending_approval的规则 确保你审查来自社区来源服务器的每次调用,无论风险带如何。 - 被隔离的技能会覆盖
allow规则——即使你的策略广泛允许http.fetch,拥有它的被隔离技能仍然挂起调用。 - 在规则中使用
skill_name_glob将更严格的策略限定到不受信任的服务器,而不影响你的第一方集成。
5. 相关威胁
防火墙:MCP 服务器
在网关后注册 MCP 服务器,探测它们的工具,并在任何调用
到达真实服务器之前应用每次调用的判定。
防火墙:技能
扫描每个可安装能力并为其评分风险。在其工具运行之前
隔离或拦截危险技能。
