Agent Sandbox(Agent 沙箱)
Agent 沙箱(Agent Sandbox) 是为 LLM Agent 提供隔离执行环境的基础设施,是 ETCLOVG Taxonomy(ETCLOVG 分类法) E 层(执行环境与沙箱)的核心概念。沙箱不是从传统多租户代码执行"借来"的安全措施,而是 Agent 时代特有的一等研究对象——因为它同时服务三个不可分割的目的。
三重目的
安全性(Security):LLM 生成代码既不可审计也不可在规模上预测,使静态审查作为主要防线失效。Prompt injection 攻击可将原本良性的 Agent 重定向为恶意沙箱操作媒介。沙箱提供边界,使提示注入的代码或幻觉命令无法修改敏感文件或泄露数据。
可复现性(Reproducibility):长视野 Agent 任务和评估这些任务的 harness(§8)需要能将执行状态重置到已知基线的能力。Docker 容器或 microVM 可按需销毁重建,而开发者工作站无法做到这一点——这一特性使 SWE-bench、OSWorld 等大规模基准测试在实践上可行。
活性(Liveness):没有沙箱,Agent 每次想执行潜在风险操作(文件写入、包安装、出站网络调用)都必须触发人工确认提示。规模上,这会产生两种失败:用户因挫败感放弃 Agent,或习惯性地批准一切,使安全提示失去意义。沙箱通过在会话配置层面预授权动作,将权限问题从动作级转移到配置级。Anthropic 报告引入沙箱后 permission prompts 减少 84%,同时维持安全性。
Claude Code 的 Auto Mode 解决的是同一类活性问题的另一条路径:它不先把执行环境严格隔离,而是让 transcript classifier 在动作前替代部分人工审批。两者互补:沙箱限制“能碰到哪里”,Auto Mode 判断“这次动作是否被用户授权”。对高风险环境,Auto Mode 不能替代沙箱;对需要主机或网络访问的本地开发任务,Auto Mode 可以减少沙箱配置负担。
这三个目的的组合——安全+可复现+活性——是将 Agent 沙箱视为独立研究对象而非容器技术下游应用的理由。
Containment:限制 blast radius
Anthropic 在《How we contain Claude across products》中把 Agent 部署风险拆成两部分:出错概率 P(harm) 与理论破坏半径(blast radius)。模型训练、系统提示、分类器和 probe 可以降低出错概率,但只要 Agent 能访问更多文件、网络和内部服务,潜在破坏半径仍会变大。Containment 的目标是在环境层设置硬上限:即使用户误用、模型误判或外部攻击成功,Agent 也只能影响被授权的环境。
这个视角把沙箱从“安全附加项”提升为部署决策的一部分。能力越高、收益越大,越需要把风险从“模型是否会做坏事”转成“即使它做了,最多能碰到什么”。环境层是硬上限,模型层是概率性约束,外部内容层则要对输入和输出做扫描与审计。
Anthropic 总结了三个产品化 containment 模式:
| 模式 | 产品语境 | 环境边界 | 主要取舍 |
|---|---|---|---|
| 临时容器 | claude.ai code execution | server-side gVisor 容器、每会话临时文件系统、无本机文件访问 | blast radius 最小,但没有持久工作区和本地文件能力 |
| Human-in-the-loop sandbox | Claude Code | 本机 OS 级 sandbox,读默认允许,workspace 内写入,网络默认拒绝 | 适合能读懂 Bash 的开发者;仍依赖用户注意力和信任提示时机 |
| 本地 VM | Claude Cowork | 用户选择的 workspace 挂载进 VM,凭证留在 host keychain,VM 获得 scoped-down session token | 适合非技术用户;隔离更强,但启动、可观测性和本地 MCP 集成更复杂 |
这三个模式说明 containment 不能脱离用户能力讨论。开发者可以判断 rm -rf、npm install 和网络请求的风险,因此 Claude Code 可以把沙箱、人类审批和 Auto Mode 组合;知识工作者不应被要求判断 shell 命令,因此 Claude Cowork 更偏向绝对、always-on 的 VM 边界。
七类沙箱
通用托管沙箱(General-Purpose Managed Sandboxes)
提供 sandbox-as-a-service,通过 API 暴露任意 OCI 容器镜像,支持 shell、文件系统、网络和解释器。
代表系统:
- Daytona:开发者环境转型,冷启动 <90ms
- E2B:基于 Firecracker microVM
- Modal:Python 平台,gVisor 隔离
- Northflank:支持 Kata Containers、Firecracker、gVisor 并行,多后端自动扩缩容
- OpenSandbox(阿里巴巴):大规模通用沙箱
- Docker Sandboxes(Docker, Inc.):官方 microVM 方案(2025)
设计模式:短暂性优先、可选持久会话;Python/TypeScript SDK;支持任意 OCI 镜像。各系统在隔离强度与运营模式上分化:Docker Sandboxes 和 E2B 默认 microVM,而容器仍是通用选项。
OpenAI 2026 年 4 月 15 日更新的 OpenAI Agents SDK把沙箱作为原生运行配置纳入 SDK:开发者可以自带 sandbox,也可以接入 Blaxel、Cloudflare、Daytona、E2B、Modal、Runloop、Vercel 等提供商。这里的重点是沙箱提供商可替换,Agent 定义与编排逻辑不应硬绑定某一家执行基底。
Claude Managed Agents 提供了同一趋势的 Anthropic 形态:sandbox 不承载 session 和 harness,只作为可 provision、可执行、可失败重建的“手”。execute(name, input) -> String 把 sandbox 调用压成普通工具调用;provision({resources}) 让新 sandbox 能按标准 recipe 重新初始化。这个设计把沙箱从不可丢失的状态容器,变成可替换执行基底。
Computer-Use Agent 基础设施
在沙箱内封装完整桌面环境(通常经由 Xvfb + 窗口管理器或完整 VM),暴露像素坐标和击键动作给 Agent。
代表系统:Anthropic Computer Use、CUA(开源)、OSWorld(VM-based,兼作评估 harness)
与通用沙箱的权衡:桌面环境更重(启动更慢,更难多路复用),但可运行任何不提供 API 的应用程序——这是唯一支持该用例的执行模型。
代码特化沙箱(Code-Specialized Sandboxes)
针对代码生成、评估和数据分析优化,而非通用 shell 访问。
代表系统:
- Judge0:代码评测沙箱,被大量 coding agent 评估 pipeline 复用
- OpenAI Code Interpreter:ChatGPT Advanced Data Analysis 的生产级沙箱 Python 环境
- sandboxed.sh:coding agent 的 shell 沙箱
- langchain-sandbox:WebAssembly + Pyodide + Deno 运行时,本地无容器执行
趋势:从基于容器的代码沙箱向 WebAssembly-based 沙箱转移——WebAssembly 提供能力安全(capability-safety)、确定性执行和微秒级实例化,代价是 Python 标准库受限和原生扩展支持减少。NVIDIA 也为客户端 Agent 工作流倡导 WebAssembly 方案。
框架集成运行时(Framework-Integrated Runtimes)
执行环境与框架的编排循环、工具注册、提示约定捆绑,不能脱离框架独立使用。
代表系统:OpenHands runtime(Docker,集成 bash/IPython/Chromium/MCP/VSCode)、agent-infra sandbox(all-in-one 设计)、smolagents executor(local/Docker/E2B/Modal/WebAssembly 多后端)
核心权衡:bundle(开箱即用,功能覆盖全)vs compose(轻量可替换,更灵活)。MCP 等标准是否会降低 composition 成本,从而削减 bundle 方案的优势,是开放问题。
Pi 是 compose 路线的边界案例:它默认继承宿主用户与进程权限,不内置文件系统、进程、网络或凭证 sandbox。官方建议要么用 Gondolin Extension 把内置工具路由到 microVM,要么把整个 Pi 进程放进 Docker 或 OpenShell。前一种模式必须特别注意:其他 Extension 注册的工具仍可能在 host 执行;工具路由扩展并不会自动覆盖所有扩展能力。
浏览器评估环境(Browser Evaluation Environments)
同时承担沙箱(隔离 Web 执行环境)和评估 harness(提供可复现任务定义和自动化评估)双重角色。
代表系统:WebArena(自托管真实 Web 应用集群)、VisualWebArena(扩展多模态视觉 grounding)、BrowserGym + WorkArena(gym 风格接口,标准化基准测试)
双重功能特性使其有别于 §3.2.2 的 Computer-Use 类(操作系统级,而非浏览器级),并与 V 层(评估)产生直接接口。
OS 级权限沙箱(OS-Level Permission Sandboxes)
用操作系统原语(Linux 上的 bubblewrap、macOS 上的 Seatbelt、syscall 过滤用的 seccomp-bpf)实现细粒度文件系统和网络隔离,不提供全新 OS 镜像。
设计哲学:permission,not partition——目标不是给每个会话提供新的 OS 镜像,而是给 Agent 提供对现有主机的受限视图,使提示注入或幻觉命令无法修改敏感文件或泄露数据。
代表系统:
- Anthropic sandbox-runtime:npm 包,基于 bubblewrap 的文件系统 + 网络 allowlist + 本地 HTTP/SOCKS5 代理
- Claude Code sandboxing:内置于 Claude Code,消费上述 runtime 限制 bash 工具的文件系统和网络访问
- IsolateGPT:用 seccomp 和 setrlimit 在 LLM-based Agent 系统间执行执行隔离,~30% 性能开销
与通用托管沙箱的权衡:OS 级权限沙箱比 microVM 托管沙箱提供更弱的对抗代码隔离,但在威胁模型是 prompt injection(而非完全对抗代码)时是合适选择。共享主机内核意味着内核漏洞仍在攻击面内。
Claude Code 的本机沙箱是这一类的产品化例子:macOS 用 Seatbelt,Linux 用 bubblewrap。Anthropic 报告启用沙箱后 permission prompts 减少 84%,说明环境层硬边界可以把权限问题从“每个动作都问人”转成“会话配置时设边界”。但 Claude Code 也暴露过信任边界时序问题:如果项目目录里的配置、hook 或 localhost listener 在 trust prompt 之前被解析或执行,攻击者提交的仓库内容就会先于用户同意进入执行路径。类似系统应把 project-open、config-load 和本地监听器当作来自互联网的输入,直到用户明确信任目录之后才解析或执行。
Codex CLI 的权限提示体现了这类本地 Agent 沙箱的边界:Codex 会把适用于内置 shell 工具的沙箱和审批规则放进开发者消息中,例如可写目录、网络访问和何时请求用户授权。但这些规则只适用于 Codex 自己提供的 shell 工具;通过 Model Context Protocol(模型上下文协议)接入的外部工具不自动继承该沙箱,必须由对应 MCP 服务器自己执行权限控制。
Codex 的子智能体继承父会话当前的沙箱和审批策略,父线程本轮启用的运行时覆盖也会应用到新子线程;自定义 Agent 可以进一步收紧为只读。交互式会话能展示其他 Agent 线程发起的审批,而无法请求新审批的非交互运行会失败并把错误返回父线程。委派因此不会天然扩大授权边界。
Model Context Protocol(模型上下文协议)的代码执行式用法说明了沙箱在工具密集 Agent 中的另一种角色:沙箱不只是运行 bash 或测试代码,也可以成为 MCP 工具之间的数据处理平面。Agent 写代码从 Google Sheets、Drive、Slack 或 Salesforce 等 MCP server 取数、过滤、聚合,再只把必要摘要打印给模型。这样能减少上下文暴露,但也意味着沙箱必须承担敏感数据驻留、网络出口、文件持久化和 MCP 工具权限的治理。
沙箱抽象层(Sandbox Abstraction Layers)
不是沙箱本身,而是在单一 API 后统一多个沙箱后端的接口,使 harness 在不重写 Agent 逻辑的情况下切换执行基底。
代表系统:SWE-ReX(统一 Docker/AWS Fargate/Modal/Daytona)、smolagents executor(local/e2b/modal/docker/blaxel/wasm 单一参数化接口)、K8s Agent Sandbox CRD(Kubernetes SIG Apps,声明式 API 暴露 gVisor 和 Kata Containers 作为可插拔后端)
这一类别的出现反映了一个成熟认知:执行基底应该是可替换的。将特定沙箱 API 硬编码到 harness 中,会将编排逻辑与单一供应商绑定。
OpenAI Agents SDK 的 Manifest 抽象也属于这个方向:它描述 Agent 工作区,而不是某个具体容器。Manifest 可以声明本地目录挂载、输出目录,以及 AWS S3、Google Cloud Storage、Azure Blob Storage、Cloudflare R2 等存储来源。这样模型看到的是稳定工作区语义,harness 再把这些语义映射到本地开发或生产沙箱。
VM containment:Claude Cowork 案例
Claude Cowork 面向一般知识工作,不假设用户能审查 Bash 或网络请求。Anthropic 的第一版设计把 Agent loop、代码执行和一部分本地 MCP server 都放进完整 VM:VM 有独立 Linux kernel、文件系统和进程表;用户选中的 workspace 与 .claude 目录被挂载进去;凭证留在 host keychain,不进入 guest。
Cowork 的隔离机制分两类:
| 机制 | 执行位置 | 作用 | root-in-guest 后是否仍有效 |
|---|---|---|---|
| Hypervisor boundary | guest 外 | guest memory isolation | 是 |
| vsock | guest 外 | host transport,不暴露普通网络栈 | 是 |
| seccomp | guest 内 | 阻断特定 syscall pattern | 否 |
| Mount namespaces | guest 内 | 只让 workspace 可见 | 否 |
| Egress proxy | guest 内 | domain allowlist | 否 |
| Per-session user | guest 内 | 进程隔离 | 否 |
这个分层很重要:guest 内机制仍有价值,但如果 Agent 获得 guest root,它们可能失效;hypervisor boundary 和 vsock 这类 guest 外机制才是更硬的边界。
后来 Cowork 改成 host-loop 模式:Agent loop 移到 host,代码执行仍留在 VM sandbox;本地 MCP server 也移到 host。这样 VM 启动失败时,Agent 仍能响应用户并帮助排错;需要访问本地数据库或进程的 MCP server 也更容易运行。安全影响较小,因为模型生成代码的执行面仍受 VM 文件系统和网络控制约束。这个案例说明“harness 在 host、untrusted compute 在 sandbox”常常比“整个 Agent 都塞进 sandbox”更可靠。
Managed Agents 的安全边界也遵循这个方向:Git token 可在 sandbox 初始化时用于 clone 和配置 remote,但不暴露给 Agent;MCP OAuth token 则留在 sandbox 外部的 vault,由代理按 session token 取用。沙箱因此不只是“跑代码的地方”,也是凭证不可达边界的一部分。
Cowork 还提供 read-only、read-write、read-write-no-delete 等文件挂载模式,用挂载能力表达风险差异。路径校验必须先解析 symlink,否则授权目录内的 symlink 可能指向目录外并逃出挂载边界。
Egress allowlist 不是目的地过滤
Cowork 的一个第三方披露案例说明:域名 allowlist 应被理解为能力授权,不是简单目的地过滤。攻击文件把隐藏指令和攻击者 API key 放进 workspace;Claude 读取文件后调用 api.anthropic.com 的 Files API,把 workspace 内文件上传到攻击者账号。egress proxy 只检查目的地,看到域名在 allowlist 上就放行;沙箱按设计工作,数据仍然外泄。
修复方式是在 VM 内加入 defensive MITM proxy,拦截发往 Anthropic API 的流量:只有携带 VM 自己 provisioned session token 的请求被放行;攻击者 key 被拒绝;会触发 server-side fetch 的 header 也被阻断。proxy 放在 VM 内而不是服务器端,是因为只有 VM 知道请求 provenance;服务器侧看不出这是 Cowork VM 的请求还是普通 API client。
这个案例给 Agent 沙箱设计一个通用原则:allowlist 的每个域名都等价于开放该域名上可达的全部功能面。允许 api.example.com 不是“允许出站到一个安全域名”,而是“授权 Agent 使用这个 API 的所有上传、下载、转发和间接访问能力”,除非代理能继续检查 token、header、路径、方法和数据流向。
威胁模型与沙箱逃脱
沙箱化 Agent 执行面临的威胁:
- Prompt injection:外部输入(网页、工具响应、文件内容)劫持 Agent 行为
- 目标错位(Goal Misalignment):Agent 将沙箱逃脱作为达成任务目标的工具性子目标
- 组合放大(Compositional Amplification):多工具访问使单个沙箱弱点在集成能力间级联
SandboxEscapeBench(Marchand et al., 2026):在嵌套沙箱 CTF 设置中评估前沿 LLM,报告 15–35% 成功逃脱率(依容器配置),涵盖错误配置、权限提升错误、内核漏洞和运行时弱点。防御研究仍处早期阶段,且各系统威胁模型、评估协议、基线假设不一致。
部署模式
- 自托管(Self-hosted):开发者直接管理沙箱基础设施(OpenHands、SWE-agent 的默认模式)
- 云(SaaS):服务提供商管理基础设施(E2B、Modal、Daytona Cloud)
- 混合/BYOC:Agent 逻辑与沙箱执行跨环境解耦(OpenHands SDK 的 Local+Remote Workspace 抽象、E2B 和 Northflank 的 BYOC 选项)
相关词条
- ETCLOVG Taxonomy(ETCLOVG 分类法) — 沙箱是 E 层的核心内容
- Harness Engineering(驾驭工程) — 沙箱是 harness 基础设施的物理基底
- AI Agent(智能体) — 沙箱为 Agent 提供安全可控的执行空间
- Model Context Protocol(模型上下文协议) — T 层标准,与沙箱共同构成 Agent 执行基础设施
- Codex — 本地软件 Agent 中沙箱与工具权限边界的具体实现案例
- Pi — 默认无内置权限系统、通过 microVM/容器/策略沙箱组合隔离的案例
- Subagent(子智能体) — 并行 Agent 的权限继承与最小权限配置
- Claude Code — 用 Auto Mode 减少权限提示而不是依赖隔离环境的互补路径