找回密码
立即注册
搜索
发回帖 发新帖

6051

积分

0

好友

762

主题
发表于 昨天 23:15 | 查看: 6| 回复: 0

让 AI Agent 拥有执行 Shell 的权限,已经成为不少开发者的日常操作。

但真正把终端交出去那一刻,心里免不了犯嘀咕:放开权限,怕它遭遇 Prompt 注入 或恶意依赖投毒,把私有代码和本地密钥打包外泄;关死网络和文件,它连拉取文档、安装依赖都做不到,瞬间变成废铁。

这种“要么裸奔、要么坐牢”的局面,正是自主 Agent 走向生产环境的最大阻碍。NVIDIA 开源的 OpenShell,要解决的就是这个死结。

项目卡片

  • 项目:OpenShell[1]
  • 状态:v0.1.2 / 1.4 万+ Stars / 采用 Apache-2.0 协议
  • 一句话判断:用 Linux 内核 Landlock、形式化验证与双边界凭据隔离,给自主 AI Agent 构建了一个既能自由执行代码又绝不失控的运行时沙箱。

OpenShell 核心双边界隔离架构:不可信沙箱与受信任 Supervisor 经受控信道隔离

关在容器里,为什么依然防不住它失控

不少人觉得,开一个普通 Docker 容器把 Agent 圈起来就够了。

但在真实工程里,普通容器防不住隐蔽外泄。只要容器还能连外网,一段混淆脚本就能把挂载的源码打包,伪装成正常的 HTTPS 请求送出去。

OpenShell 的解法是物理分离的双边界:不可信的 Sandbox 与完全受信任的 Supervisor。

Agent 运行在 Sandbox 内部,从启动起就受到 Linux 内核的多重约束:Landlock LSM 严格封锁文件读写路径,无特权身份杜绝提权;seccomp 在底层拦截危险系统调用。

更彻底的是,Sandbox 在网络层被执行全默认拒绝(Default-Deny),它根本没有直连外部互联网的网卡。

它唯一的出路,是一条通往外部 Supervisor 的私有受控信道:Docker 下是 Unix Socket,K8s 下是 mTLS 服务,MicroVM 下是 vsock。所有 TCP 连接与 DNS 解析,都必须经过 Supervisor 逐一审查,沙箱自己说了不算。

OpenShell 终端日志监控:OPA 策略放行 Anthropic API 请求与 SSH 隧道建立

报错了怎么办?它用形式化证明做动态放行

网络全关虽然安全,但 Agent 干活时难免要访问 GitHub API,或者拉取依赖包。每次拦截都靠人工改配置,自动化基本就名存实亡了。

为此,OpenShell 引入了运行时提单机制 Policy Advisor。

当请求被内核阻断时,系统会自动提取程序路径、目标域名与端口,在沙箱内部暴露的本地接口 http://policy.local 上生成一份最小权限提案(Proposal)。

接着,网关内嵌的 Policy Prover 会介入。它基于 SMT 数学求解器做形式化推演,秒级排查几条关键红线:

  • 是否尝试触碰云厂商核心元数据节点,例如 169.254.169.254
  • 是否试图用 Git、SSH 等无法做深度 L7 审计的协议,连接附带凭证的主机
  • 是否把已有凭证扩展到了未经授权的新域名
  • 是否在只读端点上偷偷放开了 POST、PUT 等写入动作

确认没有越权风险后,系统在自动模式下可以无感放行,或者由开发者在终端里敲下 openshell rule approve 批准。规则通过后会动态热重载(Hot-Reload)地生效,容器无需重启,请求立刻畅通。

连 API Key 都不给 Agent,它怎么干活

让 Agent 调用模型,一直是密钥泄露的高发区。传统做法是往容器里塞环境变量,Agent 一旦打印环境变量或输出报错堆栈,密钥就会直接暴露。

OpenShell 实现的是凭据零暴露注入。

真实密钥由沙箱外部的 Provider Profiles 统一托管在宿主安全存储中。沙箱内部的 Agent 只能看到不透明的占位符,根本接触不到真实凭证。

OpenShell 凭据隔离流程:沙箱仅见占位符,真实 API Key 由 Supervisor 即时代注入

完整调用链很简洁:

  1. Agent 正常发起针对目标 API 的 HTTP 请求
  2. 内核拦截并转交给宿主侧 Supervisor
  3. Supervisor 依据策略校验二进制程序与端点白名单
  4. Supervisor 在向外转发的瞬间,即时把真实的 Authorization 请求头拼入数据包

哪怕 Agent 被提示词注入攻击,或被恶意脚本全盘扫描,也拿不到任何有效密钥。钥匙始终在门外的守卫手里。

开发者上手也很简单,本地网关拉起后,一条命令就能带着免费模型开工:

# 导入模型提供商配置并创建 Provider
openshell profile import --url https://raw.githubusercontent.com/NVIDIA/OpenShell/main/providers/openrouter.yaml
openshell provider create --name openrouter --type openrouter --from-existing

# 启动受控 Agent 沙箱
openshell sandbox create \
  --name my-agent \
  --from ghcr.io/anomalyco/opencode:latest \
  --provider openrouter \
  -- opencode -m openrouter/nvidia/nemotron-3.5-lightning:free

实测用官方脚本安装网关不到一分钟,配合 OpenCode 镜像,终端交互几乎感受不到代理拦截带来的延迟。

哪些场景该用,哪些坑现在别踩

在自主 Agent 遍地开花的当下,OpenShell 给出了一个相对成熟的工程底座。

如果你符合以下任一场景,它的采用价值会很高:

  • 常驻后台执行的 Coding Agent:需要自主拉库、改代码、提 PR,无法预知会执行哪些外部脚本
  • 多 Agent 协作集群:企业并发运行几十个 Agent,必须保证沙箱之间以及与内网设施的完全隔离
  • 敏感业务对接:需要严格的凭证管控与合规审计,原生支持 OCSF 安全日志导出

不过选型前也要看清它当前的边界。

首先,隔离边界存在时序限制。Landlock 的文件读写白名单与进程 UID/GID 必须在创建沙箱时就定死,启动后不可更改;只有网络规则和中间件支持运行时热更新。

其次,形式化验证目前主要覆盖 L4 TCP 与 RESTful。对于复杂的 WebSocket、GraphQL 或自定义 MCP 工具协议,Prover 还无法建立完整的数学模型来证明风险,仍然需要依赖人工静态声明。

最后是系统依赖。它深度依赖现代 Linux 内核的 Landlock 与 seccomp。Linux 与 Apple Silicon Mac 配合 Docker/Podman 体验极佳,Windows 目前仍处于 WSL 2 实验性阶段。

在给自主 Agent 放开系统权限之前,先在底层筑一道由内核和数学逻辑双重锁死的硬防线,远比事后排查密钥泄露省心得多。这类 Agent 安全与沙箱隔离的新方案,也值得在 云栈社区 继续跟踪讨论。

引用链接

[1] OpenShell: https://github.com/NVIDIA/OpenShell




上一篇:EVT/DVT/PVT到底干什么?硬件开发三阶段验证准出条件与检查清单
下一篇:Vivado 仿真器怎么查代码覆盖率?功能覆盖率验证流程详解
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-10-18 02:20 , Processed in 0.067098 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表