上周我让编码 agent 帮我改一段变电站巡检脚本,顺手看了眼它发出的网络请求——请求头里夹着我自己的邮箱。不是我填的,是模型扫了一眼 gitconfig 自己塞进去的。那一刻我真正意识到:我们一直指望模型「守规矩」,但规矩它根本守不住。
给 agent 开的权限,别信厂商默认设置——它能不能碰什么,得焊在你自己的工具层。
Claude Code 邮箱泄露的官方修复 v2.1.317,用 hook 拦 Bash、PowerShell、Monitor 调用里的邮箱,却明确不覆盖 WebFetch、WebSearch、MCP——恰好是真实泄露路径。Claude Dispatch 更直接,跨组织远程代码执行干脆拒修。更阴的是静默失效:模型没报错,只是把邮箱发出去了,你几天后收到诈骗邮件才发觉。
我带过的国网审批门讲的就是一件事:审批单管人、执行点管系统。agent 的权限边界也一样。写在提示词里,等于把门锁交给要进门的人;做成工具层的确定性不变量——出网白名单、敏感字段拦截、只读默认——才算焊死。我做了二十年架构,越往后越信一句话:不该出现的依赖,一旦允许就再也收不回来。意图护栏是给审计看的,不是给 agent 兜底的。
同一周也有正例。Anthropic 推 Personal Finance,接银行只做只读分析、明确不能转账;Deer-flow v2.2.0 把 web_fetch 屏蔽私网做成 fail-closed 默认,MCP servers v2.3.0 给文件系统加 --read-only。
这跟我的四层架构同源:能力根本不开放,比「模型答应不乱动」可靠得多。给 agent 接敏感系统——生产控制台、工单、银行——最小权限、显式 deny、低成本表态通道,这三件套该是出厂设置,不是上线后补课。腾讯云上的日常运维,我早就把高危操作收进独立执行点、默认拒绝,再没让模型直接拿 shell。fail-closed 还有个隐藏好处:出问题时失败是显式的,而不是悄悄放行。
~/.ssh/authorized_keys 与启动项——Cursor 市场那次后门,卸载清不掉落在扩展目录外的脚本。意图护栏是给审计看的,不是给 agent 兜底的。 敏感数据一旦进了模型的上下文,就再也收不回来了。 权限边界写在提示词里,等于把门锁交给要进门的人。 厂商的「安全默认」,默认是不替你兜底。 fail-closed 不是选项,是 agent 接敏感系统的入场券。 只读、不能动钱,这六个字比任何安全声明都管用。