MCP 正在被越来越多的 AI 应用当作工具调用标准,但一旦工具、数据与外部内容被串在同一条调用链上,安全问题就不再是“提示词是否危险”,而是“数据能否按既定路径流动”。开源项目 Aggrete 提供了一种可本地复现的测试方法:通过确定性规则拦截典型的 MCP 攻击,而不是依赖模型判断请求是否“看起来安全”。
从三种攻击看工具链风险
素材中列举的三种攻击,都指向同一个结构:看似普通的工具调用,实际承载了攻击意图。
- 提示注入型数据外泄:助手读取不可信内容后,被其中隐藏指令引导去访问私有数据,再将数据发送到外部。
- 工具投毒:恶意指令藏在工具描述中,用户通常看不到,但模型会读取并可能执行。
- Rug pull:工具首次出现时无害,获得批准后,定义在后续阶段被替换。
这类攻击的共同点是,单个动作可能并不危险。例如读取公开 issue、读取私有仓库、提交 issue,分别看都可能是正常操作;但当它们发生在同一个会话中,就会形成完整的数据外泄路径。
用确定性规则替代概率化过滤
Aggrete 的做法是在代理层设置规则,在上游请求发生前进行判断。素材称,决策路径中没有模型参与,因此同一请求会得到同样结果,且每条拦截原因可以被审计。
在“致命三要素”攻击示例中,规则首先识别会话是否已经接触不可信内容。一旦会话被标记,后续读取私有数据或向外部发送数据的请求会被拒绝。示例输出显示:
- 读取攻击者公开的 issue:允许,来源标记为 public-issues。
- 随后尝试读取私有仓库:拒绝,规则编号 FLOW-001。
- 再尝试携带私有数据创建公开 issue:拒绝,规则编号 FLOW-001。
该限制只作用于当前会话。素材称,在新会话中访问同一个私有仓库仍然可以正常进行。这意味着规则针对的是危险序列,而不是简单禁用某个工具。
工具投毒与 Rug Pull 的拦截方式
对于工具投毒和 rug pull,Aggrete 采用“首次使用即固定”的方式处理工具定义。工具第一次出现时,系统会记录其指纹;如果后续定义发生变化,会被标记为可能的 rug pull。同时,它还会扫描工具描述中的注入模式。
示例输出显示:
- wiki__search 首次出现:干净,指纹被固定。
- notes__summarize 包含隐藏指令:被拦截,识别出 2 个投毒模式。
- wiki__search 定义后续变化:被拦截,提示可能存在 rug pull。
这类拦截发生在助手实际执行之前,避免模型接触到被污染的工具描述或已替换的定义。
对开发者的安全清单
对集成 MCP 或类似工具链的团队来说,素材给出的启示是:不能只依赖模型层面的安全判断。更可靠的方式是把权限边界写成规则,并在请求真正触达外部资源前执行。
- 区分公开数据、私有数据和外部发送通道,避免三者在同一会话中形成闭环。
- 对工具描述进行注入模式扫描,不把工具元数据当作无害文本。
- 对工具定义进行指纹固定,任何后续变更都需要重新确认。
- 使用最小权限设计,让单个工具只拥有完成任务所需的最小访问范围。
- 保留可审计的拦截记录,明确说明请求因哪条规则被拒绝。
Aggrete 以 Apache-2.0 协议开源,可通过 pip 安装,并提供了本地示例脚本。素材强调,这些示例不需要服务器、密钥或网络连接,适合开发者在本地快速验证 MCP 安全策略。
原创文章,作者:点点,如若转载,请注明出处:https://www.dian8dian.com/dang-mcp-cheng-wei-gong-ji-ru-kou-yi-ci-ke-fu-xian-de-ai