跨 harness 对比:沙箱与执行隔离
总览:五条谱系
61 个 harness 在「agent 生成的命令/代码到底跑在哪、被什么挡住」这件事上,答案沿一条从”裸奔”到”独立内核”的强度谱系铺开。抽象出五条主流派系(多数 harness 同时落在两三条上——本地一套、云端另一套):
-
无 OS 级隔离 + 权限门兜底(最常见)。命令直接经
subprocess/child-process/集成终端在宿主机上跑,防线是”执行前审批 + 命令白/黑名单 + 输出截断”,而非内核边界。IDE 插件与轻量 CLI 几乎全属此类:Aider、Cline、Roo Code、opencode、Continue、GPT-Pilot、MiMo-Code、Kimi Code、Trae(默认)、Amazon Q、Junie、Comate、CodeGeeX、AutoClaw、Augment(CLI)、MetaGPT、LangGraph、Semantic Kernel、GPT-Researcher。 -
OS 级原生沙箱(Seatbelt / Landlock+seccomp+bubblewrap / Windows sandbox)。不靠容器,直接用操作系统内核原语在本机把文件系统写入、网络出站按策略收窄。以 Codex CLI 为技术标杆,Claude Code、Cursor、Zed、Kilo Code、QwenPaw、Copilot、Factory Droid、Gemini CLI / Qwen Code 同派。
-
容器 / 进程级沙箱(Docker/Podman per-task 或 per-agent)。多为可插拔后端里的一档。AutoGPT(Classic Python 路径)、AutoGen、OpenManus、Claude-Flow、Agent Zero、Google ADK、OpenHands(Remote workspace)。
-
远程 / 云托管沙箱 provider(E2B / Modal / Daytona / Blaxel / e2b-Orbs)。把执行整块推到第三方隔离服务,SDK 型框架的主流做法:smolagents、Letta、Agno、CAMEL、DeepAgents、CrewAI(弃自研、改推 E2B/Modal)、Hermes、Amp Orbs、DeerFlow。
-
microVM / 独立内核 per-session(最强隔离,几乎只有云 agent 玩得起)。Devin 与 v0 是两个明确的 Firecracker microVM 标杆,Cursor 云 agent、Replit、Kiro 自主 agent、Qoder Cloud 各有自己的 VM 层。
横切这五派的还有三种非安全边界的”伪沙箱”,值得单列:AST 受限解释器(进程内、非真沙箱)、WASM 沙箱、以及 git worktree / 影子 git(文件级隔离,防的是并发写冲突和”回滚”,不是防逃逸)。
对比表
| Harness | 本地默认 | 强隔离选项 | 关键机制 / 技术 |
|---|---|---|---|
| Codex CLI | OS 原生沙箱 | 远程 exec-server(Noise 加密) | Seatbelt SBPL + bwrap/Landlock + Windows 原生;fail-closed(策略无法强制则拒跑);codex sandbox 干跑调试 |
| Claude Code | OS 原生沙箱 | remote / web 云沙箱(gVisor) | @anthropic-ai/sandbox-runtime(bwrap+Seatbelt),配置热重载;网络按 WebFetch 域名规则 |
| Cursor | OS 原生沙箱 | 云 agent 逐 VM(checkpoint/fork) | macOS Seatbelt / Linux Landlock+seccomp+overlayfs / Win WSL2;实测中断 -40% |
| Zed | OS 原生沙箱 | — | Seatbelt/Bubblewrap/WSL-bwrap;写限 worktree,网络默认断,allow_hosts 逐调用升级 |
| Kilo Code | OS 原生沙箱 | 云 Cloud Agent | kilo-sandbox:Seatbelt/bubblewrap + profile(fs/network 规则)+ git snapshot + worktree |
| QwenPaw | OS 原生沙箱 | — | 4 后端 Seatbelt/Bubblewrap/Landlock/AppContainer + none;每次工具调用新建即弃;治理层与沙箱层解耦 |
| Open Interpreter | OS 原生沙箱(Codex 底座) | --yolo 无沙箱 | 复用 Codex 的 sandboxing crate(Seatbelt/seccomp+Landlock+bwrap/Win) |
| Gemini CLI | 可选(5 后端) | gVisor/LXC/Docker | Seatbelt(6 profile)/Docker/Win-native/gVisor/LXC;沙箱扩展弹窗动态升权 |
| Qwen Code | 可选(继承 gemini) | Docker/Podman | Seatbelt + ghcr.io/qwenlm 镜像;子 agent 走 git worktree |
| Copilot | OS 原生沙箱 | GH Actions VM(Padawan 云) | 本地 OS 沙箱 + MXC/Win runtime;后台 agent 走独立 worktree |
| Factory Droid | OS 沙箱(Beta,不完整) | Droid Computers(远程 VM,WS 隧道) | Seatbelt/bwrap/seccomp+代理;远程 BYOM/Managed VM,relay mode 零暴露端口 |
| goose | 无隔离 | Docker exec 包装(opt-in) | docker exec 包所有扩展启动;seatbelt 沙箱仅文档、当前 commit 源码无法验证 |
| OpenHands | 同进程(V1 反转) | Docker/Apptainer/Remote/Cloud workspace | Workspace 可插拔;tmux pane 池执行;V0 强制 Docker 被 V1 改为可选 |
| SWE-agent | Docker(默认 python:3.11) | Modal/AWS(SWE-ReX 后端) | 真正隔离逻辑在独立 SWE-ReX 仓;持久 bash 会话;git reset --hard 做尝试间隔离 |
| AutoGen | 本地/Docker | Docker+Jupyter / Azure ACI | CodeExecutor 抽象多后端;MagenticOne CLI 默认 Docker |
| AutoGPT | Docker(Py)/ 宿主(shell) | e2b / bubblewrap(Copilot) | Classic:Py 进容器、shell 不进(不对称);Copilot:bwrap+e2b 双策略 |
| OpenManus | 宿主(默认 opt-out) | DockerSandbox / Daytona 云 | network_mode=none 默认断网;tar 流文件 IO;use_sandbox=False 默认 |
| Claude-Flow | 进程内/宿主 | Docker 容器池 | --cpus/--memory 限额 + 只读项目挂载 + 可选 network ns;仅 headless-worker 路径 |
| Agent Zero | Docker(默认部署) | SSH 进容器 / 本地 PTY | 双 venv(框架 3.12/执行 3.13);RFC 分离”UI 在宿主、执行在容器” |
| Google ADK | 五档 executor | Docker/GKE/Vertex/AgentEngine | 隔离强度递增:unsafe exec → 容器 → K8s pod → 托管;built_in 走模型侧执行 |
| OpenAI Agents SDK | Unix local(beta) | Docker / 托管 provider | ”Sandbox Agents”:Manifest+Capabilities+snapshot;path-grant 防 .. 逃逸 |
| AgentScope | Local(无隔离) | Docker/E2B/K8s/OpenSandbox | Workspace 抽象兼当 Offloader;QwenPaw 底座 |
| CAMEL | subprocess(默认) | Docker/Daytona/E2B/microsandbox | 双层:解释器沙箱(含 AST internal_python)+ runtime 工具隔离(wrap 成容器内 FastAPI) |
| Letta | LocalSandbox(子进程/venv) | E2B / Modal serverless | SandboxToolExecutor 三后端;渲染隔离执行脚本,支持 Py+TS 工具 |
| Agno | 进程内 runpy(无隔离) | E2B/Daytona/Docker toolkit | safe_globals 只是命名非真沙箱;隔离靠 opt-in tool |
| DeepAgents | LocalShell(无隔离) | daytona/modal/runloop/vercel/quickjs | SandboxBackendProtocol;base64 编码内联脚本防注入;--sandbox 非默认 |
| smolagents | LocalPythonExecutor(AST,非沙箱) | E2B/Docker/Modal/Blaxel | 自研 AST 解释器 + import 白名单 + DANGEROUS_MODULES 黑名单 + 资源上限 |
| CrewAI | 无(已弃自研) | E2B/Modal(外部工具) | allow_code_execution deprecated;官方推荐接第三方沙箱 |
| Hermes | local(最快无隔离) | Docker/SSH/Singularity/Modal/Daytona | 6 后端权衡谱系;Docker 网络出站隔离(internal+egress 双网络)单独文档化 |
| Amp Orbs | 本地无沙箱 | Orbs(e2b,Debian 12) | .agents/setup/resume 生命周期钩子;快照 24h 复用;空闲自动暂停 |
| DeerFlow | LocalSandbox(非真隔离) | e2b/aio/boxlite | SandboxMiddleware per-thread 复用;默认禁 host bash;/mnt/user-data 工作目录约定 |
| Devin | — | microVM(独立内核) | “over a year of hypervisor eng”;全机器状态快照(内存+进程+fs)可关停/精确恢复 |
| v0 | — | Firecracker microVM | 每 chat 一沙箱;Amazon Linux 2023;5h 硬上限;出站默认 allow-all 可收窄 |
| Replit | — | CoW 块设备 + VM | Bottomless Storage(NBD+GCS 16MiB 分片);manifest 交换=复制/回滚;可分叉 DB |
| Kiro | 无沙箱(IDE/CLI) | 自主 agent 隔离沙箱 | 克隆仓库入沙箱;网络 3 档(仅 GitHub/常用依赖/开放);DevFile/Dockerfile 检测 |
| Qoder | git worktree | Cloud VM / 隔离容器沙箱 | --remote 转云 VM(Ctrl+C 只断订阅坑);Session 间不可达、销毁即擦 |
| Warp | 平台检测 | Docker/DockerSandbox/K8s/Namespace | IsolationPlatformType 一等枚举 + WorkloadToken;Direct 后端无容器(最弱);绕过 Codex 内置沙箱 |
| MiMo-Code | 无(Bash 宿主) | QuickJS-WASM(workflow) | workflow 沙箱:WASM + 墙钟/内存上限 + 确定性 PRNG(重放);子会话 git worktree |
| Pydantic AI | 核心无沙箱 | Monty 沙箱(Code Mode) | CodeMode 把工具包成单 run_code,模型写 Python 在 Monty 里跑;核心留钩子 |
| Browser Use | 真实 Chromium(profile 隔离) | 云 @sandbox 装饰器 | cloudpickle 序列化函数+imports POST 到云沙箱,SSE 回传 |
| UI-TARS | 本地无隔离(驱动真机) | AIO Sandbox(远程容器) | NutJS 驱动真实鼠键+抓真屏;AIO 模式禁本地资源、走远程 MCP |
| Plandex | 宿主(不隔离) | — | “沙箱”=每 plan 影子 git 仓(累积 diff review);cgroup/进程组仅用于干净杀进程树 |
| Roo Code | 无(集成终端) | — | 影子 git(ShadowCheckpointService)做回滚安全网,非预防 |
| Trae | 无(默认宿主 bash) | Docker(4 入口,rw 挂载) | 沙箱/隔离/并行/多租列为 roadmap 未来项 |
| Kimi Code | 无(KAOS local/SSH) | — | KAOS 抽象声称支持容器,但只落地 Local/SSH;系统提示明说”不在沙箱内” |
| Anthropic 多 agent | repl(JS-only 限制) | — | repl 无 DOM/无 API/无依赖,仅供计算;未披露更广沙箱 |
(纯 IDE 插件/无代码执行面的:Comate/CodeGeeX/AutoClaw/Amazon-Q/Junie/Continue/GPT-Pilot/Augment-CLI 等已在总览派系 1 归类,表中择要列出。)
分组讨论
一、OS 原生沙箱:Codex 定的调,一票 CLI 跟
在”不上容器、直接用内核原语”这条路上,Codex CLI 是无争议的技术源头与最完整实现:跨平台三件套(macOS Seatbelt SBPL、Linux bwrap+Landlock、Windows 原生),且是少数明确 fail-closed——平台无法强制策略就拒绝运行而非静默裸跑——的实现,还配了 codex sandbox 干跑调试命令。它的影响力可以直接从两个”抄底座”的案例看到:Open Interpreter 直接以 Codex 为底座、复用同一套 sandboxing/ crate;Warp 的 Oz 在把 Codex 当 harness 跑时用 --dangerously-bypass-approvals-and-sandbox 显式绕过 Codex 内置沙箱、换成自己的 Docker/K8s/Namespace 层——一个”复用”、一个”替换”,恰好框定了 Codex 沙箱的边界。
同派系里各家的取舍差异值得记:Claude Code 把沙箱做成外部包 @anthropic-ai/sandbox-runtime(同样 bwrap+Seatbelt),亮点是配置热重载(改设置无需重启)和网络策略复用 WebFetch 域名规则;Zed 的策略描述最清晰(写限 worktree、.git 恒受保护、网络逐调用 allow_hosts 升级、unsandboxed 逃生舱);Cursor 唯一给了实测数字(开沙箱后中断 -40%、约 1/3 请求跑在沙箱内),且坦白交代了放弃 App Sandbox/容器/VM 三方案的理由;Kilo Code 把 OS 沙箱(kilo-sandbox)、network profile、git snapshot、worktree 四件事叠在一起,是这一派里集成度最高的。QwenPaw 的特色是每次工具调用创建全新沙箱实例、调用完即销毁,并把”治理策略层(是否需要 fallback)“与”沙箱内核隔离层”设计成两个正交的层——这个解耦比多数同类更干净。
Gemini CLI(及其下游 Qwen Code)站在这一派和容器派中间:它把 Seatbelt 和 Docker/gVisor/LXC 并列成 5 个后端,还有”沙箱扩展弹窗”这种把被拒命令临时升权的交互,是选择面最宽的一个。
二、可插拔执行后端:同一个抽象反复被发明
一个明显的收敛模式:一旦 harness 想同时支持”本地快但不隔离”和”远程慢但安全”,几乎都会长出一个执行后端抽象基类。这不是谁抄谁,而是同构问题下的独立收敛,但命名各异很能说明设计者视角:OpenHands 叫 Workspace、SWE-agent 叫 Deployment(真正隔离逻辑外包给独立的 SWE-ReX 仓)、AgentScope 也叫 Workspace(Local/Docker/E2B/K8s/OpenSandbox)、Kimi Code 叫 KAOS、Warp 叫 IsolationPlatformType、AutoGen 叫 CodeExecutor、Google ADK 是 BaseCodeExecutor 的五档实现、DeepAgents 是 SandboxBackendProtocol、Hermes 直接铺 6 个后端、CAMEL 拆成”解释器沙箱”+BaseRuntime两套。
其中 OpenHands 的 V0→V1 反转是最有教材价值的一笔:V0 强制每个工具都进独立 Docker 沙箱,V1 反过来把默认改成同进程执行,官方给的理由是 MCP 假设本地/直接执行、加上 10GB 镜像和分钟级安装成本——一个”隔离让位于集成体验”的明确决策。AgentScope 作为 QwenPaw 的底座尤其值得点出:它的 Workspace 同时兼任 Offloader——被截断的工具结果/压缩上下文直接写进沙箱文件系统供 agent 再读,把”隔离层”和”记忆卸载层”合一,这个复用在其它 harness 里没见过。
三、远程 provider 外包:SDK 框架的”不自己造沙箱”共识
SDK/框架型 harness 的一致选择是不自研隔离,接 E2B / Modal / Daytona。CrewAI 把这条路走到了极端——直接把 allow_code_execution/CodeInterpreterTool 标 deprecated,废弃说明里点名”改用 E2B 或 Modal 等专用沙箱服务”,等于官方承认”沙箱不是框架该维护的东西”。smolagents 的分层最教科书:本地 LocalPythonExecutor 是自研 AST 解释器(docstring 直接写”这不是安全沙箱”),真隔离一律走远程(E2B/Docker/Modal/Blaxel),且诚实标注了 Docker 加固参数(cap_drop/no-new-privileges)只是文档建议、类默认不带。Letta、Agno、CAMEL、DeepAgents 结构几乎一致(Local 兜底 + E2B/Modal/Daytona 三选一),区别在 Letta 额外支持 TS 工具、DeepAgents 用 base64 编码内联脚本专门防 shell 注入。
Amp 的 Orbs(e2b 支撑)把这条路做出了产品完成度:仓库内提交 .agents/setup(建 orb 时跑一次)/.agents/resume(唤醒时跑,硬 10s 超时)生命周期钩子、setup 完快照 24h 复用、空闲自动暂停不计费——这套”沙箱即产品”的工程化程度在开源侧最高。DeerFlow 的差异化是安全默认最激进:用本地 provider 时默认直接禁掉 host bash(is_host_bash_allowed=False),逼用户切到隔离 shell,这个”默认拒绝”姿态在无隔离派系里罕见。
四、microVM / VM per-session:只有云 agent 付得起的隔离
强隔离的天花板由两家 microVM 标杆定义。Devin 是这个维度披露最详尽的——明确拒绝容器化(“共享内核 = 一个被攻陷 session 可读所有容器的 fs/凭证/网络”),改用 microVM 让每个 workload 独占内核,自陈花了”一年多的 hypervisor 工程”,并把全机器状态快照(内存+进程树+文件系统)做成 session 空闲可关停、结果到达时精确恢复的机制。v0 用 Firecracker microVM(Amazon Linux 2023),语义是”每 chat 一沙箱、5h 硬上限”,把执行模型从旧的纯浏览器端预览升级为真服务端 VM。Replit 走的是另一条更底层的路——CoW 块设备(NBD+GCS 16MiB 不可变分片)让”复制/回滚 = 交换 manifest”,checkpoint、Remix、可分叉数据库共用同一原语,路线图上的”Transactional Compute”(并行分叉沙箱 + 原子合并最优结果)直接对应推理时并行采样。
值得注意的是同一家公司会因执行地点不同用不同方案:Claude Code 本机用 OS 级 bwrap/Seatbelt,而 claude.ai 的代码执行用 gVisor 容器;Cursor 本地 Seatbelt/Landlock、云 agent 逐 VM;Copilot 本地 OS 沙箱、云 coding agent 用 GitHub Actions VM、后台 CLI agent 用独立 worktree——三种隔离对应三种信任面。Kiro 和 Qoder 也都是”本地 IDE 无沙箱 + 云自主 agent 真隔离”的双形态。
五、伪沙箱三形态:AST 解释器、WASM、影子 git
这三类都被各自 dossier 明确标注”不是安全边界”,但设计上很有意思:
- AST 受限解释器(进程内):smolagents 的
LocalPythonExecutor是原型(import 白名单 +DANGEROUS_MODULES/DANGEROUS_FUNCTIONS黑名单 + dunder 封锁 + 操作数/时间上限),CAMEL 的internal_python(InternalPythonInterpreter+ 白名单)同构,Agno 的safe_globals则被 dossier 点破”只是命名、非真沙箱”,Anthropic 多 agent 的 repl(JS-only、无 DOM/API/依赖)是这一路最小化的形态。 - WASM 沙箱:MiMo-Code 的 workflow 用 QuickJS-WASM 跑 JS,亮点是墙钟/内存上限 + 确定性 PRNG 播种(保证工作流重放得到相同伪随机序列);Pydantic AI 的 Code Mode 用 Pydantic 自研的 Monty 沙箱,配合其类型化工具把所有工具包成单个
run_code、模型写 Python 一次编排多工具省 round-trip——这是”类型系统 + 沙箱 + code-as-action”结合得最紧的一例;DeepAgents 也用 quickjs 做进程内 JS 沙箱。 - git worktree / 影子 git(文件级隔离,防并发写与做回滚,不防逃逸):Qwen Code、MiMo-Code、Claude Code、Kilo Code、Junie、Qoder 用 worktree 隔离并发子会话;Roo Code(
ShadowCheckpointService)和 Amazon Q 用影子 git 做可回滚安全网。Plandex 把这条路推到最极端——它的”沙箱”根本就是每个 plan 一个的服务端影子 git 仓,编辑先作为 pending changes 堆在里面,review/reject/rewind 都在触及真实文件之前发生,是一种”累积 diff review 沙箱”;它真正的进程隔离只有 cgroup+进程组,且仅用于干净地杀进程树,不做任何执行牢笼。
六、GUI / computer-use 动作空间下的隔离
当动作空间从”跑命令”变成”操作真实桌面”,隔离语义也随之变形。UI-TARS 本地 operator(NutJS)直接驱动真实鼠标键盘 + 抓真屏、零沙箱,远程则用 AIO Sandbox 把一切工具走远程容器的 MCP、禁本地资源。Browser Use 本地就是普通子进程 Chromium、隔离靠 browser profile(独立 user data dir),云端用 @sandbox 装饰器把整段浏览器自动化代码 cloudpickle 序列化后丢云端跑。Warp 的 computer-use 是平台专属原生代码(mac/linux/windows 各自键鼠/窗口/截图实现),确认动作走宿主机真实 OS 输入注入 API 而非无头浏览器——无论 agent 沙箱在哪,computer-use 都落在真实宿主机上。这类”动作打在真机上”的设计,本质上把隔离难题从”沙箱内核”推回到了”要不要给它一台真机/独立 VM 桌面”(对应 Devin/Cursor 云 agent 的 desktop 能力)。
最值得借鉴的设计
1. Codex CLI 的 fail-closed OS 原生沙箱 + 干跑调试。 在”本机执行”这个绝大多数 harness 逃不掉的场景里,它给了唯一同时满足”轻量(无容器/无 VM 启动成本)、跨平台、可强制”的答案,而 fail-closed(策略无法强制就拒绝运行、绝不静默裸跑)是把沙箱从”尽力而为的建议”变成”真边界”的关键一笔——对比 opencode 明确写”best-effort scans… are not sandbox boundaries”、goose 文档里的 seatbelt 沙箱在实际 commit 里都 grep 不到,就知道”能强制”这三个字的分量。codex sandbox 干跑(预览某命令在当前策略下会被允许/拒绝什么)则解决了 OS 沙箱最大的可用性痛点:策略不透明、被拒了不知道为什么。这套东西已被 Open Interpreter 直接复用为底座,是最有”被抄”实绩的设计。
2. 可插拔执行后端 + 沙箱层与治理/记忆层解耦。 QwenPaw 把”治理策略(是否需要 fallback)“与”沙箱内核隔离”设计成两个正交层,AgentScope 让 Workspace 同时兼任隔离层与上下文 Offloader——这两个解耦让”本地开发快速迭代 / 云端安全执行”能在同一份 agent 代码上仅靠切换 workspace 对象实现(OpenHands 明确宣称这一点)。对任何想同时服务”个人本地用”和”云端多租”的 harness,这个抽象是避免为两种部署写两套执行路径的必备设计,也是 SDK 型框架(Letta/CAMEL/DeepAgents)事实上的收敛终点。