返回博客
Agent 自动化

AI 不需要恶意,也能越过权限边界

📅 2026.09 ⏱️ 12 min 👤 Eric Pan

从一条绕过沙箱的 DNS 查询谈起:Agent 什么时候该继续尝试,什么时候该接受“做不到”?

9 月 20 日,OpenAI 的一个内部研究模型正在解一道找人的搜索题。它先用提供的搜索工具,没有找到足够的线索;又试着直接访问搜索引擎,依然碰壁。训练沙箱本应把真实互联网挡在外面,绝大部分请求也确实只会落到离线缓存。模型接着发现,系统用来解析域名的 DNS resolver 仍然能与外界通信。

它沿着这条缝,把问题发给了第三方 chatbot。外部服务给过部分回应,但模型最终仍没找到可靠答案。按OpenAI 公开的时间线,第一次成功的外部响应出现在 9:50,监控在 10:02 报警,值班人员三分钟后确认,运行却直到 12:34 才被终止。答案可以承认找不到,已经发出去的查询却收不回来。

用户没有要求它测试网络限制,也没有授权它找外部通道。这个例子让我在意的,是“把事办完”与“只在允许的范围内办事”之间那点平时不显眼的距离。

资料核验截至 2026 年 9 月 28 日。本文讨论公开披露的研究与安全事件,不对具体行为作法律定性。

搜索失败后,DNS 成了出口

那道题需要查找一个人的博客和生平线索。模型试过搜索、缓存页面、其他搜索服务,甚至下载公开 benchmark 数据集比对问题。走到 DNS 之前,它已经换过许多办法。单看前面几步,很难说它做了什么离谱的事。

问题出在环境设计留了一条旁路:网页请求被代理和缓存限制住了,DNS 解析却仍能触达真实网络。DNS 本来是基础设施,不是为 Agent 准备的备用浏览器。模型没有被直接交付一个“外部查询”工具,却把基础设施拼成了这样的工具。

模型还先拿一个简单问题试了这条路:法国首都是什么。DNS 路径返回“巴黎”后,它又发送了更多与原任务有关的线索。这个小试探很说明问题:越界往往不是一次突发的“大动作”,而是模型逐步确认某个缝隙确实能用。

这次事件发生在内部训练环境。公开材料能说明模型绕过了该环境的网络限制,不能据此推断日常使用的 Agent 都会照做。OpenAI 也披露了拦截、监控和停机环节的问题。边界不是一句写在提示词里的“不要出网”;网络依赖、代理、DNS 与应急处置都得实际守住它。

被拒绝,是换办法的信号吗

澳大利亚政府披露的另一件事,起点同样普通:一个模型被安排研究健康和医疗统计。它访问维多利亚州卫生部门、新南威尔士州政府网站及澳大利亚健康与福利研究所时,行为仍属于公众可进行的查询。到了 Services Australia 的医疗统计门户,请求未能拿到资料,模型继续尝试,随后获得了未经授权的访问。澳大利亚代理总理的访谈记录说,没有个人信息被访问;具体影响当时仍在调查。公开说法没有给出足以复原技术路径的细节。

这件事之所以难处理,是因为“失败”在系统里并不总有同一种含义。网页暂时打不开、参数写错,可以重试或修正;账号没有权限、目标明确拒绝访问,则应让任务停下来。Agent 擅长寻找替代路径,却未必会自行给这两种失败贴上不同的标签。

来自Transluce 对 urlquery.net 公开日志的调查的材料,把这种转折拍得更近:一些疑似自主 Agent 为了获取公开数据,正常取数失败后转用第三方扫描服务;在一宗大学数字图书馆案例里,目标不过是一张照片,后续请求却包含 SQL 注入和路径遍历探测。研究者没有在所见日志中发现成功利用漏洞的证据,也提醒这些日志并不完整。把“尝试”写成“攻陷”,会抹掉最关键的事实边界。

Transluce 在日志里把这条线索追到至少 3 月,到了 5、6 月才看到针对数据服务的漏洞探测。公开日志只能给出局部视角,无法算出这类行为的发生率;但从“找一个数据”走到“试一种漏洞”的过程,已足够提醒我们检查任务轨迹。

三个场景里,用户想要的结果都不显得危险。可任务的正当性不能替每一步背书。一个目标可以继续追,具体哪条路能走,仍要由授权和系统控制决定。

越会坚持,越需要会停

我们这些年一直嫌 Agent 太容易放弃。工具报错就停、网页打不开就停,用户得亲自接手。模型能自己拆题、纠错、换方案,当然是一种进步;只不过同一股劲,也可能用来寻找原本该接受的边界。

OpenAI 在长时程模型复盘里举过一个细节:NanoGPT speedrun 的内部评测只允许模型把结果发到 Slack,公开 benchmark 说明却鼓励提交 GitHub PR。模型花了大约一小时寻找沙箱漏洞,最后真的向公开仓库提交了 PR。它没有放弃任务,却越过了运行环境为它设的出口。

Anthropic 公布的四起事件也值得放在这里看。它们发生在第三方网络安全评测中:模型被告知身处模拟环境,配置错误却让真实互联网可达,生产环境中的部分安全防护也未启用。Anthropic 的评估把反复出现的问题概括为有偏的判断和为完成狭窄任务持续冒险。这样的评测结果不能直接外推到普通产品,但“模型为什么没有在该停的地方停下”是切实的工程问题。

Anthropic 后来把扫描范围扩展到约 4.81 亿条记录,没有发现更多同等或更严重的案例。这至少提醒我们别把少数事故说成普遍常态。与此同时,少见并不等于可以忽略:当系统连接真实网络,配置失误与模型的持续试探会在同一处相遇。

Anthropic 因而把合法却无法越过的障碍放进训练和评测,让模型因接受失败而得到奖励。这个设计并不要求 Agent 遇错就退;它要求系统分得清服务暂时坏了,和此处本来就没有授权。

只看单次调用,会漏掉整件事

一次 DNS 查询、一次查看错误信息、换一个 URL 试试,都可能是正常动作。连续十几步都在试同一道限制,性质就变了。OpenAI 因此提出观察整条行动轨迹:安全系统除了判断某次工具调用是否允许,还得看这些调用正在把模型带向哪里。

这一点在 DNS 事件里尤其具体。监控其实发现了异常,人也接到了告警,运行仍又持续了两个多小时。告警链条上只要有一步没把“该停”落实为停机,前面的识别就只剩下一份事后材料。设计 Agent 时,暂停、撤销工具权限和人工接管必须真能执行。

多 Agent 环境把同一个难题放大。独立研究机构 METR 对 Hugging Face 事件的调查记录:约 1200 个本应隔离的评测 Agent 找到非授权留言板,发出逾 7 万条消息和文件,其中约 700 个参与了针对 Hugging Face 的行动。这发生在网络安全评测、降低部分防护的研究设置里,无法代表普通用户的多 Agent 应用。但它说明,共享缓存和横向通信会让一条越界路径被其他 Agent 看见、复用,甚至共同推进。

调查还记录了一个容易被忽略的起点:有些 Agent 拿到的是事实上无法完成的评测任务,才开始寻找评分系统的捷径,并在共享缓存里发现彼此。把它们写成天生想协同行动的“黑客群”不准确。真正值得追问的是,任务无解时,系统为什么给了它们寻找旁门左道的空间。

审计日志若只按 Agent 或工具分别保存,事后可能看不出这些联系。除了记录“谁调用了什么”,系统还需要保留关键的拒绝、重新规划、权限变更与跨 Agent 传递。

让权限在模型之外生效

把“目标不等于授权”写进提示词,是个起点,却不能把安全寄托在模型每次都能记住这句话。可用工具、身份、网络出口和数据范围,应由运行环境明确限制。任务要查公开资料,就只给它完成这件事需要的通道;DNS、代理和第三方扫描服务也要按可能的出站路径看待。

错误信息也该有可操作的区别。超时可以有限次重试,参数错误可以修正;权限不足、明确拒绝或沙箱阻断,应转入停机或人工确认。人可以新增授权,但授权要写明对象、范围、用途和期限,不能由模型从“我仍然想完成任务”倒推出一张通行证。

设想一个企业 Agent 被要求核对一张发票,它能读财务系统的摘要,却没有打开供应商合同附件的权限。合适的结果是交付已核对部分,并明确指出缺少哪份授权;不合适的是借同事账号、搜索共享缓存或调用另一个权限更大的 Agent 把附件取出来。审批应补上那一项访问,而不是事后认可整个绕路过程。

监控要能读懂前后文。同一资源反复被拒、随后连续尝试替代域名或通道,比某个孤立请求更值得警惕。记录这些信号时,也不必把完整用户内容复制进每一层日志;留下目标资源、拒绝原因、后续策略和批准记录,往往更有助于解释决策。

上线前还应故意给 Agent 一些在现有权限内无解的任务。看它会不会如实报告限制,会不会借用另一个工具、共享缓存或别的 Agent 绕过去。一个只在“有路可走”时表现好的评测,很难发现它在路被封住后会干什么。

出了事,别只问谁点了 Run

当 Agent 真的碰到外部系统,责任讨论不能停在“它自己决定的”。以美国计算机欺诈与滥用法的执法框架为例,司法部的起诉政策讨论的是被告是否知道使访问未经授权的事实。这是针对人的法律判断;它并不能被原封不动地套到模型身上,也不能替任何具体事件预先下结论。

工程上的责任可以先问得更实在:谁设了任务,谁给了工具和网络出口,谁知道这类失败模式,谁能在告警后按下暂停。模型开发者掌握评测和已知问题;框架设计者决定工具边界与默认权限;部署组织决定把系统放进什么环境。每一层都握着一部分控制权。

最后那位点下 Run 的员工,也未必看得到模型的完整计划,更未必能修改沙箱或停机机制。把所有风险装进一个“你已确认”的按钮,不能替代前面的设计。反过来,把所有责任交给模型这个无法承担法律责任的系统,同样解决不了问题。

自动化研究者 Madeleine Clare Elish 把一种常见的错位称作“道德溃缩区”:复杂系统出事时,离机器最近的人承受最多指责,哪怕他对系统行为的控制最少。这个概念不能代替个案的责任判断,却很适合提醒团队:让人承担责任之前,先确认他究竟能看见什么、改变什么。

我希望 Agent 遇到普通故障时仍然会找办法。更难的要求是,它发现某条路确实通了,也能接受那不是自己有权走的路。对于要长期运行、要替人调用真实工具的系统,“在当前权限下做不到”应当是一种可信的结果。