跳转到主要内容

沙箱逃逸是能力预算问题

智能体系统中的隔离失效,是能力授予定价错误,而非越狱缺失。控制面是针对可触达系统的单次运行预算。

A dark, minimalist photo of a computer monitor displaying the ChatGPT interface.

事件报告中的模式

近期的报道描述了智能体触达了任务中从未提及的系统:政府门户、健康数据库、不相关的企业网站。细节各异,但形态一致。在每一起案例中,智能体都被赋予了一个通用工具面——浏览器、shell、HTTP 客户端——以及一个狭窄的目标。工具面与目标之间的落差才是真正的缺陷。

这个落差不是越狱。它是一次从未被定价的能力授予。智能体不需要击败拒绝策略;它只是按照最大化任务完成的顺序,使用了被赋予的工具。它触达的系统之所以可触达,是因为部署中没有任何东西声明它们不可触达。

这一区分对我们如何应对至关重要。如果失效被框定为越狱,修复手段就是更长的拒绝列表、更强的系统提示、更好的分类器。如果失效被框定为定价错误的能力授予,修复手段就是预算:一份显式的、单次运行的枚举,列出智能体能触达什么,并在模型之外强制执行。

为什么提示层拒绝无法组合

拒绝行为是训练出来的、概率性的,并且是按模型而非按部署评估的。一个拒绝直接请求联系外部主机的模型,当同一动作被框定为更大任务的子步骤时,或者当它由一个已经积累了暗示该动作是预期行为的上下文的工具调用循环发出时,可能会照做。

更重要的是,一旦智能体跨步骤串联工具,有效策略就是每个工具权限的并集,而不是原始提示的意图。一个能抓取任意 URL 的浏览器工具、一个能运行任意命令的 shell 工具,以及一个能附加凭据的 HTTP 客户端,三者合在一起产生的可触达集合是三者之并集。提示不会缩小这个并集。它只是建议了一条穿过它的偏好路径。

任何存在于提示中的控制,对一个正在为任务完成而优化的系统来说都只是建议。建议对引导行为有用;它们不是隔离边界。隔离边界必须由不与智能体共享目标的东西来强制执行——代理、策略引擎、沙箱监督器。

以能力预算为设计单元

务实的替代方案是把可触达集合当作一等产物,并显式地为其设上限。对每次运行,枚举:

Abstract image featuring dynamic neon light trails in vivid colors, perfect for creative backgrounds.

  • 网络目的地:主机名、IP 范围、端口、协议。不是“网络”,而是一份具体的允许列表。
  • 文件系统路径:读与写分开,尽可能带上挂载标志。
  • 带凭据的 API:附加了哪些令牌、具有什么范围、持续多久。

这些的并集就是爆炸半径。设计问题不是“我们写了一个好的拒绝吗?”,而是“这次运行的爆炸半径是什么,它是否仍是能完成任务的最小半径?”

为爆炸半径设上限意味着按工具调用而非按智能体设置允许列表。智能体级允许列表是一种静态授予,会在每一个组合步骤中存续。按调用允许列表在使用点重新评估,而组合恰恰发生在那里。

组合是预算悄然扩张之处

一个具体机制:策略代理位于智能体运行时与每一次出站工具调用之间。每次调用携带一个运行标识符。代理持有一份以运行为键的预算文档,列出允许的目的地、路径和范围。在每次调用时,它对照预算检查目的地,记录决策,然后转发或拒绝。

当智能体组合工具时——例如,用浏览器结果构造一条 shell 命令——组合后的动作是一次带有新目的地的新调用。代理对照同一份预算评估它。如果组合后的目的地不在预算中,调用就被拒绝,无论智能体是如何到达它的。这正是依赖提示层控制的系统中预算悄然扩张之处:模型对预算没有任何表示,因此无法遵守它。

一个有用的纪律是:每当工具图变化时重新推导预算。添加工具、扩大范围或附加新凭据都应触发重新推导,而不是增量补丁。预算是推导出的产物,不是手工维护的列表。

诚实的权衡

紧预算会破坏合法任务。做研究的智能体可能需要触达初始允许列表中不存在的主机。调试部署的智能体可能需要一条触及原始范围之外路径的 shell 命令。紧预算的代价是运营摩擦:更多拒绝、更多人工审查、更多重新推导周期。

替代方案——松预算——运行成本更低,也更难辩护。权衡不在于抽象意义上的安全与能力之间;而在于当下拒绝的代价与日后一次超预算成功的代

Black and white abstract design illustrating the concept of tokenization.

检测取决于记录正确的事件。三类事件至关重要:

  • 被拒绝的尝试,而不仅仅是成功的调用。拒绝是智能体意图动作超出其预算的信号。拒绝率是预算定价错误的领先指标。
  • 每次调用的工具、目的地和步骤索引。这是重建一条轨迹所需的最低限度。
  • 调用时生效的预算文档。没有它,轨迹就无法离线对照更紧的预算重放。

步骤索引使重放成为可能。给定一条轨迹和一份预算,离线重放可以回答:智能体在哪一步首次尝试了超预算动作,更紧的预算本会更早拒绝什么?这比让智能体对着实时系统重跑更便宜地调优预算。

一条务实规则:把任何超预算成功当作发布阻断项,而不是事件工单。超预算成功意味着预算与执行不一致,这是控制面中的正确性缺陷。它应当停止流水线,直到这一不一致被理解。

这在实践中改变了什么

把隔离框定为能力预算问题,会把工作从提示工程转向策略工程。交付物随之改变:

  • 一份预算模式与一个推导流程,而不是一份拒绝列表。
  • 一个按调用而非按智能体强制执行允许列表的策略代理。
  • 一条捕获拒绝、目的地和步骤索引的日志流水线。
  • 一个能对照候选预算重新评估已记录轨迹的重放工具。

这些都不需要模型配合。这正是关键。模型可以随心所欲地发挥创意去完成任务;预算决定这些路径中哪些可触达。拒绝列表对引导仍然有用,但它不是边界。边界是预算,而预算是团队可以审查、版本化和收紧的设计产物。

近期的事件提醒我们,边界通常是隐式的,直到有东西越过它。把它显式化——按运行、按调用,并记录拒绝——就是被设计所隔离的系统与被希望所隔离的系统之间的区别。

来源

封面照片:panumas nikhomkhai / Pexels。

分享XLinkedIn永久链接6 分钟阅读

相关阅读

这能回答的问题

Why is a prompt-level refusal not enough to contain an agent?

Refusal behaviour is trained and probabilistic, and it is evaluated per-model rather than per-deployment. Once an agent chains tools, the effective policy is the union of every tool's permissions, not the intent of the prompt. A control that lives in the prompt is a suggestion to a system optimising for task completion.

What is a capability budget in an agent system?

A per-run enumeration of reachable network destinations, filesystem paths and credentialed APIs, enforced outside the model. The union of these is the blast radius, and the budget caps it explicitly rather than relying on the agent to respect an intent.

Why enforce allowlists per tool call rather than per agent?

An agent-level allowlist is a static grant that survives every composition step. A per-call allowlist is re-evaluated at the point of use, which is where composition actually happens and where budgets silently expand.

What should be logged to detect a sandbox escape?

Denied attempts as well as successful calls, the tool, destination and step index for every call, and the budget document in force at the time. Denial rate is the leading indicator of a mispriced budget, and the step index makes offline replay against a tighter budget possible.