跳转到主要内容

隔离不是控制面:逆向解读 Nvidia 的 OpenShell

沙箱能阻止逃逸,却无法界定 agent 被授权尝试什么。Agent 安全需要在运行时之上设置一层权限层,而不是更快的终止开关。

Close-up of a green circuit with intricate patterns on a vibrant red background, ideal for technology themes.

快速终止开关带来的舒适感

诸如 Nvidia 的 OpenShell 之类的运行时隔离平台,被宣传为自主 agent 的安全层。其卖点很直接:agent 进程受到监控,一旦越界——写入被禁止的路径、打开意外的 socket、启动不应启动的进程——平台就会拦截并终止它。据称延迟低至毫秒级。这是一项真正的工程成就,但也是构建安全论证时不该依赖的数字。

隔离只回答一个问题:这次运行是否仍在它的盒子里? 它并不回答真正决定事故严重程度的问题:这次运行本应能够尝试这件事吗? 这一区别并非哲学上的。它关乎一个 agent 试图访问内部元数据端点并被终止,与一个 agent 从未持有能够访问该端点的凭证之间的差异。两者都会产生一条日志。但只有其中一种会造成入侵。

本文认为,隔离平台是一种延迟属性,而非权限属性;agent 安全需要在沙箱之上建立权限模型,而不是在沙箱内部设置更快的终止路径。

隔离究竟带来了什么

从机制上看,隔离平台是一个监督者。它挂载到进程树,通过内核接口监视 syscall 或类 syscall 事件,将其与策略匹配,并在违规时终止。其设计目标是终止时间。缩短它,就能缩小行为异常的 agent 可行动的时间窗口。

这个窗口确实存在,但它也受限于动作本身的速度。文件系统写入在微秒内完成;网络请求在监督者的策略引擎完成评估本可阻止它的规则之前,就已经离开了主机。隔离缩小了暴露面,但并未消除能力。agent 仍然持有句柄、令牌、socket、路径。它使用了它们。平台的贡献是在事后迅速察觉。

缺失的层:能力之前的权限

agent 发起的每一次工具调用都是一次能力授予。当编排器把 read_file 工具交给模型时,它授予的是对该工具实现所能触及内容的读取权限。当它交出 HTTP 客户端时,它授予的是该客户端的凭证和网络策略所允许的出口访问。当它交出 shell 时,它授予的是 shell 所能做的一切的并集。

Detailed view of a computer hard disk circuit board with colorful reflections.

隔离平台很少拥有这些授予。它们位于工具层之下、进程边界处,看到的是授予的效果,而非授予本身。这是一个结构性盲点:平台可以告诉你某个进程打开了一个 socket,却无法告诉你该 agent 本就不该拥有打开 socket 的工具。

权限应属于沙箱之上的策略。具体而言,这意味着定义每次运行的权限预算:

  • 工具面:该次运行可调用的确切工具集合,而非框架恰好暴露的集合。
  • 端点范围:每个工具可联系的主机或服务,以允许列表而非阻止列表表达。
  • 凭证范围:按运行签发的短期、窄范围令牌,使泄露的令牌在运行生命周期之外毫无用处。
  • 支出与速率上限:对运行可消耗的外部资源设定硬性限制,独立于工具所允许的范围。
  • 时间限制:到期后无论运行状态如何,权限即被撤销。

这些都不要求沙箱更快。它们要求编排器在 agent 运行之前,成为决定 agent 是什么的东西。将权限与隔离分离,还能让你独立于逃逸概率来推理爆炸半径。一个没有网络权限的运行,其网络事故的爆炸半径为零,无论 agent 多么擅长逃逸进程边界。这比“我们本会在十毫秒内终止它”是更强的陈述。

一种参考分解

三层,各司其职。

沙箱。 文件系统隔离、网络命名空间隔离、进程隔离、资源限制。沙箱的职责是让逃逸代价高昂且可观测。它是最后一道防线,而非第一道。

权限。 范围化凭证、出口允许列表、支出上限、工具面收窄、按运行到期。权限层的职责是让未授权能力不可用,而不仅仅是可检测。有趣的工程就在这里:一个签发按运行令牌的凭证代理,一个根据声明意图解析运行工具面的策略引擎,一个在网络边缘而非 agent 进程内执行主机允许列表的出口代理。

遥测。 意图日志与轨迹记录。对每次工具调用:agent 声称在做什么、它调用了什么权限、策略引擎决定了什么,以及工具实际做了什么。正是这一点让权限决策在事后uit-board-macro-62542d-755b13.jpg)

Detailed view of a Raspberry Pi circuit board with microchips and components.

权衡是真实存在的,值得直言。权限执行会增加摩擦。收窄的工具面意味着 agent 在合法任务上更频繁地失败,因为框架的默认工具面比任务所需更宽,而无人修剪。短期凭证意味着更多的代理往返,以及代理不可用时的新故障模式。出口允许列表意味着每一次新集成都是一次策略变更,而非代码变更。采用权限层的团队通常会看到 agent 任务失败率短期上升,直到策略面稳定下来。这一成本,是把安全保证从“我们本会注意到”转变为“它本不可能发生”所付出的代价。

该测量什么

隔离指标与权限指标回答不同的问题,将它们混为一谈会掩盖真正重要的信号。

  • 每千次运行被阻止的逃逸尝试是隔离指标。它衡量沙箱监督者触发的频率。数字高可能表明 agent 行为激进、策略配置错误,或两者兼有。它并不说明 agent 被授权做什么。
  • 每千次运行的未授权能力尝试是权限指标。它统计 agent 试图调用它并不持有的工具、访问端点或动用预算的次数。这才是预测事故的数字,因为它衡量的是 agent 认为自己能做什么与实际被授予什么之间的差距。

第二个指标更难收集,因为它要求权限层在决策点而非效果点记录拒绝。这正是它更具信息量的原因。一个能够报告自身权限拒绝的系统,其权限模型足够明确,可供推理。

控制面在沙箱之上

隔离平台是有用的。它们缩小了行为异常的 agent 可行动的时间窗口,并为其他所有层都失效的情况提供了硬性停止。但硬性停止是后备手段,不是控制面。控制面是在 agent 运行之前所做的一系列决策:它持有哪些工具、携带哪些凭证、能访问哪些端点、能花费多少,以及这一切何时到期。

逆向解读 OpenShell 表明,行业正在汇聚于出色的隔离,却在权限上投入不足。解决办法不是更快的终止开关,而是一层策略,让终止开关对真正重要的事故变得不必要。

封面照片:panumas nikhomkhai / Pexels。

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

相关阅读

这能回答的问题

Does containment make an agent safe?

No. Containment limits how long a misbehaving agent can act, but it does not define what the agent was authorised to attempt. Safety requires an authority layer above the sandbox that decides tool surface, credential scope, and spend ceilings before the run starts.

What is the difference between a containment metric and an authority metric?

Escape attempts blocked per thousand runs measures how often the sandbox supervisor fired. Unauthorised capability attempts per thousand runs measures how often an agent tried to use authority it did not hold. The second predicts incidents; the first describes the runtime.

Where should authority be enforced?

In the orchestrator and policy layer, not in the sandbox runtime. Scoped credentials, egress allowlists, tool-surface narrowing, and run-scoped expiry belong above the process boundary, so blast radius can be reasoned about independently of escape probability.