AI Agent 代码执行沙箱横评:当不可信代码需要跑起来,我们到底有多少选择?

AI6天前发布 beixibaobao
15 0 0

AI Agent 代码执行沙箱横评:当不可信代码需要跑起来,我们到底有多少选择?

写在前面

2024 年之后,AI Agent 成了所有技术团队绕不开的话题。不管是做 Copilot、做自动化运维、做 SWE-Bench 代码修复,还是做 RL 训练环境,一个核心问题始终存在:模型生成的代码,你敢直接跑在宿主机上吗?

答案是显而易见的——不敢。

一段 rm -rf / 就能让你整个服务瘫痪,一个 curl http://internal-api/admin/delete-all 就能清空生产数据库,一个死循环就能把 CPU 吃满导致整个集群不可用。这些不是危言耸听,而是每一个让 AI 执行过代码的团队都认真思考过的问题。

所以我们需要沙箱。问题变成了:市面上的沙箱方案那么多,到底哪一个适合你的场景?

这篇文章,我花了将近两周时间,在本地 WSL 环境完整部署并实测了 CubeSandbox,同时对照测试了 Docker、E2B、Daytona 几个主流方案。

项目地址:github.com/TencentCloud/CubeSandbox

我想用真实的操作过程和数据,帮你理清这些方案的差异。


一、为什么 AI 代码执行必须要有沙箱?

先说结论:任何直接在宿主机或主服务进程内执行模型生成代码的行为,都是生产事故的预备役。

具体来说,不可信代码执行面临的风险包括但不限于:

风险类型 具体表现 后果
文件系统越权 读写 /etc/passwd.env 文件、数据库文件 密钥泄露、配置篡改
网络访问滥用 扫描内网端口、调用内部 API、向外发送数据 数据泄露、内网渗透
资源占用失控 死循环、内存泄漏、fork 炸弹 服务不可用、主机宕机
危险命令执行 rm -rfchmod 777、安装恶意软件 系统损坏、持久化后门
侧信道攻击 通过 /proc/sys 读取宿主机信息 信息收集、漏洞利用

理想的 AI 代码执行沙箱需要满足以下要求:

  1. 隔离性:沙箱内的代码不能访问宿主机的文件系统、网络、进程空间
  2. 可销毁性:执行完毕后,沙箱及其所有状态能够被完全清除
  3. 可控的网络访问:能精确控制沙箱能否联网、能访问哪些地址
  4. 启动速度足够快:Agent 任务通常是短平快的,启动延迟直接影响用户体验
  5. 资源开销可控:单机要能跑足够多的沙箱实例,成本才压得住
  6. 接入成本低:最好能复用现有的 SDK 和调用方式,迁移成本小

带着这些要求,我们来看市面上都有哪些选择。


二、参评选手一览

本次横评覆盖了六类主流方案,它们代表了当前 AI 代码执行的几种主要技术路线:

2.1 方案总览

方案 技术路线 隔离模型 部署方式 代表产品
MicroVM 沙箱 KVM/Firecracker 虚拟化 独立内核 自托管 CubeSandbox
托管云沙箱 云端托管 MicroVM/容器 以官方说明为准 SaaS E2B
Agent 平台 云端开发环境 + Agent 能力 以官方说明为准 SaaS/平台化 Daytona
开源通用沙箱 容器/K8s runtime 抽象层 Docker / K8s 自托管 OpenSandbox
容器方案 Linux Namespace + cgroup 共享宿主内核 自托管 Docker
传统虚拟机 QEMU/KVM 完整虚拟机 独立内核 自托管/云主机 传统 VM

2.2 各方案定位简述

CubeSandbox 是腾讯云开源的 AI Agent 安全沙箱项目,基于 KVM MicroVM 技术。每个沙箱拥有独立的 Linux 内核,通过 XFS reflink 实现 CoW 快照,支持 Snapshot、Clone、Rollback 等高级状态管理能力。它兼容 E2B SDK 接口,支持自托管部署。

image.png

E2B 是目前最知名的托管式 AI 代码执行沙箱服务。开发者通过 SDK 即可创建云端沙箱执行代码,无需关心底层基础设施。它的优势是接入简单,开箱即用;缺点是数据要走他们的服务器,且无法自托管。

Daytona 定位更偏向于"Agent 的计算机",提供完整的云端开发环境和代码执行能力。它更像是一个面向 Agent 的 Cloud IDE + 执行环境的组合。

OpenSandbox 是一个开源的通用沙箱平台,支持 Docker 和 Kubernetes 作为底层运行时。它的定位是做一个标准化的沙箱抽象层,让上层应用不关心底层是 Docker 还是 K8s。

Docker 是最广泛使用的容器方案。它轻量、快速、生态成熟,但共享宿主内核的特性意味着隔离性不如 MicroVM 方案。对于可信或低风险场景,Docker 仍然是最佳选择。

传统 VM(如 QEMU/KVM)提供最强的隔离性,但启动速度通常在秒级甚至十秒级别,资源开销也远大于容器和轻量级 MicroVM。


三、本地部署与验证

本节为部署过程概要。详细的逐步截图和踩坑记录可以参考项目官方文档和社区教程,这里只保留关键节点,快速进入后续的性能评测环节。

3.1 测试环境

我的测试机器配置如下,后续所有 CubeSandbox 数据均来自此环境:

检测项目 实测详情
操作系统 Windows 10 Home China + WSL2 Ubuntu 24.04 LTS
CPU Intel Core Ultra 7 255H, 16 vCPU
内存 15Gi RAM + 4.0Gi Swap
KVM 虚拟化 /dev/kvm 可用, nested=Y
Docker Engine 29.3.0, Compose v5.1.0

由于 WSL 与裸金属在 I/O 调度和内存管理上的客观差异,本文数据定位为「功能验证和趋势参考」。生产容量规划请参考项目仓库中基于腾讯云 BMI5 裸金属实例的 benchmark。

环境检查

3.2 部署要点

部署过程主要分四步,每一步都有一个硬性前置条件:

Step 1 — 环境准备:确保 systemd 为 PID 1、KVM 可用、Docker 已安装。其中 KVM 是 CubeSandbox 能跑 MicroVM 的前提,没有 /dev/kvm 则无法继续。

systemd 和 KVM 检查


KVM 详情


嵌套虚拟化


Docker 版本

Step 2 — XFS 文件系统:CubeSandbox 依赖 XFS reflink 做 CoW 快照。WSL 默认 ext4 不满足要求,需创建 loopback XFS 镜像并挂载到 /data/cubelet

sudo fallocate -l 80G /cubelet-xfs.img
sudo mkfs.xfs -f -m reflink=1 /cubelet-xfs.img
sudo mount -o loop,pquota /cubelet-xfs.img /data/cubelet

XFS 准备与挂载

Step 3 — 一键安装:一条命令完成发布包下载、镜像拉取、服务启动:

NODE_IP="$(hostname -I | awk '{print $1}')"
curl -sL https://cnb.cool/CubeSandbox/CubeSandbox/-/git/raw/master/deploy/one-click/online-install.sh 
  | MIRROR=cn bash -s -- --node-ip="${NODE_IP}"

一键安装

Step 4 — 验证:确认 systemd target active、容器正常运行、health endpoint 有响应。然后通过 WebUI (http://127.0.0.1:12088) 登录管理界面。

WebUI 控制台


模板市场


四、创建代码执行模板并验证基础能力

本章为 CubeSandbox 基础使用流程的简要概述。模板创建、SDK 配置、代码执行、网络策略等详细操作步骤在官方文档和社区中已有大量教程,这里只保留核心要点,快速验证沙箱可用性后进入性能评测环节。

4.1 快速上手流程

CubeSandbox 的使用分为三步:创建模板 → SDK 调用 → 执行代码

第一步:从镜像创建模板

cubemastercli tpl create-from-image 
  --image cube-sandbox-cn.tencentcloudcr.com/cube-sandbox/sandbox-code:latest 
  --writable-layer-size 1G 
  --expose-port 49999 
  --expose-port 49983 
  --probe 49999

构建完成后通过 cubemastercli tpl list 查看模板 ID(记下 READY 状态的 ID,后续调用需要)。

第二步:配置 Python SDK

CubeSandbox 兼容 E2B 的 Python SDK,已有 E2B 用户可零成本迁移:

pip install e2b-code-interpreter "cubesandbox>=0.2.0"
# 设置环境变量
export E2B_API_URL="http://127.0.0.1:3000"
export E2B_API_KEY="e2b_000000"
export CUBE_TEMPLATE_ID="<你的模板ID>"

第三步:执行代码

from e2b_code_interpreter import Sandbox
with Sandbox.create(template=os.environ["CUBE_TEMPLATE_ID"]) as sandbox:
    result = sandbox.run_code("print('Hello from CubeSandbox'); print(sum(range(1, 101)))")
    print(result)  # 输出: Hello from CubeSandbox / 5050

4.2 核心能力一览

除基础代码执行外,SDK 还支持:

能力 说明
Shell 命令执行 sandbox.commands.run("uname -a") 等,沙箱内完整 Linux 环境
文件读写操作 沙箱内部文件系统隔离,不影响宿主机
网络策略控制 支持完全断网、黑名单、白名单三种模式,在虚拟网络设备层面拦截

其中网络策略是 CubeSandbox 区别于多数容器的核心优势——策略在 MicroVM 的 tap 网络层执行,沙箱内代码无法绕过,这对防止 AI 代码扫描内网或外传数据至关重要。


五、性能评测一:冷启动与并发创建能力

冷启动速度是衡量沙箱是否适合 AI Agent 场景的首要指标。Agent 任务通常是「收到请求 -> 生成代码 -> 创建沙箱 -> 执行代码 -> 返回结果 -> 销毁沙箱」这样的流程,每一步的延迟都会累积到用户体验上。

5.1 测试方法说明

使用 CubeSandbox 仓库自带的 cube-bench 压测工具进行测试。该工具会按指定的并发数和请求总数创建沙箱,统计每次创建的耗时分布。

先编译工具:

cd /home/kk/CubeSandbox/examples/cube-bench
make
./bin/cube-bench --help

编译 cube-bench

编译过程中需要 Go 环境,如果没有的话先 apt install golang-go

Go 环境安装后编译成功

5.2 本地 WSL 实测数据

我跑了三组不同并发档位的测试:

第一组:1 并发,20 次请求

./bin/cube-bench -c 1 -n 20 -w 3 --no-tui 
  -o ~/cubesandbox-eval-reports/coldstart/cube_c1_n20.json 
  | tee ~/cubesandbox-eval-reports/coldstart/cube_c1_n20.txt

1 并发测试结果

第二组:10 并发,100 次请求

./bin/cube-bench -c 10 -n 100 -w 3 --no-tui 
  -o ~/cubesandbox-eval-reports/coldstart/cube_c10_n100.json 
  | tee ~/cubesandbox-eval-reports/coldstart/cube_c10_n100.txt

10 并发测试结果

第三组:更高并发(可选)

资源充足的情况下可以尝试 50 并发 500 请求的压测,但在 WSL 中可能会触发资源上限。

5.3 核心数据分析

从 JSON 中提取核心指标:

jq '{config, summary, create}' ~/cubesandbox-eval-reports/coldstart/cube_c1_n20.json
jq '{config, summary, create}' ~/cubesandbox-eval-reports/coldstart/cube_c10_n100.json

JSON 数据分析

汇总如下表:

并发数 请求数 平均延迟(ms) 最小值(ms) P50(ms) P95(ms) P99(ms) 最大值(ms) 吞吐(QPS) 成功率
1 20 750.583 324.168 861.678 933.688 945.757 945.757 0.7551 100%
10 100 754.761 302.860 858.702 961.058 1045.686 1046.545 6.2741 100%

5.4 与官方 Benchmark 数据对比

这里有一个重要的口径问题需要说清楚。上面的数据来自我本地的 WSL2 环境(Intel Ultra 7 255H,16 vCPU,15GB 内存),受限于 WSL 的 I/O 调度、Windows 动态内存分配和网络栈开销。

CubeSandex 官方在腾讯云 BMI5 裸金属实例上的 benchmark 数据则完全不同量级:

环境 单并发平均延迟 单并发 P95 20 并发平均 20 并发吞吐
我的 WSL 本地 ~750ms ~934ms 未稳定测试
官方 BMI5 裸金属(96核/375G) 47.8ms 57.4ms 98.1ms 180.9/s
官方 SA9.4XLARGE32 PVM (16核/32G) 66.7ms 78.2ms 364.6ms 约 50/s

差距来自硬件规格、虚拟化层级和调度效率。但这恰恰说明了一点:CubeSandbox 在合适的硬件上能达到真正的毫秒级启动,而 WSL 本地的几百毫秒主要是环境限制而非软件本身的瓶颈。

如果你正在做技术选型,建议以官方裸金属/PVM 数据为参考基准。WSL 数据的意义在于证明功能可用和趋势正确。


六、性能评测二:单机内存密度

内存密度决定了单机能跑多少个沙箱实例,直接影响成本。

6.1 测试方法

使用 cube-benchcreate-only 模式,分批创建沙箱并观察内存变化:

# 先清理残留沙箱
cubemastercli list --all -q | xargs -r cubemastercli destroy
# 记录基线内存
free -m | tee mem_baseline.txt

基线内存

然后分批创建 1 个、累计 5 个、累计 10 个沙箱,每次记录内存变化。

6.2 内存密度数据

存活沙箱数 Available Memory (MB) 下降量 (MB) 摊销 MB/沙箱
0 (基线) 10138 0
1 10070 68 68.00
5 10070 68 13.60
10 10013 125 12.50

内存测试过程


5个沙箱内存


10个沙箱内存

6.3 关于内存数据的两个口径

这里需要特别说明 CubeSandbox 内存数据的两个常见口径:

  • <5MB 口径:这是 README 中提到的 hypervisor 层面开销,指的是单个 MicroVM 进程本身的内存占用
  • 21-34MB/实例 口径:这是官方 benchmark 中的端到端摊销内存,包含了 shim 进程、网络栈、存储挂载点等全部运行态开销

两者描述的不是同一个东西。前者更接近理论下限,后者是生产环境中更实用的参考数值。

在我的 WSL 环境中,由于 Windows 动态内存管理和页缓存的影响,观测到的摊销值约为 12-68MB/实例,波动较大。正式容量规划仍应以裸金属/PVM benchmark 为准

官方裸金属环境下,1000 个空闲沙箱的摊销内存约为 25.7MB/实例,PVM 云主机环境下约 27-34MB/实例,估算单机可承载约 700+ 个空闲沙箱


七、性能评测三:快照、克隆与回滚

这一节是 CubeSandbox 与其他方案拉开差距的核心差异化能力。

7.1 为什么 Agent 需要快照能力?

考虑这样一个典型的 AI Agent 工作流:

  1. Agent 收到一个代码修复任务
  2. 创建沙箱,拉取代码,安装依赖,跑测试 → 状态 A
  3. 尝试第一种修复方案 → 失败
  4. 如果没有快照:只能销毁沙箱,重新从头开始(回到第 2 步)
  5. 如果有快照:从状态 A 直接回滚,然后尝试第二种方案
  6. 如果还能克隆:从状态 A 同时 fork 出 5 个分支,并行尝试 5 种不同的修复策略

可以看到,Snapshot / Clone / Rollback 不是锦上添花,而是多分支 Agent 试错场景的刚需。缺少这个能力,Agent 的探索效率和成本都会受到很大影响。

7.2 快照功能验证

先跑一遍功能 demo 确认基本能力:

cd /home/kk/CubeSandbox/examples/snapshot-rollback-clone
source ~/cube-eval-venv/bin/activate
pip install -r requirements.txt
python 01_create_snapshot.py   # 创建快照
python 04_state_preserved.py   # 验证状态保存
python 09_rollback.py          # 验证回滚功能

快照功能 demo

7.3 Snapshot 性能测试

测试不同并发下的快照创建速度:

并发数 轮次 平均耗时(ms) P95(ms) 单次摊销(ms)
1 3 411.7 484.0 411.7
5 3 495.3 547.0 99.1
10 3 711.8 809.5 71.2

Snapshot 并发测试

10 并发下,每个快照的平均摊销时间只有 71.2ms。这意味着在高并发场景下,快照的开销非常小。

7.4 脏页大小影响测试

快照的大小会受到沙箱内已修改数据(脏页)的影响:

写入脏页量(MB) 脏页大小(MB) 快照耗时(ms) 从快照创建耗时(ms)
0 待记录 待记录
10 待记录 待记录
50 待记录 待记录
100 待记录 待记录

脏页测试

7.5 Create from Snapshot 测试

从一个已有快照创建新沙箱的速度:

并发数 轮次 平均耗时(ms) P95(ms)
1 3 待记录 待记录
5 3 待记录 待记录
10 3 待记录 待记录

Create from Snapshot

7.6 Rollback 测试

将沙箱回滚到某个历史快照点的速度:

并发数 轮次 平均耗时(ms) P95(ms)
1 3 待记录 待记录
5 3 待记录 待记录

Rollback 测试

7.7 Clone 测试

Clone 是从一个运行中的沙箱复制出一个全新的独立沙箱,两者后续互不影响。这是多分支 Agent 场景中最常用的操作:

克隆数量 并发数 轮次 总耗时(ms) 单次摊销(ms)
1 1 3 1378.2 1378.2
10 5 2 2486.9 248.7

Clone 测试

7.8 官方裸金属快照数据参考

同样,给出官方在 BMI5 裸金属上的数据供参考:

操作 裸金属单次耗时 高并发摊销
Snapshot ~49.8ms 10 并发 ~12.7ms/snapshot
Create from Snapshot ~63.9ms 50 并发 ~3.6ms/sandbox
Rollback ~81.6ms 10 并发 ~26.6ms/rollback
Clone (单个) ~219.6ms 100 个/50 并发 ~5.4ms/clone

这些数字的含义是:在足够的硬件资源下,CubeSandbox 的状态管理操作都能做到毫秒级完成。特别是 Clone 操作在高并发下的摊销成本极低,非常适合 Agent 并行试错的场景。


八、性能评测四:Docker 对照基线

为了给横测提供一个本地参照,我用相同的环境测试了 Docker 容器的冷启动速度。

需要强调的是:这个对照组的目的不是为了证明 Docker 慢,而是为了展示两种不同隔离模型的取舍。Docker 共享宿主内核,CubeSandbox 每个沙箱独立内核——它们的定位和适用场景本来就不同。

8.1 测试方法

docker pull python:3.11-slim
for i in $(seq 1 20); do
  /usr/bin/time -f "%e" docker run --rm python:3.11-slim python -c 'print(1)' >/dev/null
done 2>&1 | tee docker_run_seconds.txt

Docker 测试

8.2 Docker 测试结果

awk '...计算逻辑...' docker_run_seconds.txt

Docker 统计结果

指标 数值
测试次数 20
平均耗时 0.794s (794ms)
最小值 0.68s (680ms)
最大值 0.84s (840ms)

8.3 Docker vs CubeSandbox:如何理解这个数据?

在我的 WSL 环境下:

  • Docker 启动一个 Python 容器并执行 print(1)平均 794ms
  • CubeSandbox 创建一个 MicroVM 沙箱并执行代码:平均 ~750ms(1 并发)

两者的启动时间在同一量级。但这并不代表它们的能力相同:

维度 Docker CubeSandbox
隔离强度 共享宿主内核,Namespace 级隔离 独立内核,KVM 硬件级隔离
网络控制 需要额外配置(iptables/NetworkPolicy) 内置 allowlist/denylist/断网模式
快照/回滚 不支持运行态快照 内置 Snapshot/Rollback/Clone
内核逃逸风险 存在(历史上多次 CVE) 显著降低(独立内核)
适用代码类型 可信或低风险脚本 不可信代码、第三方生成的代码

如果你只执行自己写的、经过 review 的脚本,Docker 完全够用。但如果要执行 AI 模型生成的代码,CubeSandbox 提供的安全边界更可靠。


九、第三方平台实测:E2B 与 Daytona

除了本地可部署的方案,我还实测了两个主流的云端托管沙箱服务。

9.1 E2B 实测

E2B 是目前最流行的托管式 AI 代码执行沙箱。申请 API Key 后,用官方 SDK 进行测试:

pip install -U e2b-code-interpreter
unset E2B_API_URL   # 不要沿用本地 CubeSandbox 的 URL
unset SSL_CERT_FILE  # 访问 E2B 云端不需要本地证书
export E2B_API_KEY="<你的 E2B Key>"

E2B Key 申请

编写 benchmark 脚本,测试 20 次创建→执行→销毁的端到端耗时:

python bench_e2b_code_interpreter.py

E2B 测试执行

E2B 的控制台也能看到调用记录:

E2B 控制台数据

9.2 Daytona 实测

Daytona 更偏向于提供完整的 Agent 开发环境:

pip install -U daytona
export DAYTONA_API_KEY="<你的 Daytona Key>"
export DAYTONA_API_URL="https://app.daytona.io/api"
export DAYTONA_TARGET="us"

Daytona Key 申请

python bench_daytona.py

Daytona 测试


Daytona 数据分析

9.3 第三方平台的数据口径说明

E2B 和 Daytona 的测试数据来自云端服务的 API 调用,网络链路涉及:

  • 本地 WSL → 公网 → E2B/Daytona 云端 → 返回结果

这与本地运行的 CubeSandbox 和 Docker 不在同一测试环境中,因此:

  • 不做绝对的毫秒数排名,因为网络延迟占了很大比例
  • 主要关注其 接入体验、API 设计、成功率、错误处理 等定性维度
  • 性能数据仅作为趋势参考

十、综合对比与选型建议

10.1 能力对比总表

能力维度 CubeSandbox Docker E2B Daytona OpenSandbox 传统 VM
隔离模型 KVM MicroVM,独立内核 Namespace/cgroup,共享内核 托管沙箱 托管环境 Docker/K8s runtime 完整虚拟机
冷启动速度 裸金属 ~47.8ms ~500-800ms 云端 ~数秒(含网络) 云端 ~数秒 取决于底层 2-10 秒
高并发支持 裸金属 180+/s 受内核共享限制 取决于配额 取决于配额 取决于 K8s 调度 极差
内存开销 ~21-34MB/实例 ~数十MB/容器 不感知 不感知 取决于镜像 数百MB~数GB
自托管 支持 支持 企业版/BYOC 支持 支持
快照/回滚 内置支持 仅文件系统/commit 有限支持 有限支持 视实现而定 支持但慢
克隆/Fork 内置 Clone 不支持 不支持 视情况而定 不支持 支持但慢
网络控制 内置策略引擎 需自行配置 以官方为准 以官方为准 取决于 CNI 完全自主
凭据注入 支持(CubeEgress) 需自行实现 以官方为准 以官方为准 需自行实现 需自行实现
SDK 兼容 E2B SDK 兼容 Docker API 官方 SDK 官方 SDK 多语言 SDK 无标准 SDK
审计日志 内置 需自行搭建 以官方为准 以官方为准 需自行搭建 需自行搭建

10.2 分场景选型建议

场景一:只需要跑几行可信脚本

推荐:Docker

如果你的场景是执行你自己写好的、经过 code review 的脚本,或者跑 CI/CD 中的构建任务,Docker 已经足够。它生态成熟、文档丰富、社区活跃,遇到问题随便一搜就有答案。

场景二:想最快接入,不想管基础设施

推荐:E2B / Daytona

如果你的团队规模不大,不想花时间维护沙箱基础设施,只想用一个 API 把代码丢出去执行拿结果回来,那托管服务是最省心的选择。代价是你的代码数据会经过他们的服务器,且无法深度定制底层行为。

场景三:有合规要求,数据不能出内网

推荐:CubeSandbox / Docker / OpenSandbox

金融、医疗、政务等行业通常有数据不出内网的要求。这时 SaaS 类的托管方案就直接排除了,只能在自托管方案中选择。CubeSandbox 在自托管方案中隔离性最强。

场景四:AI Agent 多分支试错 / SWE-Bench / RL 训练

推荐:CubeSandbox

这是 CubeSandbox 最擅长的场景。Agent 在尝试多种修复策略时,需要频繁地从某个中间状态 fork 出多个分支、并行执行、失败后回滚。CubeSandbox 的 Snapshot / Clone / Rollback 正是为这种工作流设计的:

初始状态(A) ──→ Snapshot ──→ 保存为 checkpoint
                    │
                    ├─── Clone ──→ 分支1: 尝试 strategy_A
                    ├─── Clone ──→ 分支2: 尝试 strategy_B
                    ├─── Clone ──→ 分支3: 尝试 strategy_C
                    │
              分支1 失败 → Rollback 回到 A
              分支2 成功 → 继续
              分支3 失败 → 销毁

没有快照能力的沙箱,每次试错都需要从头创建环境,时间和资源成本都会成倍增加。

场景五:需要极致的隔离安全性

推荐:CubeSandbox > 传统 VM > Docker

如果执行的是完全不可信的代码(比如来自互联网用户的提交),隔离安全性的优先级最高:

  • Docker 有内核共享带来的逃逸风险(虽然实际利用难度不低,但理论上存在)
  • 传统 VM 隔离最强但太重
  • CubeSandbox 在两者之间找到了平衡点:独立内核保证隔离强度,MicroVM 保证启动速度

十一、CubeSandbox 的架构亮点

经过这次完整的部署和实测,我认为 CubeSandbox 有几个值得单独拿出来说的设计决策:

11.1 KVM MicroVM 而非容器

这是 CubeSandbox 与大多数竞品最根本的区别。市面上绝大多数代码执行沙箱都是基于 Docker 容器实现的,而 CubeSandbox 选择了一条更重的路——每个沙箱都是一个独立的虚拟机。

这个选择带来了:

  • 更强的隔离边界:沙箱内的代码即使拿到 root 权限,也只能影响自己的虚拟机内核
  • 更清晰的权限模型:不需要担心容器逃逸、namespace 穿透这类问题
  • 更好的审计基础:每个沙箱有独立的系统日志、进程树、网络栈

当然也有代价:需要 /dev/kvm、需要 XFS 文件系统、部署门槛略高一些。

11.2 E2B SDK 兼容

这是一个很聪明的产品决策。E2B 目前是 AI 代码执行沙箱领域的事实标准,大量现有的 AI 应用已经集成了 E2B SDK。CubeSandbox 选择兼容 E2B 的接口协议,意味着这些应用只需要把 E2B_API_URLapi.e2b.dev 改成本地 CubeSandbox 地址,就可以无缝切换过来。

实测中我也验证了这一点:用 e2b-code-interpreter 的 SDK 直接连接本地 CubeSandbox,零改动即可工作。

11.3 完整的状态管理层

很多沙箱方案只解决了「创建」和「销毁」的问题,但对于运行中的状态管理缺乏支持。CubeSandbox 内置了:

  • Snapshot:将当前运行状态保存为快照
  • Create from Snapshot:从快照恢复出新沙箱
  • Rollback:将当前沙箱回退到某次快照
  • Clone:复制出一个与当前状态完全一致的新沙箱

这套能力组合在一起,构成了面向 Agent 工作流的完整状态管理原语。

11.4 网络策略内置

网络控制不是事后加的功能,而是 CubeSandbox 的核心设计之一。通过 CubeVS(虚拟交换机)和 CubeEgress(出站代理)的组合,可以实现:

  • 完全断网:沙箱无法访问任何网络地址
  • 黑名单:允许访问大部分网络,但屏蔽特定目标
  • 白名单:只允许访问预授权的少数地址
  • 凭据注入:将 API Key 注入沙箱的代理层,不让代码直接接触明文密钥

十二、CubeSandbox 的局限性与适用边界

任何技术方案都有其适用边界,CubeSandbox 也不例外。以下是我在实测中发现的一些限制:

12.1 部署门槛相对较高

相比于 Docker 的 docker run 一条命令就能用起来,CubeSandbox 的前置要求更多:

  • 需要 KVM 支持(意味着需要物理机的 CPU 虚拟化能力,或者云主机的嵌套虚拟化)
  • 需要 XFS 文件系统(Linux 默认 ext4,需要额外配置)
  • 需要 systemd(WSL 需要手动开启)

对于没有 Linux 运维经验的团队,初次部署可能会踩坑。

12.2 WSL 支持有限

虽然我在 WSL2 上成功跑通了全部流程,但 WSL 毕竟不是 CubeSandbox 的推荐部署环境。性能数据和稳定性都无法与裸金属相比。如果要在 Windows 开发机上体验 CubeSandbox,WSL 是可行的路径,但不代表生产环境可以这样用。

12.3 生态还在早期

CubeSandbox 是一个相对年轻的项目(2026 年 4 月 22 日正式开源)。相比 Docker 十年的生态积累、E2B 两三年的市场推广,CubeSandbox 的:

  • 社区案例还不多
  • 文档和教程还在完善中
  • 第三方集成(除 E2B SDK 外)还比较少

对于追求成熟稳定、不想踩坑的团队,这可能是一个顾虑因素。

12.4 不适用于长时间运行的服务

CubeSandbox 的定位是临时的代码执行环境,而不是长期运行的服务容器。如果一个进程需要运行数小时或数天,传统的容器方案或 VM 可能更适合。


十三、总结

经过近两周的实测,我对这几个方案有了直观的认识。最后用一句话总结各自的定位:

方案 一句话定位
Docker 「我就跑个脚本,别搞那么复杂」
E2B / Daytona 「我不管底层是什么,给我个 API 就行」
传统 VM 「我要最强的隔离,不在乎速度」
OpenSandbox 「我要一个通用的沙箱抽象层」
CubeSandbox 「我要自托管、要强隔离、要快、还要能快照回滚」

如果你的需求和最后一行的描述吻合——尤其是如果你正在做 AI Agent 的代码执行、SWE-Bench 之类的自动化任务,或者有合规要求必须自托管——那么 CubeSandbox 值得你花时间去了解和试用。

项目地址:github.com/TencentCloud/CubeSandbox

仓库里包含了完整的部署文档、benchmark 工具、各种示例代码(代码执行、网络策略、快照回滚、OpenAI Agents 集成等),以及基于裸金属和 PVM 的详细性能报告。觉得有用的话,可以去 GitHub 点个 Star 关注后续更新。


本文所有 CubeSandbox 实测数据均来自作者本地 WSL2 环境(Intel Core Ultra 7 255H, 16 vCPU, 15GB RAM, WSL 2.6.2.0, Ubuntu 24.04 LTS)。E2B 和 Daytona 数据来自对应云服务的 API 调用,受网络链路影响。Docker 数据为本机容器启动计时。不同产品的测试环境、配置和工作负载存在客观差异,横向对比时请注意数据口径。生产环境的性能数据以各产品官方 benchmark 为准。

© 版权声明

相关文章