04 - 防线在哪一层:网关、客户端,还是模型
前置:01 - 威胁模型、03 - 工具投毒与 Rug Pull。 读过 Agent 网关 · 05 - MCP 网关 会更顺,本篇会大量回引。
本篇回答:知道了会被怎么打,那该在哪儿设防?每道防线各能拦住什么、拦不住什么?
一、一次工具调用经过的六道关卡
先把链路铺开,防线的位置就清楚了:
六个位置,每一个都能设防,但能力和代价完全不同。图里这几个词先解释一下:
| 词 | 意思 |
|---|---|
| 提示注入 | 攻击者把指令伪装成普通数据喂给模型。对模型来说系统提示词和一封邮件的正文处在同一个上下文里,地位相同,所以它分不清哪句是命令,详见 01 篇 |
| 工具白名单 | 事先规定这次会话只允许调用哪几个工具。模型即使被诱导去调别的,网关这一层直接拒绝 |
| 参数校验 | 比白名单更细一层:不只看调了哪个工具,还看参数长什么样。比如允许调 send_email 但收件人域名必须是公司内部 |
| 沙箱 | 一个受限的执行环境,Agent 在里面跑代码伤不到宿主机。注意它限制的是破坏能力,不是信息 搬运能力 |
| Lethal Trifecta | 「致命三要素」:能接触私有数据 + 摄入不可信内容 + 有对外通道。三者同时具备时数据外泄就无法从原理上避免,详见 01 篇 |
二、逐道防线的能力边界
② 模型自身:必要,但不能当防线
模型经过对齐训练,会拒绝明显有害的请求。这有用,但不能作为安全边界,原因在 01 篇说过:指令和数据在同一个上下文里,攻击者总能找到新的表达方式。
判断标准很简单:一个防线如果无法给出确定性的保证,它就是缓解措施,不是边界。 模型的拒绝能力属于前者。
④ 客户端人工审批:最强,但最贵
Claude Code 那类工具用的是这条路 —— 危险操作弹窗给人确认。
这是唯一能挡住"完全没见过的新型攻击"的防线,因为判断的是人。
它的三个代价也很 实在:
- 审批疲劳。弹得太频繁,人就开始无脑点"同意" —— 这正是 01 篇里 ASI09(利用人对 Agent 的信任)的核心。
- 只能保护交互式场景。跑在后台的批处理 Agent 没人可问。
- 人必须看得懂。弹窗里如果是一串 base64,点同意的人什么也没审。
闭源,怎么研究? anthropics/claude-code(★141,929)仓库里只有 plugins 和 examples,没有 CLI 源码。可以走的路是第三方对它配置面的解析 —— snyk/agent-scan 里有个 agents/claude_code.py(20 KB),专门读取和检查 Claude Code 的权限配置。用扫描器反推被扫描对象的权限模型,是拆闭源工具的一条实用路径。
我自己在 Lobster0 里做的是"权限分层 + 参数绑定审批":不是每次调用都问,而是首次审批时把工具和一组具体参数绑定,之后同样的组合免审、参数变了重新问。这是在审批疲劳和安全之间找平衡。
⑤ 沙箱:兜底,管不了数据外泄
沙箱能挡住 ASI05(意外的代码执行),但挡不住 Lethal Trifecta。
一个跑在完美沙箱里的 Agent,只要它能读私有数据、能上网,照样能把数据传出去 —— 沙箱限制的是它对宿主机的破坏,不是它对信息的搬运。