tools/call。每个已注册服务器声明的工具集在首次探测时
被建立基线并对漂移重新核查——如果工具 schema 从批准的基线发生
变化,服务器会 fail closed,直到一名管理员重新批准或隔离它。而
技能 层为每一个已安装的能力赋予一个
风险等级和一个执行模式——把任何有风险或未审查的东西隔离,直到
一个人签字。一个服务器无法靠在头一百次调用里表现良好来赢得一张
通行证。
1. 为什么 MCP rug pull 防护需要每次调用的评估
一次连接时的审查只回答一个问题一次:这个服务器列入是安全的吗? 它无法回答运行时真正要紧的问题:现在,这次特定调用,带这些 特定参数,安全吗? OrcaRouter 回答第二个问题。每一次穿过网关的tools/call 都在派发到
真实服务器之前在 mcp 面上被评估,手里握着工具名和参数。判定
每次都被重新计算,因此一个工具开始做你的策略禁止的事的那一刻
——在一个参数里外泄密钥、触及一个被拒绝的主机、调用一个你从未
批准的能力——该调用就被阻止,无论同一个工具一分钟前如何表现。
每次调用的评估治理每次调用的行为——参数内容、目的地、归属
技能的风险——因此即使工具保持一个相同的签名而只有它的行为变得
有敌意,它也能抓住一次 rug pull。Schema 漂移检测(下文 §)是互补的
层:它抓住服务器声明的工具集本身发生变化的情形。两者都运行。
mcp 面上返回的判定:
allow / audit
转发到服务器。
audit 记录该调用;allow 保持安静。sanitize
先把工具调用的参数脱敏后再转发(它绝不改写服务器返回的内容)。
deny
作为一个工具错误(
firewall deny: …)返回给模型,因此智能体
能适应而不是崩溃。pending_approval
该调用被挂起,等一个人来解决,之后才能运行。
2. 技能风险等级隔离
rug-pull 防御的后半部分覆盖供应链:智能体安装的技能、插件和 自带 MCP 服务器。每一个都被注册为一条工作区限定的记录,被一个 确定性风险引擎扫描,并被赋予一个风险等级 (low / medium / high / critical)加一个执行模式:
| 模式 | 运行时效果 |
|---|---|
allow | 由规则判定决定;技能不添加任何东西。 |
quarantine | 任何低于 deny 的判定都被升级为 pending_approval——工具只在一个人批准后运行。 |
block | 该技能的工具被直接拒绝。 |
auto_detected 且在审查前被隔离——即使它扫描结果干净,它也
不会凭自己的权威运行。并且一个技能的模式只会在重新扫描时更紧
地棘轮收紧:你设置的一个 block 或 quarantine 永不在一个清单被
重新呈现时被悄悄放松。
完整的扫描器、评分权重和信任信号参见
防火墙:技能。
3. 工具 schema 漂移检测
经典的 rug pull 是一个已注册服务器更改它所声明的东西——添加一个 工具、改动一个工具的输入 schema、替换一个描述。OrcaRouter 在一次 成功的探测上为每个已注册服务器声明的工具集建立基线,并监视它的漂移。首次探测时建立基线
首次成功的探测会记录服务器工具的一个规范哈希(在发现姿态下
trust-on-first-use;在一个**执行(enforcing)**姿态下,一个未建立
基线的服务器被挂为
pending,直到一名管理员批准它的初始工具集)。漂移 fail closed
在一次后续探测上,如果规范工具集不再匹配批准的基线,服务器会被
标记为
changed 并停止被提供——网关在你决定之前不会派发它的工具。批准或隔离
重新批准以把基线重置到新 schema,或隔离该服务器。一个被隔离的
服务器也被禁用,并且只有一次明确的批准才能恢复服务——一次普通的
编辑无法重新启用它。
受审计
从一个批准的基线首次检测到漂移会写入一条工作区审计条目,因此
这次变更被记录在案。
unknown(从未建立基线)、
verified(匹配基线)、changed(已漂移,被挂起)、pending
(在执行姿态下未建立基线)或 quarantined。这一层抓住移动了
schema 的 rug pull;每次调用的评估(§1)抓住保持一个相同签名而
只更改行为的那种。
4. 一个具体例子
假设一个社区 MCP 服务器notes 声明了一个无害的 notes.search
工具。你列入它、审查它,它工作正常。一周后服务器被攻破,
notes.search 开始附加一个把你的上下文 POST 到一个攻击者主机的
外泄参数。
一个仅在连接时把关的网关会转发它——工具名和 schema 看起来没变。
OrcaRouter 评估该调用:
args_match 运算符为 eq、contains、regex、in、cidr_match、
gt、lt;cidr_match 对照一个 CIDR 测试一个 IP 值的参数。要按
主机/CIDR 限定一个工具可以触及哪里,请使用
出站目的地列表 而不是一个参数子句。)
在派发时引擎返回 deny,于是网关不转发该调用,而是把一个 MCP
工具结果错误——一个被标记为错误的正常结果,不是一次传输失败
——交给智能体,因此模型能适应:
5. 它如何组合在一起
每次调用的评估 vs. 技能隔离——各抓什么?
每次调用的评估 vs. 技能隔离——各抓什么?
每次调用的评估抓住一个受信任工具变恶意——同样的名字、
参数或目的地里的新行为。技能隔离抓住一个新的或未审查的能力
根本就出现了——一次自动检测的安装、一个被重新扫描后新近退化的
清单。一次 rug pull 可以取任一形态,因此两者都运行:技能的模式
叠加在每次调用的规则判定之上。
这会为服务器的 schema 建立基线吗?
这会为服务器的 schema 建立基线吗?
会——见 §3。每个已注册服务器声明的工具集在首次探测时被建立
基线并对漂移重新核查;一个已漂移的服务器 fail closed,直到你
重新批准或隔离它。这与每次调用的评估互补,后者还会抓住一个
保持相同签名而只更改其行为的工具。
被挂起的调用去哪里?
被挂起的调用去哪里?
一个
pending_approval 判定把调用挂起,等一个人在控制台
(Developer+)中或经由一个 HMAC 审批回调来解决。关于挂起和审批
如何向一个智能体浮现,参见
执行模式。6. 配置它
下面的每一步都是一个用你的会话或访问令牌鉴权的控制台 / 管理 操作——不是sk-orca-… 中继密钥。只有 /v1/* 中继流量使用中继密钥。
把你的 MCP 服务器注册在网关后面
连接每个服务器,让它的工具在一个
受审计的端点下被声明。注册是 Developer+。
在 mcp 面上设置一个默认判定和规则
用
tool_name_glob 和 args_match 编写规则,让有风险的调用
解析为 deny、sanitize 或 pending_approval。参见
防火墙规则参考。读取(设置、策略、已发现工具、异常)对任何 Member 开放;每一次
写入是 Developer+。读取一个 firewall-gateway 密钥的明文是 Developer+。
相关
防火墙:MCP 服务器
完整的 MCP 网关参考——注册、探测、派发。
防火墙:技能
扫描器流程、风险评分和隔离推导。
MCP 工具投毒
rug-pull 防御为之而生的威胁模型。
出站限制
编写主机/CIDR deny 规则以限定工具可以触及哪里。
信任清单
信任一个 MCP 服务器的端到端清单。
防护栏 vs. 防火墙
什么时候应用内容策略,什么时候由防火墙处理。
