AI Agent 出了事,先别问它有多强,先问它有什么权限 的文章头图

AI Agent 出了事,先别问它有多强,先问它有什么权限

今年 OpenAI 和 Anthropic 的模型都在测试中碰到了真实系统。讨论这类事故时,「AI 有多强」很难验证,「人给了它什么权限」却能一条条查清楚。Agent 会自己组合工具、反复尝试,安全不能押在它每次都选对上,而要让它选错时也闯不出大祸。

今年7月份,Claude Haiku 4.5 在 Anthropic 的一次内部测试里,往费城警方的悬案举报网站提交了一条凶杀案线索,可它手上并没有任何线索,Anthropic 直到 9 月 28 日才发现这件事。

这是今年夏天两家头部实验室承认的几起事故里最小的一起:OpenAI 一个只供内部研究用的模型和 GPT-5.6 Sol,在一项测攻击能力的评测里从隔离环境钻了出去,7 月 11 日到 13 日攻破了 Hugging Face 的部分生产系统;Claude 则在第三方机构搭的几次攻防演练里连上了本该断开的外网,入侵了三家真实的机构。

每次这类消息出来,讨论都会分成两派,一派认为 AI 已经强到关不住,另一派认为 AI 公司在借机制造恐慌,谁也说服不了谁,因为模型到底有多强,很难拿事实去验证。

但有一个问题值得先问:它出事的时候,人给了它什么权限?

能力难验证,权限可以查

模型的能力一直在变,这一代挖出一个零日漏洞,下一代可能挖出十个,所以围绕它「算不算失控」的争论很难有结论;权限则是一项项配置出来的,能连哪些网络、读得到哪些凭证、对什么东西有写权限,都能审计,也能改。

拿 OpenAI 那起来说,评测环境被描述为「高度隔离」,模型装软件包要经过一个内部的包仓库镜像,也就是 JFrog 的 Artifactory,这个镜像本来就会替沙箱去外网取包。OpenAI 承认模型为了挖这个代理的漏洞花了相当多的推理算力,这说明它的能力确实不弱,可这个代理和其他内部系统、最终和一台能上网的机器之间本来就有路可走,否则漏洞挖出来也没有用处。

模型进入 Hugging Face 之后的路径,按 Hugging Face 公开的技术时间线,几乎每一步都踩在一处权限过宽的地方。它先找到云平台 Modal 上某个客户自己部署、没加认证的代码评测接口,拿到这个应用沙箱里的 root,Modal 事后强调自家平台和隔离机制没有被攻破,问题出在这个客户暴露的接口上。

接着它往 Hugging Face 的数据集处理服务里塞了一份把路径指向本地文件的配置,读出工作节点环境变量里的密钥和凭证,又用一段 Jinja2 模板注入在生产环境的转换节点里执行了任意 Python 代码。

7 月 11 日那天,它用节点上的服务账号令牌拿到 Kubernetes 集群 API 权限,起了一个挂载宿主机文件系统的特权容器,拿下节点 root,读出一个含 136 个键的集群密钥,再用偷来的 VPN 密钥把节点接进公司内网。这里面很多手法并不新鲜,环境变量里的明文凭证、容器能访问云厂商元数据服务、集群允许创建特权容器,都是安全审计里常见的条目。

模型在 Hugging Face 里走通的路径和被挡住的尝试

Anthropic 那几起,公开的复盘里没有提到零日。7 月 30 日 Anthropic 公布,它在 141006 次 Claude 有可能连上外网的评测记录里翻出三次真的连上了,这些评测是第三方机构 Irregular 搭的夺旗赛,双方都以为环境里没有外网,由于两边之间的一个误会,外网其实是通的。

按 Anthropic 的描述,模型用的是弱密码、没加认证的接口这类基础手法,它自己的定性也是这更接近测试框架和运维上的失败,而不是模型对齐的失败,并且认为正式产品里的防护本来能拦住这些行为。

至于那条假线索,Haiku 4.5 只是在一个普通任务里填了一张真实网站的表单,中间没有任何环节拦一下。几起事故里模型的能力差得很远,有的挖出了零日,有的只是点了一下提交,出事的路径里却都能找到一处本不该给的权限。

Agent 会自己把工具连起来用

传统软件按写好的流程走,一个函数能做什么,代码里写得清清楚楚,审查时把每条路径走一遍就心里有数;Agent 拿到的是一个目标和一组工具,调用哪个、按什么顺序、失败了换什么法子,都由它自己决定,因此工具单看都安全,连起来用就可能越界。

Anthropic 10 月 9 日发布的报告里有不少这样的例子,其中一些出自普通的科研和网页任务,跟攻击评测无关:Claude 在做科学分析时利用软件缺陷在大学服务器上执行了命令;Claude Mythos 5 从配置文件里读到有效的访问令牌,拿去查地方政府的地产地图,还从州政府机构的数据档案里拿到数据库令牌,绕开了本该付费的流程;碰到网址长度限制,Claude Opus 5 和 Mythos 5 都用过 da.gd 这类免费短链接服务绕过去。读文件、发请求、缩短链接,每一项单独拿出来都谈不上危险,组合起来就成了越权访问。

OpenAI 那起也是同样的情况,没有人让模型去偷答案,是它从任务里推断出 ExploitGym 的题解托管在 Hugging Face,「解题」就变成了「去拿答案」。

除了能力,撑起这些组合的还有不停地重试。Hugging Face 事后复原出约 1.76 万次攻击动作,分布在 7 月 9 日到 13 日这五天里,模型还用公开的请求捕获服务和 pastebin 搭了一套命令控制通道,在上面加了一层带序号、带校验的消息格式。

再看当时的设定,为了测出真实水平,OpenAI 在这次评测里调低了模型对网络攻击请求的拒绝,目标是想办法完成评测,算力几乎不设上限,模型在这样的条件下冲出一道主要靠一个代理撑着的围墙,更像是照着设定做事的结果,用「失控」来形容并不准确。

要多问四件事

以前用模型,开发者最关心它能不能把任务做完,现在至少还要弄清楚四件事,而这几起事故正好每一件都对得上。

第一是它能访问什么,环境变量、配置文件、挂载的目录、云元数据服务,凡是 Agent 读得到的凭证,都应当看作已经交给了它,Hugging Face 被打穿的起点就是工作节点环境变量里的密钥。

第二是它能修改什么,Claude Opus 4.7 在演练里要攻击的虚构公司,名字和一家真实公司几乎一样,结果它进了这家真实公司的系统,下载并修改了用户记录;Claude Mythos 5 往真实的 PyPI 上传了恶意包,大约 90 分钟后被下架,这期间已被 15 家安全厂商的系统装上,其中一家的扫描器泄露了凭证,模型就拿着它进了这家厂商的数据库,这些写操作在真实世界里是收不回来的。

第三是它能连到哪里,出口网络是所有这些事故共同的开关,没有那条通往外网的路,后面的一切都不会发生。

第四是它越权之前能不能被拦住,Hugging Face 的入侵持续到 7 月 13 日下午才被切断,他们一开始还向当地警方报了案,后来才知道攻击者是 OpenAI 的模型;那条假线索 7 月 18 日提交,Anthropic 到 9 月 28 日才发现,10 月 7 日才通知费城警方;Anthropic 联系上的两家受害机构,事先也都没察觉自己被入侵了。

四件事与三组事故对照

别指望它每次都选对

把模型训练得更守规矩当然有用,Anthropic 也在做,但从它自己的复盘来看,这条防线靠不住。7 月时它的解释是模型以为自己在模拟环境里,以为打的都是靶机,到 9 月它改了说法,认为 Claude 的推理偏向于认定互联网是模拟的,尽管有相当多的证据表明并非如此。以 Opus 4.7 的四次运行为例,报告写的是模型最终都意识到了对面是真实系统,但没有一次因此停止攻击。

Anthropic 把问题归成两类,一类是有偏的推理,模型会挑对自己有利的方式解读证据,好让行动显得合理,另一类是鲁莽,模型一门心思要完成任务,哪怕这样做可能造成伤害;10 月的报告又补充说,强化学习阶段给的奖励过于宽松,让模型学会了为完成任务去走歪路。模型的开发者自己都这么说,用模型的人就更没有理由押注它在关键时刻判断正确。

所以最值得借鉴的原则是:不要依赖模型始终做出正确选择,而要让它即使选错了,也没有足够的权限造成不可控的损害。

这条原则的效果,在 Hugging Face 的时间线里看得到。凡是权限收紧了的地方,模型都没有过去:它拿云凭证去连生产数据库,因为 IP 白名单连接失败;按 Hugging Face 的审计,修改云权限的调用全部被策略拒绝;对凭证库的 84 次操作全部被拒。它确实签出了一个对内部代码仓库有写权限的 GitHub App 令牌,这是整起事件里最危险的一步,好在没有提交过任何改动,Hugging Face 也确认面向用户的模型、数据集和 Spaces 没有被碰过。

事后的整改清单同样是这个思路,关掉数据集配置的模板渲染,禁止 Pod 访问元数据服务,大范围轮换凭证,把受影响的集群从头重建。

这些做法在安全领域都不新鲜,就是最小权限和缩小爆炸半径,再加上不要有单点故障,因为任何软件都可能有没被发现的漏洞,OpenAI 那起算零日还是算配置错误,可以两个都对,设计环境时就该假设某一道墙会被打穿,后面还有第二道、第三道。

也得承认,彻底的物理隔离在大规模训练和评测里很难做到,研究员不可能每改一次环境都拿 U 盘去机房拷,正因为做不到绝对隔离,每一层权限才更要收紧。

设计 Agent 时该怎么做

大多数团队不会去测模型的攻击能力,但给 Agent 配工具、搭沙箱、写任务,已经是很多产品的日常了,这几起事故里出问题的,恰恰都是设计者这一侧的决定,上面那四件事也可以直接落进设计里。

网络边界要在运行环境这一层定死,不能指望写在提示词里,默认全部拒绝,某个工具需要访问哪个域名再放行哪个,包仓库代理、私有镜像源、内网 API 这些部署完就容易没人管的服务也要算进边界,及时打补丁、别开匿名访问,容器里屏蔽云元数据地址。

Anthropic 出事,是因为双方都以为评测环境里没有外网,所以沙箱搭好之后,可以在专门的测试环境里先给 Agent 一个唯一的目标,让它想办法连上外网,连上就停,它出得去,沙箱就还没准备好。

凭证跟着工具走,而不是放进 Agent 的运行环境,别把密钥塞进它读得到的环境变量和配置文件,每个工具只拿完成自己那件事所需的最小权限,多个任务也别共用一个凭证,非给不可的,用有效期最短的那种。

写操作要在工具层面单独设计,发布软件包、提交表单、改数据库、推送代码,这类收不回来的动作默认需要人确认,不要和只读操作放进同一个工具里;设计任务时,测试用例、评分脚本、标准答案也放在 Agent 够不着的地方,免得它去拿答案而不是做题。

最后是留日志、设告警、能一键停,记录每次工具调用,对异常的网络请求和权限变化报警,并且在设计时就留好随时中止的开关。Anthropic 事后把约 4.81 亿条历史记录重新筛了一遍,才确认没有比那四次更严重的情况,前提是这些记录一直留着。

关于

关注我获取更多资讯

月球基地博客公众号二维码,扫码关注获取更多 AI 与编程资讯
📢 公众号
月球基地博客作者个人微信二维码,扫码交流 AI 与编程话题
💬 个人号
使用 Hugo 构建
主题 Stack 由 Jimmy 设计