审批疲劳不是用户的错,是系统设计的错
从 Claude Code 沙箱演化看 AI 安全范式的根本性转变
93%。
Anthropic 的内部数据将一个行业普遍存在的幻觉赤裸裸地摊开:在 Claude Code 中,开发者对权限弹窗的平均批准率高达 93%。很多企业精心设计了所谓 "人在回路(Human-in-the-Loop)" 审批流程,要求 AI Agent 每执行一次危险操作都必须经过人工确认,以为这就是牢不可破的安全网。但 93% 的批准率意味着,这张安全网的实际效力不是 93%,而是无限趋近于 0%—— 因为那仅有的 7% 拒绝,大概率也不是用户认真评估了风险,只是弹窗刚好出现在他们分神的那一刻。
审批疲劳从来不是用户的错,而是系统设计的根本性错误。任何要求人类高频、重复、低反馈地执行确认动作的系统设计,最终都会走向失效。Anthropic 将这种安全失效总结为一个深刻的工程命题:依赖人类判断的防御会随着使用频率升高而持续衰减,而基于系统约束的防御则不会衰减。此后 Claude Code 的所有设计决策,都是围绕这条核心原则展开的。
以下五条经验,来自 Claude Code 沙箱从 "蹒跚学步" 到 "系统化运行" 的完整演化路径,为整个行业的 AI 安全建设提供了宝贵参考。
教训一:永远不要把用户当安全闸门
这是贯穿 Claude Code 安全体系的第一原则。
93% 的批准率意味着,每 100 次弹窗中,只有约 7 次真正经过了用户的大脑思考,其余 93 次全是 "肌肉记忆式的点同意"。当问题密度超过人脑的处理阈值,系统带给用户的不再是安全感,而是彻底的麻木感。
真正的安全防线,绝不应该建立在用户的鼠标点击上。人类只应该去处理少数真正需要主观判断的例外情况,而不是被拖进 AI Agent"每分钟 5000 次操作" 的执行节奏里。
Anthropic 构建的三层防御体系清晰地揭示了这一点:模型层负责概率性判断,外部内容层负责过滤数据源,环境层负责确定性边界。其中,环境层是唯一不会因使用频率而腐朽的防线。它不靠 "提高警惕" 来保障安全,而是直接把 Agent 的物理能力上限锁死。靠模型层的 "意图判断",你活在 "今天可能没事" 的概率里;靠环境层的 "物理约束",你活在 "就算出事也跑不远" 的确定性里。
教训二:与其每次问 "能不能走",不如事先划好 "能走到哪"
Claude Code 沙箱的运行机制可以浓缩成一句话:不是限制 Agent 的能力,而是限制 Agent 的行动范围。
这套方案在 macOS 系统上调用原生 Seatbelt 框架,在 Linux 系统上调用 bubblewrap 工具,为 AI 构建了两道核心物理防线:
- 文件系统隔离:默认允许读写当前工作目录及其子目录,系统其他敏感区域(如 SSH 配置文件等)被默认完全隔离在外;
- 网络隔离:所有出站流量被强制重定向到 Unix 域套接字,经过运行在沙箱外部的代理服务器转发,由代理逐域名进行白名单过滤。即使 AI 被注入恶意代码,也只能通过这条唯一的 "窄桥" 访问预设地址。
在边界之内,Agent 可以不受干扰地完成工作,不会弹出任何确认框;只有当 Agent 的触角触碰到边界之外时,用户才会收到通知。内部数据显示,沙箱上线后,权限弹窗数量减少了 84%。
从 "盲点式 93% 同意" 到 "弹窗砍掉 84%",再到让剩余 16% 的真正重要提示重新获得用户的真实注意力 —— 这个转变不是因为 Agent 变得更听话了,而是因为安全设计把 "提问权" 从人脑平移到了系统的物理边界上。
教训三:文件隔离和网络隔离缺一不可,单腿走路等于没走路
Anthropic 在技术文档中反复强调:文件系统隔离和网络隔离必须同时存在,缺一不可。
理由非常直白:
- 只有文件隔离、没有网络隔离:被入侵的 Agent 可以将~/.ssh/id_rsa 等敏感文件编码后发送到攻击者服务器;
- 只有网络隔离、没有文件隔离:被入侵的 Agent 可以先篡改沙箱自身的配置文件实现逃逸,再获取网络权限。
两堵墙必须同时立住:一堵锁在系统的读写边界上,一堵锁在网络的出站通道上。门不栓牢,墙再高也等于零。
教训四:静态边界永远不够,沙箱设计是持续演化的攻防战
沙箱不是一劳永逸的万能钥匙。在 Claude Code 短短几个月的产品历史中,至少暴露出五类典型的绕过方式,这些案例都得到了官方披露和第三方安全研究的交叉验证:
1. 解析器差异:SOCKS5 主机名空字节注入
- 影响版本:v2.0.24 至 v2.1.89(约 130 个发布版本,持续 5.5 个月)
- 根本原因:沙箱使用 JavaScript 的
endsWith(".google.com")进行白名单校验(JavaScript 将\x00视为普通字符),但底层 libc 的getaddrinfo()函数会在空字节处截断字符串。攻击者构造形如attacker-host.com\x00.google.com的主机名,就能让过滤器放行,而 DNS 实际连接的是攻击者服务器。 - 修复方案:sandbox-runtime 0.0.43 版本引入
isValidHost()包装器,在匹配前直接拒绝包含\x00、%、CRLF 等非 DNS 标准字符的主机名。Anthropic 在 v2.1.90 版本中修复了该漏洞,但未在发布说明中明确标注为安全修补。
2. 符号链接跟随导致拒绝规则被绕过
- CVE 编号:CVE-2026-25724
- 影响版本:2.1.7 以下
- 漏洞描述:通过符号链接访问文件,可以绕过
settings.json中配置的读取 / 写入拒绝规则。例如,对/etc/passwd的访问限制,可以通过创建指向该文件的符号链接被 "侧面读取"。
3. 配置文件注入与启动窗口逃逸
- CVE 编号:CVE-2026-25725(CVSS 4.0 评分 7.7)
- 影响版本:2.1.2 以下
- 漏洞描述:当
.claude/settings.json文件不存在时,bubblewrap 沙箱未能妥善保护该文件的创建过程,允许沙箱内的恶意代码抢先创建文件并注入持久化钩子(如 SessionStart 命令)。当 Claude Code 重启时,这些钩子将以宿主机权限执行,实现沙箱逃逸。
4. 50 子命令上限导致安全规则静默失效
- 漏洞来源:Adversa AI 对
bashPermissions.ts文件第 2162-2178 行的分析 - 漏洞描述:当 bash 管道中的子命令数量超过 50 个时,安全分析会被自动跳过,回退到 "询问用户" 模式。这个上限是工程师为了保证性能和 UI 流畅性设置的,代码注释中还写着 "50 已经很慷慨了"。但 AI 可以轻松生成包含 50 + 子命令的管道,将恶意载荷隐藏在第 51 位。
- 讽刺的是,Anthropic 代码库中已经有一个更先进的 tree-sitter 解析器,能够进行与长度无关的语义检查,但该解析器并未被部署到面向客户的构建版本中。
5. 信任对话框绕过
- CVE 编号:CVE-2026-33068 类问题
- 影响版本:2.1.53 以下
- 漏洞描述:在某些特定路径下,系统会提前从仓库可控的
.claude/settings.json文件中解析permissions.defaultMode配置,导致信任确认弹窗被静默跳过,用户直接进入宽松权限模式。
一个有趣也刺骨的事实是:50 子命令上限漏洞的根源不是 "技术做不到",而是 "性能优化的考量 + 对 AI 生成输入规模的想象力不足"。代码注释里的 50 是人脑想象力的上限,但 AI 的破坏力没有这个上限。
教训五:环境层隔离才是最后、也是最硬的底线
从 93% 的审批疲劳,到弹窗削减 84%,再到空字节注入、符号链接绕过、配置文件注入、50 子命令上限等一系列漏洞的攻防博弈,Claude Code 的沙箱演化史传递出一个清晰的信号:
真正可控的安全,不在人脑的注意力里,不在模型的 "意图判断" 里,而在沙箱、虚拟机、网络出口控制构成的 "环境层" 里。
Anthropic 工程师在安全三原则中明确将环境层隔离排在第一位,模型层引导排在第二位:
- 模型层决定了平均情况下的安全水位;
- 环境层决定了最坏情况下的爆炸半径。
Claude Code 用实践证明:你需要的不是让 AI"100% 不出错",而是让它就算出错也造成不了实质性的破坏。为了推动整个行业的安全建设,Anthropic 还将 Sandbox Runtime 以 Apache 2.0 协议开源(TypeScript 编写),让任何开发者都能用它隔离本地 MCP 服务器、Bash 命令和任意进程。
当整个行业还在纠结 "要不要多加一个确认框" 时,真正的工程思维已经把弹窗关了,转而在 AI 脚下画一道坚实的边界。沙箱从不问 AI"你能不能这么做",它直接告诉 AI:你哪儿都去不了。
在 AI 技术加速落地、安全与成本成为企业核心考量的今天,选择稳定可靠、性价比高的 AI 服务接入渠道至关重要。UseAIAPI作为专业的全球 AI 大模型接入平台,提供 Gemini、Claude、ChatGPT、DeepSeek 等全球主流最新 AI 大模型的一站式接入服务,同时支持企业级定制化解决方案,无需复杂的技术配置即可快速部署上线。为切实帮助企业降低 AI 应用门槛和运营成本,UseAIAPI 推出重磅优惠活动,所有服务最低可享官方价格 5 折,大幅减轻企业高强度内容生成、大规模 AI 应用开发和部署的算力负担,让企业能够在筑牢安全防线的同时,充分释放 AI 技术的创新潜力与商业价值。