跨 harness 对比:沙箱与执行隔离

总览:五条谱系

61 个 harness 在「agent 生成的命令/代码到底跑在哪、被什么挡住」这件事上,答案沿一条从”裸奔”到”独立内核”的强度谱系铺开。抽象出五条主流派系(多数 harness 同时落在两三条上——本地一套、云端另一套):

  1. 无 OS 级隔离 + 权限门兜底(最常见)。命令直接经 subprocess/child-process/集成终端在宿主机上跑,防线是”执行前审批 + 命令白/黑名单 + 输出截断”,而非内核边界。IDE 插件与轻量 CLI 几乎全属此类:AiderClineRoo CodeopencodeContinueGPT-PilotMiMo-CodeKimi CodeTrae(默认)、Amazon QJunieComateCodeGeeXAutoClawAugment(CLI)、MetaGPTLangGraphSemantic KernelGPT-Researcher

  2. OS 级原生沙箱(Seatbelt / Landlock+seccomp+bubblewrap / Windows sandbox)。不靠容器,直接用操作系统内核原语在本机把文件系统写入、网络出站按策略收窄。以 Codex CLI 为技术标杆,Claude CodeCursorZedKilo CodeQwenPawCopilotFactory DroidGemini CLI / Qwen Code 同派。

  3. 容器 / 进程级沙箱(Docker/Podman per-task 或 per-agent)。多为可插拔后端里的一档。AutoGPT(Classic Python 路径)、AutoGenOpenManusClaude-FlowAgent ZeroGoogle ADKOpenHands(Remote workspace)。

  4. 远程 / 云托管沙箱 provider(E2B / Modal / Daytona / Blaxel / e2b-Orbs)。把执行整块推到第三方隔离服务,SDK 型框架的主流做法:smolagentsLettaAgnoCAMELDeepAgentsCrewAI(弃自研、改推 E2B/Modal)、HermesAmp OrbsDeerFlow

  5. microVM / 独立内核 per-session(最强隔离,几乎只有云 agent 玩得起)。Devinv0 是两个明确的 Firecracker microVM 标杆,Cursor 云 agent、ReplitKiro 自主 agent、Qoder Cloud 各有自己的 VM 层。

横切这五派的还有三种非安全边界的”伪沙箱”,值得单列:AST 受限解释器(进程内、非真沙箱)、WASM 沙箱、以及 git worktree / 影子 git(文件级隔离,防的是并发写冲突和”回滚”,不是防逃逸)。


对比表

Harness本地默认强隔离选项关键机制 / 技术
Codex CLIOS 原生沙箱远程 exec-server(Noise 加密)Seatbelt SBPL + bwrap/Landlock + Windows 原生;fail-closed(策略无法强制则拒跑);codex sandbox 干跑调试
Claude CodeOS 原生沙箱remote / web 云沙箱(gVisor)@anthropic-ai/sandbox-runtime(bwrap+Seatbelt),配置热重载;网络按 WebFetch 域名规则
CursorOS 原生沙箱云 agent 逐 VM(checkpoint/fork)macOS Seatbelt / Linux Landlock+seccomp+overlayfs / Win WSL2;实测中断 -40%
ZedOS 原生沙箱Seatbelt/Bubblewrap/WSL-bwrap;写限 worktree,网络默认断,allow_hosts 逐调用升级
Kilo CodeOS 原生沙箱云 Cloud Agentkilo-sandbox:Seatbelt/bubblewrap + profile(fs/network 规则)+ git snapshot + worktree
QwenPawOS 原生沙箱4 后端 Seatbelt/Bubblewrap/Landlock/AppContainer + none;每次工具调用新建即弃;治理层与沙箱层解耦
Open InterpreterOS 原生沙箱(Codex 底座)--yolo 无沙箱复用 Codex 的 sandboxing crate(Seatbelt/seccomp+Landlock+bwrap/Win)
Gemini CLI可选(5 后端)gVisor/LXC/DockerSeatbelt(6 profile)/Docker/Win-native/gVisor/LXC;沙箱扩展弹窗动态升权
Qwen Code可选(继承 gemini)Docker/PodmanSeatbelt + ghcr.io/qwenlm 镜像;子 agent 走 git worktree
CopilotOS 原生沙箱GH Actions VM(Padawan 云)本地 OS 沙箱 + MXC/Win runtime;后台 agent 走独立 worktree
Factory DroidOS 沙箱(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 workspaceWorkspace 可插拔;tmux pane 池执行;V0 强制 Docker 被 V1 改为可选
SWE-agentDocker(默认 python:3.11)Modal/AWS(SWE-ReX 后端)真正隔离逻辑在独立 SWE-ReX 仓;持久 bash 会话;git reset --hard 做尝试间隔离
AutoGen本地/DockerDocker+Jupyter / Azure ACICodeExecutor 抽象多后端;MagenticOne CLI 默认 Docker
AutoGPTDocker(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 ZeroDocker(默认部署)SSH 进容器 / 本地 PTY双 venv(框架 3.12/执行 3.13);RFC 分离”UI 在宿主、执行在容器”
Google ADK五档 executorDocker/GKE/Vertex/AgentEngine隔离强度递增:unsafe exec → 容器 → K8s pod → 托管;built_in 走模型侧执行
OpenAI Agents SDKUnix local(beta)Docker / 托管 provider”Sandbox Agents”:Manifest+Capabilities+snapshot;path-grant 防 .. 逃逸
AgentScopeLocal(无隔离)Docker/E2B/K8s/OpenSandboxWorkspace 抽象兼当 Offloader;QwenPaw 底座
CAMELsubprocess(默认)Docker/Daytona/E2B/microsandbox双层:解释器沙箱(含 AST internal_python)+ runtime 工具隔离(wrap 成容器内 FastAPI)
LettaLocalSandbox(子进程/venv)E2B / Modal serverlessSandboxToolExecutor 三后端;渲染隔离执行脚本,支持 Py+TS 工具
Agno进程内 runpy(无隔离)E2B/Daytona/Docker toolkitsafe_globals 只是命名非真沙箱;隔离靠 opt-in tool
DeepAgentsLocalShell(无隔离)daytona/modal/runloop/vercel/quickjsSandboxBackendProtocol;base64 编码内联脚本防注入;--sandbox 非默认
smolagentsLocalPythonExecutor(AST,非沙箱)E2B/Docker/Modal/Blaxel自研 AST 解释器 + import 白名单 + DANGEROUS_MODULES 黑名单 + 资源上限
CrewAI无(已弃自研)E2B/Modal(外部工具)allow_code_execution deprecated;官方推荐接第三方沙箱
Hermeslocal(最快无隔离)Docker/SSH/Singularity/Modal/Daytona6 后端权衡谱系;Docker 网络出站隔离(internal+egress 双网络)单独文档化
Amp Orbs本地无沙箱Orbs(e2b,Debian 12).agents/setup/resume 生命周期钩子;快照 24h 复用;空闲自动暂停
DeerFlowLocalSandbox(非真隔离)e2b/aio/boxliteSandboxMiddleware per-thread 复用;默认禁 host bash/mnt/user-data 工作目录约定
DevinmicroVM(独立内核)“over a year of hypervisor eng”;全机器状态快照(内存+进程+fs)可关停/精确恢复
v0Firecracker microVM每 chat 一沙箱;Amazon Linux 2023;5h 硬上限;出站默认 allow-all 可收窄
ReplitCoW 块设备 + VMBottomless Storage(NBD+GCS 16MiB 分片);manifest 交换=复制/回滚;可分叉 DB
Kiro无沙箱(IDE/CLI)自主 agent 隔离沙箱克隆仓库入沙箱;网络 3 档(仅 GitHub/常用依赖/开放);DevFile/Dockerfile 检测
Qodergit worktreeCloud VM / 隔离容器沙箱--remote 转云 VM(Ctrl+C 只断订阅坑);Session 间不可达、销毁即擦
Warp平台检测Docker/DockerSandbox/K8s/NamespaceIsolationPlatformType 一等枚举 + 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 多 agentrepl(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 想同时支持”本地快但不隔离”和”远程慢但安全”,几乎都会长出一个执行后端抽象基类。这不是谁抄谁,而是同构问题下的独立收敛,但命名各异很能说明设计者视角:OpenHandsWorkspaceSWE-agentDeployment(真正隔离逻辑外包给独立的 SWE-ReX 仓)、AgentScope 也叫 Workspace(Local/Docker/E2B/K8s/OpenSandbox)、Kimi CodeKAOSWarpIsolationPlatformTypeAutoGenCodeExecutorGoogle ADKBaseCodeExecutor 的五档实现、DeepAgentsSandboxBackendProtocolHermes 直接铺 6 个后端、CAMEL 拆成”解释器沙箱”+BaseRuntime两套。

其中 OpenHands 的 V0→V1 反转是最有教材价值的一笔:V0 强制每个工具都进独立 Docker 沙箱,V1 反过来把默认改成同进程执行,官方给的理由是 MCP 假设本地/直接执行、加上 10GB 镜像和分钟级安装成本——一个”隔离让位于集成体验”的明确决策。AgentScope 作为 QwenPaw 的底座尤其值得点出:它的 Workspace 同时兼任 Offloader——被截断的工具结果/压缩上下文直接写进沙箱文件系统供 agent 再读,把”隔离层”和”记忆卸载层”合一,这个复用在其它 harness 里没见过。

三、远程 provider 外包:SDK 框架的”不自己造沙箱”共识

SDK/框架型 harness 的一致选择是不自研隔离,接 E2B / Modal / DaytonaCrewAI 把这条路走到了极端——直接把 allow_code_execution/CodeInterpreterTool 标 deprecated,废弃说明里点名”改用 E2B 或 Modal 等专用沙箱服务”,等于官方承认”沙箱不是框架该维护的东西”。smolagents 的分层最教科书:本地 LocalPythonExecutor 是自研 AST 解释器(docstring 直接写”这不是安全沙箱”),真隔离一律走远程(E2B/Docker/Modal/Blaxel),且诚实标注了 Docker 加固参数(cap_drop/no-new-privileges)只是文档建议、类默认不带。LettaAgnoCAMELDeepAgents 结构几乎一致(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——三种隔离对应三种信任面。KiroQoder 也都是”本地 IDE 无沙箱 + 云自主 agent 真隔离”的双形态。

五、伪沙箱三形态:AST 解释器、WASM、影子 git

这三类都被各自 dossier 明确标注”不是安全边界”,但设计上很有意思:

  • AST 受限解释器(进程内):smolagentsLocalPythonExecutor 是原型(import 白名单 + DANGEROUS_MODULES/DANGEROUS_FUNCTIONS 黑名单 + dunder 封锁 + 操作数/时间上限),CAMELinternal_pythonInternalPythonInterpreter + 白名单)同构,Agnosafe_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 CodeMiMo-CodeClaude CodeKilo CodeJunieQoder 用 worktree 隔离并发子会话;Roo CodeShadowCheckpointService)和 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)“与”沙箱内核隔离”设计成两个正交层,AgentScopeWorkspace 同时兼任隔离层与上下文 Offloader——这两个解耦让”本地开发快速迭代 / 云端安全执行”能在同一份 agent 代码上仅靠切换 workspace 对象实现(OpenHands 明确宣称这一点)。对任何想同时服务”个人本地用”和”云端多租”的 harness,这个抽象是避免为两种部署写两套执行路径的必备设计,也是 SDK 型框架(Letta/CAMEL/DeepAgents)事实上的收敛终点。