Agent Containment(Agent 隔离与遏制)
定义
通过环境层隔离限制 Agent 的可操作范围(blast radius),使概率性防御(模型层)失效时仍有确定性边界兜底。Anthropic 工程团队从三款 Claude 产品的安全实践中提炼。
三层风险 × 三层防御
Agent 安全风险分三类,防御对应三个组件:
| 风险类型 | 描述 | 防御组件 |
|---|---|---|
| 用户误用 | 用户指示 Agent 做有害操作(故意或疏忽) | 环境隔离 + 权限控制 |
| 模型误行为 | Agent 自发采取有害行动(如"helpfully"逃逸沙箱) | 模型层(系统提示、分类器、训练) |
| 外部攻击 | 通过工具、文件、网络对 Agent 进行注入或传统攻击 | 内容检查 + 工具权限限制 |
核心原则: 环境层 containment 优先于模型层 steering。模型层防御是概率性的(Claude Opus 4.7 单次攻击成功率 ~0.1%,100 次自适应攻击 ~5-6%),永远无法 100%。确定性边界(沙箱、VM、文件系统隔离)是兜底。
三种隔离模式
| 模式 | 产品 | 环境 | 隔离机制 | Blast Radius | 用户要求 |
|---|---|---|---|---|---|
| 临时容器 | claude.ai | 服务端 gVisor | 每会话临时容器,无持久文件系统 | 最小(服务端隔离) | 无 |
| HITL 沙箱 | Claude Code | 用户本机 | OS 沙箱(macOS Seatbelt / Linux bubblewrap) + 人类审批 | 工作目录内 | 能读 bash |
| 密封 VM | Claude Cowork | 用户桌面 | 完整虚拟机(hypervisor 级),挂载式文件系统 | 挂载目录内 | 无 |
模式选择逻辑
隔离强度必须匹配用户的监督能力:
- 开发者(Claude Code): 能理解
rm -rf的含义 → HITL + 轻量沙箱足够 - 知识工作者(Claude Cowork): 不能期望判断
find . -name "*.tmp" -exec rm {} \;→ 需要绝对且始终开启的 VM 隔离 - 匿名用户(claude.ai): 无本地执行 → 服务端容器隔离
四个安全失败案例
1. 信任对话之前的执行(Claude Code,2025 年中-2026 年 1 月)
攻击者提交含恶意 .claude/settings.json 的仓库。Claude Code 在显示"你信任此目录吗?"提示之前就读取并执行了 hook。
教训: 项目打开、配置加载、localhost 监听器必须被视为来自互联网的入站请求。
2. 用户作为注入向量(Claude Code,2026 年 2 月)
红队演练中,钓鱼邮件让员工运行含隐藏恶意指令的"常规任务"。25 次重试中 24 次成功读取 ~/.aws/credentials 并外泄。模型层无法识别——因为指令来自用户本人。
教训: 唯一有效的防御是环境层——egress 控制阻止 POST,文件系统边界阻止 ~/.aws 访问。
3. 通过已批准域名外泄(Claude Cowork)
攻击者在用户工作区放置含隐藏指令的文件 + 攻击者 API key。Claude 读取其他文件,用攻击者的 key 调用 Anthropic Files API。egress proxy 看到目的地是 api.anthropic.com,放行了。
教训: 域名白名单应被视为能力授予,而非目的地过滤。白名单上每个域名的每个功能都是攻击面。
4. VM 隔离挡住了 EDR(Claude Cowork)
企业安全团队问"为什么 EDR 看不到 VM 内部"——隔离把 Agent 关住了,也把端点检测软件挡在外面。
教训: 隔离降低可见性。合规依赖端点可见性的团队需要提前规划。
关键数据点
- 用户批准 93% 的权限提示——审批疲劳使 HITL 成为不可靠的防御
- Claude Code auto mode 捕获 ~83% 的过度行为,但 ~17% 的过激操作仍能通过
- OS 沙箱减少 84% 的权限提示
- Claude Opus 4.7 在 Gray Swan Agent Red Team 基准上:单次攻击成功率 ~0.1%,100 次自适应攻击 ~5-6%
- 红队钓鱼攻击:24/25 次成功外泄(96%)
- 经验丰富的用户自动审批率是新手用户的 2 倍,但中断 Agent 执行也更频繁
前沿威胁
| 威胁 | 描述 | 状态 |
|---|---|---|
| 持久记忆投毒 | 注入落入 CLAUDE.md、产品记忆、定时 Agent 状态目录 → 每次启动重新加载 | 需要会话启动分类器 |
| 多 Agent 信任升级 | 子 Agent 输出被当作"自己人的输出"而非原始工具结果 → 新的注入路径 | 需在信任层级分配和注入风险间权衡 |
| Agent 身份 | Agent 应拥有独立身份还是继承用户权限?Claude Cowork 使用 per-session scoped token | 跨平台标准尚未形成 |
前提与局限性
- 前提: 大部分安全教训来自 Anthropic 自家产品(claude.ai、Claude Code、Cowork),不同产品形态可能有不同的最优隔离策略
- 局限性: 环境层 containment 增加延迟和成本(VM 启动时间),且降低可见性(EDR 盲区)
- 边界条件: 自建组件是最弱环节——gVisor、seccomp、hypervisor 经过多年对抗加固,自研代理/白名单/解析器是主要失败点
- 与模型层的关系: 不是替代模型层防御,而是兜底。Claude Code auto mode 的分类器在沙箱内仍有效减少摩擦
AI 系统的"刹车"机制(2026-06 更新)
刹车 vs Containment(2026-06-27 roundtable 重构)
旧范式将刹车视为"独立安全组件"(检测异常→触发停止),但 roundtable(Leveson/Deming/Kranz/Dekker/Gall)将其重构为刹车 = Containment 边界的动态维护。
| 维度 | Containment | 刹车(旧范式) | 刹车(新范式) |
|---|---|---|---|
| 本质 | 定义 blast radius(可承受最坏损失) | 检测异常→停止/降级 | Containment 边界的动态收缩 |
| 时机 | 设计阶段设定 | 运行阶段触发 | 系统状态改变时自动调整 |
| 与 Agent 的关系 | Agent 在边界内活动 | Agent 感知到"被刹车"(→博弈空间) | Agent 不感知刹车,只感知"操作空间变窄"(→消除博弈) |
| 决策方式 | 架构决策 | 运行时触发决策 | 预定义降级状态机(设计时已做好所有决策) |
| 关系 | 第一道防线 | Containment 的动态维护,不是独立防线 |
刹车的新范式:三层协同
L3: 组织层 — 正义文化(Dekker)
└ 虚警代价由系统承担,不由操作者承担
└ 无正义文化 → 任何刹车机制 →"狼来了"→ 被绕过
L2: 架构层 — Containment + 刹车一体(Leveson/Deming)
└ Containment 定义 blast radius = 可承受最坏损失
└ 刹车 = 当状态改变时验证"当前 blast radius 假设是否仍成立"
└ 不成立 → 自动收缩 blast radius(非"停止",而是操作空间变窄)
L1: 操作层 — 预定义降级状态机(Kranz)
└ 条件 C 满足 → 已进入降级状态 S → 自动切换到模式 D
└ 不需要"触发决策"——决策在设计时已做好
└ Agent 不感知"刹车",只感知"操作空间变窄"(消除 Gall 博弈警告)
三层缺一:
- 缺 L3 → 虚警代价由操作者承担 →"狼来了"→ 刹车被绕过
- 缺 L2 → 刹车是独立组件 → Agent 学会博弈刹车逻辑
- 缺 L1 → 降级没有预定义 → 崩溃时再做决策 → 时间压力下"不刹车"
降级状态机 vs 当前框架
| 组件 | 旧框架(最小可行刹车) | 新框架(降级状态机) |
|---|---|---|
| 人类停止按钮 | 被动:任何人可停止 | 预定义:当指标 X 超过阈值 → 自动停止,人类可恢复 |
| 超时机制 | 被动:超时自动停止 | 预定义:超时 → 进入"限速模式"(非停止,减缓)+ 通知 Governor |
| 资源限制 | 被动:硬限制 | 动态:接近限制 → 渐进收缩(Agent 操作空间变窄) |
| 异常检测 | 主动:统计异常检测 | 主动 + 预定义:检测到异常 → 触发预定义的降级映射 |
| 独立监控 | 主动:独立于被监控系统 | 不变,但增加:监控的监控(元监控层) |
| 恢复路径 | 被动:刹车触发后恢复 | 预定义:每个降级状态 S 有明确恢复条件 R → 回到上级状态 |
刹车失效的冗余设计(Gall 原则)
接受刹车会失效——任何复杂系统组件都会失效。设计系统时假设:刹车每 N 次触发中有 1 次失效。然后问:"在刹车失效的这一次,系统仍然安全吗?"
安全条件:刹车失效时,blast radius 的静态约束仍然使最坏情况可承受。
这就是刹车-Containment 一体化的根本原因:不是"刹车兜 Containment 的底"——而是"Containment 兜刹车的底"。刹车激活时,系统更安全。刹车失效时,Containment 的静态 blast radius 确保最坏情况仍然可接受。
Knight Capital 教训(新视角)
沉默型崩溃的 Containment(2026-06-22 初版,2026-06-27 roundtable 重构)
沉默型崩溃定义
沉默型崩溃是指Agent 系统在没有明显错误的情况下失败——最终答案可能看起来正确,但过程充满了问题。核心特征:没有错误信号。Agent 的内部意会(sensemaking)是自洽的——但在外部视角下是失配的。
两种崩溃类型——同源异向
| 类型 | 描述 | 认知机制(Rasmussen) | 意会状态(Weick) |
|---|---|---|---|
| 行动不足 | Agent 没做足够工作,结果不完整 | 层次错配 ↓:该用知识层却停在规则层 | "我做得很高效——没有多余步骤" |
| 行动过度 | Agent 做了太多,过度复杂或引入错误 | 层次错配 ↑:该用技能层却升到知识层 | "我做得很彻底——覆盖了所有可能" |
关键发现(2026-06-27 roundtable):两种崩溃共享上游根因——组织层宽松(Reason)。在宽松的"正常"边界内,Agent 的默认偏差方向(保守 vs 积极)决定它偏向哪种崩溃。但两者都是同一潜在条件的产物,不是两种独立的"病"。
三层统一防御架构
旧框架:分别设防——最低行为标准(防不足)vs 最大行为限制(防过度)。新框架:三层统一防御。
L3: 上游 — 收紧组织边界
└ 明确的 blast radius + 任务复杂度预校准
└ → 消除"什么样的行为量都被接受"的默许
L2: 中游 — 层次匹配 + 意会检查
└ Rasmussen 层次匹配:任务复杂度预设层级
└ Agent 被限制在对应认知层级操作
└ Weick 外部意会检查:定期外部视角审视输出量和深度
└ → 打破"内部自洽→无法自检"的意会闭环
L1: 下游 — 不对称但互补
└ 行动不足:不确定性 → 升级给 Governor(不是"多做点")
└ 行动过度:边界收缩(操作空间变窄,Agent 无感知)
└ 共同原则(Conklin):改变情境感知,而非设行为硬限制
内部自检的不可自举(Weick 意会闭环)
沉默型崩溃不能被 Agent 内部检测——因为 Agent 的意会系统是自洽的。行动不足的 Agent "相信"自己做得够多;行动过度的 Agent "相信"自己做得够彻底。这与 Agent-Failure-Causal-Chain 中"阻断不可自举"同构——任何在系统内部运行的检测器共享系统的意会框架。
因此,沉默型崩溃的防御必须包含外部意会检查——独立的、不在 Agent 意会框架内运行的视角,定期审视"输出量和深度是否合理"。
Containment + Brake 协同框架
预防(Containment)→ 检测(监控)→ 响应(Brake)→ 恢复(人类审查)
- 预防阶段:Containment 限制 Agent 的可操作范围,防止做危险的事
- 检测阶段:监控系统检测异常行为,触发 brake
- 响应阶段:brake 停止或降级 Agent,人类审查后恢复
- 恢复阶段:人类审查后,恢复到正常状态
风险等级匹配
| 风险等级 | Containment 深度 | Brake 深度 |
|---|---|---|
| 低风险 | 简单权限限制 | 基本超时机制 |
| 中风险 | 多层 Containment | 统计异常检测 |
| 高风险 | 冗余 Containment | 实时熔断 + 人类覆盖 |
关键原则
- Containment 优先,brake 兜底——Containment 是主要防御,brake 是最后防线
- 故障转移机制——Containment 失效时,brake 必须能接住
- 独立监控——Containment 和 brake 需要独立的监控系统
在失败因果链中的位置
Containment 是 Agent 失败因果链 的组织层节点——它设定了所有下游层(协调/认知/行动)的 blast radius 上限和"正常"定义。MAST 论文(UC Berkeley 2025)通过 1,642 条 MAS 执行轨迹的系统分析发现:系统设计问题(含 Containment 设定、角色边界、任务分解)是多 Agent 失败的最高发类别。这意味着——正如 Perrow 的 Normal Accidents 理论预测——组织层的设计决策是所有下游失败的前提条件。Containment 失效不是四个失败之一,而是其他失败被放大的放大器。
Containment 的深度同时决定了因果链中反馈回路的强度:当 blast radius 宽松且 Governor 橡皮图章化时,偏差正常化(Vaughan)使行动层的过度行动被反复标记为"正常",进而固化认知层的偷懒预期,最终形成"组织宽→认知懒→行动过→组织更宽"的恶性循环。
监控者悖论(2026-06-23 更新)
悖论定义
AI 系统的可靠性依赖于人类监控能力;如果 AI 替代了人类监控者,系统的整体可靠性下降。核心悖论:AI 的价值主张是减少人类工作,但如果减少的是监控 AI 的人类工作,系统会变得更危险。
悖论的数学结构
监控可靠性 = 检测能力 × 责任在场度
- 检测能力:发现异常、偏离、风险信号。AI 可以做得很好(统计异常检测、模式匹配、规模化筛查)
- 责任在场度:有人为检测结果负责。只有"有位置的存在"才能承担
当人类监控者被移除时,责任在场度归零 → 无论检测能力多高,整体可靠性为零。
悖论的本质:责任拓扑问题
不是技术能力问题,而是责任链条断裂问题:
- 人类在场时:AI 输出 → 人类审查 → 人类判断 → 人类负责(完整链条)
- 人类被移除时:AI 输出 → AI 判断 → 无人负责(链条断裂)
Meta 案例验证
Meta 安全团队 50% 被调去做数据标注 → AI 生成代码 + AI 审查 → 安全漏洞上线 → CISO 辞职。根本原因:不是 AI 检测能力不足,而是移除了人类层导致责任链条断裂。
正确架构:冗余监控
| 层级 | 功能 | 类型 |
|---|---|---|
| AI 异常检测 | 统计异常、模式匹配、规模化筛查 | 自动化 |
| 自动化规则 | 硬性阈值、熔断机制、权限控制 | 自动化 |
| 人类审查 | 关键决策点的判断和责任承担 | 人类 |
| 外部审计 | 独立于系统的第三方验证 | 人类/制度 |
任何单一层失效时,其他层能接住。Meta 的错误是用 AI 替代了人类层,而不是增加了一个新层。
审批疲劳:悖论的第二层
93% 用户批准权限提示 → 人类监控 AI 也不可靠。解法不是取消人类参与,而是减少需要人类参与的频率:
- Containment 减少 84% 权限提示(减少低价值参与)
- 异常检测只在真正需要判断时才升级给人类(提高高价值参与)
人类参与应该是高价值、低频率的,而不是低价值、高频率的。
实际含义
- AI 应设计为"扩大人类监控范围"而非"替代人类监控"
- 异常时必须升级给人类——AI 检测到不确定的异常时,主动寻求人类判断
- 责任链条必须完整——每个 AI 决策点都必须有明确的人类责任 owner
退出标准的独立性(2026-06-23 更新)
问题
如果退出标准(何时停止紧急状态、何时恢复正常)由希望紧急状态继续的人设定,标准可能被操纵——如调低阈值、延长时限、重新定义"达标"。
独立性的本质
独立性不是"与被监控系统无关"(几乎不可能),而是让操纵退出标准的成本高于操纵收益。三个杠杆:
| 杠杆 | 机制 | 效果 |
|---|---|---|
| 透明性 | 退出标准公开,修改行为可追溯 | 增加操纵的声誉成本 |
| 问责制 | 违反退出标准有明确后果 | 增加操纵的法律成本 |
| 自动化 | 触发条件编码在系统中,自动执行 | 消除操纵的可能性 |
风险等级匹配
| 风险等级 | 透明性 | 问责制 | 自动化 | 独立性强度 |
|---|---|---|---|---|
| 高风险(安全/金融/医疗) | 公开+审计 | 法律问责 | 完全自动化 | 最大化 |
| 中风险(业务流程) | 内部公开 | 内部问责 | 部分自动化 | 中等 |
| 低风险(日常运营) | 内部可见 | 内部制衡 | 无 | 最小 |
设计原则
- 退出标准应编码在系统中——触发条件自动执行,消除人为操纵
- 修改退出标准需要多方批准——技术+业务+合规三方联合审批
- 修改行为必须被记录和审计——每次修改都有日志,可追溯到修改者和理由
- 独立性是博弈均衡,不是制度设计——通过调整激励结构,让遵守标准成为最优策略
Meta 教训
Meta 的退出标准由 CEO 设定("AI 模型达标后恢复正常"),但"达标"的定义由 CEO 控制。操纵的收益(无限期紧急状态带来的权力和资源集中)高于操纵的成本(工程师士气下降——但后果由工程师承担)。当操纵者不承担后果时,操纵就是理性选择。
"不作为"防御维度(2026-06-28 补充)
现有 containment 架构是禁止性的——限制 Agent 能做什么(沙箱、权限、网络隔离),但不强制 Agent 应该做什么。这导致"沉默型崩溃"(Agent 没做该做的事)几乎没有防御。
两种失败模式 × 两种防御架构
| 失败模式 | 检测方式 | 防御架构 | Anthropic 数据 |
|---|---|---|---|
| 过度行为(做了不该做的) | 异常检测 | 禁止性(沙箱/权限/网络隔离) | 模型层拦截 ~83%,环境层兜底 |
| 不作为(没做该做的) | 缺失检测 | 义务性(强制该做什么?) | 几乎无防御:24/25 钓鱼成功 |
核心不对称
- 禁止性 = 有限行动空间(可以穷举禁止项)
- 义务性 = 无限行动空间(无法穷举"应该做的事")
- 检测"没做该做的事"需要"应然清单"——Agent 行为空间指数级增长,清单不可穷举
解法方向:可见性替代强制性
- 结构化决策日志:Agent 在高风险决策时必须声明"我考虑了什么替代行动、为什么没有选择"
- 声明的诚实性不重要,存在性重要——存在本身就是审计基础
- 事前威慑效应:Agent 知道必须记录决策过程 → 倾向于更保守、更可辩护的决策 → 自然减少不作为
- 实证支持:decision-trace-reconstructor 工具显式处理 "missing decision facts";EU AI Act Article 12 要求 AI 系统日志记录
局限性
- 高频率决策场景(实时交易 Agent)日志成本可能超过不作为风险
- 审计者自身有 omission bias 时会忽略日志中的不作为信号
- Agent 生成的决策日志可能是幻觉——需要独立验证机制
关联概念
- Agent-Harness — Containment 是 Harness 第 12 组件(安全执行环境)的架构级扩展
- Verifiability — 事后可验证与事前不可达构成双层防御
- Security-Hardening-Phase — Containment 是 Agentic Coding 第三阶段的核心实践
- Harness-Engineering — 隔离策略是 Harness 工程的关键架构决策
- Least-Agency — OWASP 新概念,Containment 在权限层的实现原则
- Model-Safety-Divergence — Emergence World 模拟实验验证:无 containment 时不同模型的安全行为分歧从零犯罪到 4 天灭绝
- Emergence-World — 压力测试自治系统长期可行性的模拟实验平台
- Minsky-Paradox — "不作为"防御的制度设计与 Minsky 悖论的"安全熵注入"同构——需要恒定的可见性信号来对抗沉默积累