NVIDIA OpenShell:用内核沙箱 + 形式化验证,把自主 Agent 关进可声明的笼子
posts posts 2026-10-04T03:35:00+08:00OpenShell 是 NVIDIA 开源的自主 AI Agent 安全运行时,用内核级沙箱约束文件、系统调用与网络访问,用形式化验证审查策略变更。本文拆解其 gateway、supervisor、sandbox 三层架构与采用边界。技术笔记AI Agent, NVIDIA, 沙箱, 形式化验证, 开源NVIDIA OpenShell:用内核沙箱 + 形式化验证,把自主 Agent 关进可声明的笼子
核心判断
自主 Agent 的价值和风险来自同一件事:它要能读文件、装依赖、调 API、用凭据,才真正「有用」。但把这三样放开给一个不可完全信任的模型驱动进程,等于把数据、密钥和网络同时交出去。OpenShell 的立场很直接:能力可以给,但每一项都必须是策略里声明过的。它用两条腿走路——内核级沙箱在运行时强制约束每个 Agent 能碰什么文件、发什么系统调用、连什么网络;形式化验证(formal verification)在策略变更落地前,先算清楚这次变更会多放行哪些危险访问。截至 2026 年 10 月初,这个 Rust 写成的运行时在 GitHub 上有 14.6k stars,最新稳定版 0.1.2 于 9 月 28 日发布。
这篇文章帮你判断:你的 Agent 工作流,值不值得引入一层「策略先行、内核强控」的运行时。
问题边界:为什么裸跑 Agent 不安全
让 Agent 直接跑在宿主机上,问题不在「模型坏」,而在权限粒度。一个能执行任意命令的进程,天然拥有它所在用户的所有权限:读 /etc 下的配置、向任意域名发请求、把密钥带出去。传统容器(如 Docker)隔离了进程视图,但 Agent 场景的诉求更细——不是「能不能跑」,而是「这个 Agent 这次能碰哪几个文件、只连哪几个域名、只能用哪几把凭据」。
OpenShell 的切入点是两层治理:策略(policy)声明边界,内核强制边界。它没有发明新的隔离技术,而是把「声明 + 强制 + 变更审查」三个环节补成一个闭环。
系统地图:三层架构
OpenShell 的部署拓扑由三部分构成,对应控制面、可信执行面与隔离执行面(官方架构文档的边界划分:Supervisor 与 Sandbox 分居隔离边界两侧,策略决策永远在可信侧):
| 组件 | 位置 | 关键职责 |
|---|---|---|
| Gateway(网关) | 控制面 | 管理沙箱生命周期与访问权限,签发凭据、附加 providers(凭据源),协调进入沙箱的连接;策略 prover 也运行在网关内 |
| Supervisor(监督器) | 边界可信侧 | 检查每个请求是否合策略,按策略供给凭据、解析 DNS、代开已批准的连接,保持与网关的链路 |
| Sandbox(沙箱) | 边界隔离侧 | 与不可信的 Agent 同侧:拥有 Agent 进程、识别发出请求的程序、拦截 TCP 与 DNS 并上报 Supervisor——它只报告、不决策 |
Gateway 可部署在 Kubernetes 上(Helm 安装,要求 CNI 强制 NetworkPolicy),也支持本地单机模式。SDK 有 Python / TypeScript / Go / Rust 四种,应用通过 SDK 连接 Gateway,而非直接操纵沙箱。
关键机制:两个核心设计
机制一:内核级策略强制
沙箱里每个 Agent 的运行边界由内核控制,而不是靠应用层自觉。以 Linux 后端为例:workload 以单一非 root 身份运行、不带任何 Linux capabilities,文件系统访问由 Landlock 限制,网络操作由 seccomp 用户通知(seccomp user notification)截获:
- 文件:只能访问策略允许的路径(Landlock 限制)。
- 系统调用:只能发起策略允许的调用。
- 网络:Sandbox 拦截 TCP 打开与 DNS 查询(seccomp),经 Sandbox 协议送往 Supervisor;Supervisor 查策略后决定放行或拒绝。边界外层围栏(outer network fence)拒绝 workload 除 Supervisor 通道外的一切出口——Agent 无法直连任何服务、网关、DNS 或私有地址。
凭据处理是这套设计里最反直觉也最关键的一点:Agent 永远看不到真实凭据。Supervisor 只在「请求命中策略允许的端点」时,才把对应凭据注入到该请求上。这意味着即使 Agent 被诱导去读环境变量、翻配置目录,也拿不到能外带的密钥——凭据根本不在它能触达的文件系统里。
机制二:策略变更的形式化审查
光有运行时强制不够——策略本身会演进,而「这次改策略会多放行什么」必须提前算清。策略 prover(验证器)运行在网关内,用形式化验证检查 Agent 提议的网络规则变更:凡是会新增危险访问的——首次带凭据触达新主机、新的 HTTP 方法、访问云元数据端点——都会被标记,阻断自动批准,等待人工审查。它同时也以独立命令 openshell-prover 发布,可在 CI 里对策略与边界做离线检查。
这两个机制合起来,回答的是同一类问题:Agent 的每一次越权尝试,要么在运行时被内核拦住,要么在变更落地前被验证器揪出。
一个任务如何流过系统
以 README 的「Run Your First Agent」为例:它运行 OpenCode(一个编码 Agent),通过免费的 OpenRouter 模型工作。流程大致是:
openshell sandbox create --name demo建一个最小 Ubuntu 沙箱——默认镜像里没有预装任何 Agent,先给一个空房间。- 把 Agent 跑进沙箱,它开始读仓库文件、执行命令、尝试联网调用模型。
- 当 Agent 需要新的访问(首次访问某个 API 端点、或需要某个凭据)时,策略里没有这条 → 请求被拦下。
- 操作者看到「需要批准的新访问」提示,决定放行或拒绝——这就是策略变更的人工审查环节。
- 批准的访问成为策略的一部分,后续同类请求不再重复询问。
关键体验是:Agent 的自主性没有消失,只是每一次能力扩张都变得可见、可审、可回滚。这也呼应了 OpenShell 宣称的「agent-first」——它自己就是用 Agent 驱动的工作流开发的。
采用边界与决策建议
适合
- 跑编码 / 运维类自主 Agent 的团队——Agent 需要真实文件与网络访问,又不想放开整台机器。
- 多 Agent 或「Agent 舰队」(fleets)规模化——策略在 Gateway 统一治理,而不是每个 Agent 各管各的。
- 有合规 / 密钥管控要求的环境——凭据不可见 + 网络逐条审查,直接满足「密钥不落 Agent 文件系统」这类约束。
需要注意
- 运行时要求:Linux、macOS(Apple Silicon)或 Windows WSL 2(实验性),且需要 Docker / Podman / 宿主机虚拟化。这不是一个纯软件库,是带内核组件的运行时,部署门槛高于普通 npm 包。
- 成熟度:0.1.x 仍是早期版本(9 月底才 0.1.2),语义上处于「快速迭代期」——策略格式、API 都可能演进,生产大规模接入前需要先做兼容性观察。
- 策略设计成本:形式化审查的收益建立在「策略写得清」的前提上,把策略抽象得过高会丢失审查粒度。
决策建议
想评估的团队,推荐路径:先在本机跑通 sandbox create + Run Your First Agent,重点体验「Agent 请求新访问 → 人工批准」这个循环是否顺滑;再针对自己最敏感的一项能力(读哪个目录 / 连哪个域名 / 用哪把凭据)写一条策略,验证内核强制是否如文档所述。跑通这两步再谈生产部署,不要上来就全量托管现有 Agent。
一句话决策:如果你的 Agent 已经开始碰文件、连网络、用凭据,而你还靠「信它不乱来」——OpenShell 值得一试;如果 Agent 目前只做纯文本推理,它暂时帮不上你。
参考
- 仓库:github.com/NVIDIA/OpenShell
- 官方文档:docs.nvidia.com/openshell
- License:Apache License 2.0
参与讨论
使用 GitHub 登录。欢迎补充事实、异议与实践。
讨论暂时无法加载。