NVIDIA OpenShell 技术解读:内核级沙箱加形式化验证,管住能碰生产数据的 AI Agent

让 AI Agent 干活,就要给它文件读写、包安装、API 调用和凭据;给了这些,它就站在你的数据、密钥和网络旁边。这是当前 Agent 工程化最直接的一组矛盾。NVIDIA 开源的 OpenShell 把自己定位成「自主 AI Agent 集群的安全、私有运行时」:用声明式政策声明每个 Agent 能碰什么,然后在内核层强制执行。项目用 Rust 编写,Apache 2.0 协议,2026 年 2 月 24 日建仓,目前 10223 star、1394 fork、129 位贡献者,在 GitHub Trending 上以单日 +978 star 的速度增长。九月下旬它进入 0.1 稳定版本节奏,9 月 25 日、26 日、28 日连续发布 v0.1.0、v0.1.1、v0.1.2 三个版本。

OpenShell 品牌 banner

容器隔离对 Agent 不够用的地方

Docker 的隔离模型假设工作负载是确定性的:镜像里的程序做什么,部署前就已知。Agent 打破了这个假设。它按任务动态决定读哪个文件、调哪个接口、往哪里发数据,任何一次模型输出偏差都可能变成一次越权操作。更麻烦的是凭据:Agent 要调 GitHub API 就需要 token,常见的做法是把 token 塞进容器环境变量。容器能挡住外面的攻击者,却挡不住容器里那个「拿着真凭据干活的程序」本身——提示词注入一次,凭据就流向攻击者的服务器。

OpenShell 对这个问题的处理分两层:内核层强制隔离,凭据层代理注入。两层配合的结果是,Agent 进程从头到尾接触不到真实凭据,网络出口被逐请求审查,而这一切对 Agent 表现为一个「稍微难用一点的操作系统」。

架构:gateway、sandbox、supervisor 三件套

OpenShell 的控制面是 gateway,负责沙箱生命周期、政策下发、凭据管理和用户接入。创建沙箱时,compute driver 会配置一个 workload(Agent 跑在这里)和一个独立的 supervisor,在两者之间建立受保护信道,并构建隔离边界。supervisor 位于边界的可信侧,先确认边界成立,再启动 Agent,之后向 gateway 回连,领取政策、凭据、日志和交互会话。

沙箱内部的隔离机制(当前 Linux 后端):

  • workload 以单一非 root 身份运行,不持有任何 Linux capabilities;
  • 文件系统访问由 Landlock LSM 在内核层限制;
  • 网络操作(TCP 建连、DNS 查询)通过 seccomp user notification 拦截,转交决策;
  • 沙箱从受信任的 /proc 数据识别发起请求的程序,Agent 谎报进程路径无法绕过检查。

supervisor 与沙箱之间跑 OpenShell Sandbox Protocol:一条双向认证的 HTTP/2 连接,承载多条独立流。每个 TCP 连接占一条流、自带背压,一个慢下载不会阻塞 DNS、exec 或进程控制。传输层按运行时选择:Docker 和 Podman 用 Unix socket,Kubernetes 用 TCP,MicroVM 用 vsock,认证与协议行为在三种运行时上一致。外层网络围栏拒绝沙箱除这条信道外的一切出网,Agent 连 DNS 和 gateway 都无法直连。这套设计还有一个 fail closed 保证:supervisor 未确认边界前 Agent 不启动,连接断开后 Agent 被冻结,只留一个短暂的重连窗口,否则工作负载直接停止。

每一次网络请求的旅行

Agent 发起 TCP 连接或 DNS 查询时,实际发生的事情是一条固定的流水线:沙箱识别调用程序;请求经 Sandbox Protocol 送到 supervisor;supervisor 对照政策检查,按政策把凭据注入请求;检查通过后由 supervisor 代为建立真实连接并转发流量。meditated 信道是 workload 唯一允许的出网路径,也就是说,审查点在 Agent 与互联网之间,而不在 Agent 的自觉里。

凭据由 provider 机制管理。每个 provider 把一个服务名绑定到一个存储的凭据,supervisor 只在政策允许的位置发放它:

shell
# 从当前 shell 环境读取 ANTHROPIC_API_KEY 创建 provider
openshell provider create --name my-claude --type claude-code --from-existing

# 查看内置的 github provider profile(端点、二进制、凭据元数据)
openshell profile describe github

政策本身是 YAML 文件,version: 1,五个顶层节:filesystem_policy 定义可读、可读写路径(Landlock 在沙箱启动时生效,之后固定);process 定义运行身份;network_policies 定义每个二进制可达的目标和可发的请求(运行中可变);network_middlewares 提供流量检查与改写;landlock 定义内核强制失败时的回退行为。网络规则默认全拒:没写允许的出网连接一律不通。规则粒度可以细到「允许某个二进制对某 API 发 GET,但不允许 POST」。全局政策、沙箱保存的政策、镜像内置政策、内置保守默认政策按此优先级取一;provider 会向有效政策追加自己的网络规则,比如 GitHub provider 自动获得访问 GitHub API 的许可。

SMT 求解器:政策变更先过数学证明

OpenShell 最有辨识度的部件是 policy prover:用 SMT 求解器对政策做形式化验证。它回答两类问题。

边界检查:候选政策是否越出边界政策(一个环境允许的最大访问面)。官方文档的例子——边界允许只读 /usr 和 /etc,候选只读 /usr,检查通过:

text
result: within_boundary
coverage: domains=filesystem,network_l4,network_rest,process,landlock

候选加上 read_write: /tmp 后再查,输出 exceeds_boundary,反例一行:filesystem write /tmp。openshell-prover 是独立 CLI,不连 gateway,设计给 CI 和上层 Agent 用——父 Agent 给子 Agent 写政策时,可以先数学证明子政策不超出自己的最大边界。这条链路把「权限收敛」从人工审查交给可机检的数学性质。

提案风险检查:Agent 提交新网络规则时,prover 对比启用前后的可达范围,标记新凭据可达主机、新 HTTP 方法、云元数据地址(169.254.169.254 这类会泄露临时凭证的端点)等风险,任何发现都会阻止自动批准。覆盖范围覆盖 filesystem、network_l4、network_rest、process、landlock 五个域;政策若用了 GraphQL 或 MCP 规则,prover 明确报告无法检查,忽略规则继续放行这种事不存在。

Policy advisor:Agent 自己申请权限的闭环

沙箱里被拦的请求,Agent 可以通过 policy advisor 提交新网络规则提案。提案只含网络访问:目标主机、端口、二进制,HTTP API 加方法和路径;它不能删除已有规则,不能碰文件系统和进程设置。默认每条提案等人工审批,审批通过即时生效(网络规则本就支持热更新),拒绝时 Agent 会拿到理由并可以提交更窄的提案。OpenShell 还会对每个沙箱被拦的连接自动起草提案,草稿走同样的检查和审批流程。风险标记覆盖内网地址和通配符主机两类常见误配。

这个设计把「权限膨胀」的路径显式化了:Agent 缺权限时不再需要人手改政策文件,而是走一条有记录、有数学检查、可拒绝的申请流。

落地成本与边界

安装两条命令,支持 Linux、Apple Silicon macOS 和实验性的 Windows WSL 2,需要 Docker、Podman 或主机虚拟化之一:

shell
curl -LsSf https://raw.githubusercontent.com/NVIDIA/OpenShell/main/install.sh | sh
openshell sandbox create --name demo

默认沙箱镜像是不含 Agent 的最小 Ubuntu。官方的 Run Your First Agent 教程用 OpenCode 接 OpenRouter 免费模型跑通完整流程。SDK 覆盖 Python(uv add openshell)、TypeScript(GitHub Packages 的 @nvidia/openshell-sdk)、Go(go get github.com/NVIDIA/OpenShell/sdk/go@latest)、Rust 四种语言,用于把应用接到 gateway。Kubernetes 部署走 Helm,要求 CNI 强制执行 NetworkPolicy。

局限同样明确。prover 的保证只覆盖其模型表达的政策特性,官方文档自述仍在扩展覆盖面;文件系统与进程规则在沙箱启动后固定,变更需重建沙箱;advisor 默认关闭,需要显式启用;seccomp user notification 和 Landlock 依赖 Linux 内核,非 Linux 平台走各自的隔离原语。

对准备把 Agent 放进生产环境的团队,OpenShell 给出的东西可以用一句话概括:把「Agent 该碰什么」写成机器可验证的政策,把执行点从应用层下沉到内核,让每一次权限变更都走一条有证明、有审批记录的流水。代码、架构文档和政策示例都在 NVIDIA/OpenShell 仓库,Apache 2.0 协议,自托管部署不需要 NVIDIA GPU。

来源:NVIDIA/OpenShell GitHub 仓库、官方架构文档、Policy Prover 文档