Agent Sandbox / Runtime 选型:E2B / Daytona / Modal / Cloudflare Sandbox 隔离强度 + cold start + egress
难度:中级 🆕 2026 新增(Harness 主题) 分类:Production & Deployment
简短回答
Agent Sandbox / Runtime 选型是 Production 团队 2025-2026 最绕不开的工程决策。隔离强度三档分明:Firecracker microVM(KVM 硬件级,~125ms 启动,E2B 与 Vercel Sandbox 选它)> Kata Containers / gVisor(用户态内核 Sentry,1-5s,Modal 选它)> 普通 Container(共享 host kernel,Daytona/Cloudflare Containers 默认)/ V8 Isolate(毫秒级但跑不了 numpy)。计费精度普遍 per-second,Cloudflare 在 2025-11-21 进一步把 Container 计费从"按 provisioned CPU"改成"按 active CPU",agent 突发型负载因此降本数倍。
网络 Egress 是沙箱最容易出 CVE 的边界:CVE-2025-66479(Claude Code BashTool "空白 allowlist 等于全放行")与 SOCKS5 null-byte 注入(影响 Claude Code v2.0.24 – v2.1.89,attacker-host.com\x00.google.com 让 endsWith(".google.com") 命中)是 2025-2026 两个标志性 parser-differential 漏洞,证明单层 allowlist 永远不够。业界已收敛的最佳实践是 default-deny + 三层独立防御(env 隔离 + DNS 限制 + iptables)+ 拦截 169.254.169.254 IMDS + 连接时验 IP + 凭证不下放(Cloudflare Outbound Workers / Anthropic Managed Agents 同款 token broker 模式)。多 Agent 并行 harness 设计正在收敛:Anthropic Managed Agents 的演进路径"先单 container 全揽 → 拆 harness + sandbox 双进程 + 标准 provision({resources}) 接口"已成行业典型范式。
Cheat Sheet:
•
隔离三档:Firecracker(硬件级 KVM)> gVisor / Kata(用户态内核)> Container / V8 Isolate(共享 kernel)
•
Cold start:V8 Isolate ms / Firecracker warm 78-200ms / gVisor 1-5s / VM 分钟级
•
计费精度:per-second 已是行业默认(E2B / Daytona / Modal / Cloudflare),Cloudflare 2025-11 active-CPU 让 agent 突发场景降本
•
真实 CVE:CVE-2025-66479 空白 allowlist + SOCKS5 null-byte(v2.0.24-v2.1.89)
•
Egress 三层防御:default-deny + env/DNS/iptables 独立 + 拦 169.254.169.254 + 连接时验 IP + token broker
•
Harness 范式:harness + sandbox 解耦,provision({resources}) 标准接口替换 sandbox 实现
详细解析
产品矩阵速览(七大目标横向对比)
价格/参数截至 2026-05,详见各厂商官方文档
#QiMZZwUimIPQ text { white-space: pre; }#QiMZZwUimIPQ .fb0 { stroke: var(--N900-FG, 0.15); }#QiMZZwUimIPQ .fb0 {stroke: rgba(31,35,41, 0.15)}#QiMZZwUimIPQ .fx0 { stroke-miterlimit: 10; }#QiMZZwUimIPQ .fx0 {stroke-miterlimit: 10}#QiMZZwUimIPQ .fa1 { fill: rgb(187, 191, 196); }#QiMZZwUimIPQ .fa1 {fill: rgb(187, 191, 196)}#QiMZZwUimIPQ .fx1 { font: 400 12px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#QiMZZwUimIPQ .fx1 {font-style: normal}#QiMZZwUimIPQ .fx2 { text-anchor: middle; }#QiMZZwUimIPQ .fx2 {text-anchor: middle}#QiMZZwUimIPQ .fx3 { dominant-baseline: central; }#QiMZZwUimIPQ .fx3 {dominant-baseline: central}#QiMZZwUimIPQ .fx4 { stroke: none; }#QiMZZwUimIPQ .fx4 {stroke: none}#QiMZZwUimIPQ .fc0 { fill: var(--text-caption); }#QiMZZwUimIPQ .fc0 {fill: #646a73}#QiMZZwUimIPQ .fa2 { fill: var(--text-link-disabled); }#QiMZZwUimIPQ .fa2 {fill: rgb(187, 191, 196)}#QiMZZwUimIPQ .fx5 { font: 400 13px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#QiMZZwUimIPQ .fx5 {font-style: normal}#QiMZZwUimIPQ .fx6 { text-anchor: start; }#QiMZZwUimIPQ .fx6 {text-anchor: start}#QiMZZwUimIPQ .fx7 { dominant-baseline: alphabetic; }#QiMZZwUimIPQ .fx7 {dominant-baseline: alphabetic}#QiMZZwUimIPQ .fc1 { fill: rgb(0, 0, 0); }#QiMZZwUimIPQ .fc1 {fill: rgb(0, 0, 0)}#QiMZZwUimIPQ .fb1 { fill: var(--N900-FG, 0.15); }#QiMZZwUimIPQ .fb1 {fill: rgba(31,35,41, 0.15)}#QiMZZwUimIPQ .fb2 { fill: rgb(209, 217, 224); }#QiMZZwUimIPQ .fb2 {fill: rgb(209, 217, 224)}#QiMZZwUimIPQ .fa3 { fill: var(--bg-body); }#QiMZZwUimIPQ .fa3 {fill: #fff}ABCDEFG12345678产品E2BDaytonaModal Sandboxescontainer-use (Dagger)BrowserbaseCloudflare SandboxWebContainer定位Code Interpreter SDK,企业级"AI Agent Cloud"持久化 Workspace + Sandbox(2025-02 从 Dev Env 转型)Serverless Python 平台子产品,GPU 强项本地 MCP Server,Git worktree + Docker浏览器沙箱(headless browser as a service)Workers Containers + Dynamic Workers 双层浏览器内 Node.js 运行时(Bolt.new 底座)隔离原语Firecracker microVM (KVM 硬件隔离)Docker container(可选 Kata/Sysbox 升级到 microVM)gVisor(用户态内核 Sentry)Docker container + Git worktree隔离云 VM + pre-warmed snapshot 每 30 min 刷新Container (GA) / V8 Isolate (Dynamic Worker beta)WASM + 浏览器 SecurityContext(无服务端)Cold Start (p50)78–200 ms27–90 ms(warm pool)1–5 s(CPU),含 cold本地启动,秒级5–10 s(首次 session)毫秒级(isolate)/亚秒(container)浏览器内瞬时启动计费精度$0.000014/vCPU/s$0.0504/vCPU·h (≈ $0.000014/s)$0.0000394/core/s免费(自托管)$0.10–0.12/h 超额$0.00002/vCPU·s + memory(2025-11 改 active CPU)免费 OSS / 商用按 seat文件持久化FS + 进程快照,最长 24h 会话FS snapshot + Sessions(背景进程)Memory snapshots(早期预览)Git branch 永续保存全部 state30 min idle 即销毁,需显式 snapshotDurable Object 维持,需挂 R2/S3 跨生命周期内存内 ephemeral FSEgress 控制无内置 allowlist网络仍在演进tunneling + granular egress 策略由 Docker 网络策略决定CDP over networkOutbound Workers 注入凭证,agent 不接触明文ServiceWorker 虚拟 TCP,origin/CSP 控制
隔离原语三档:Firecracker > Kata / gVisor > Container / V8 Isolate
代码块
Plain Text
逃逸难度 / 隔离强度
▲
Firecracker microVM │ ★★★★★ AWS Lambda 底座、E2B、Vercel Sandbox
(KVM + 独立 kernel) │ 需先击穿 Intel VT-x / AMD-V
│ ~5 MB/instance、~125ms 启动
│
Kata Containers │ ★★★★ Daytona "升级选项"
(microVM + OCI) │ OCI 兼容 microVM
│
gVisor │ ★★★ Modal Sandboxes 标配
(用户态 Sentry 内核) │ ~50k 行 Go、syscall 拦截
│ 只实现 ~70-80% Linux syscall
│
Docker container │ ★★ Daytona/container-use/Cloudflare 默认
(共享 host kernel) │ 延迟最低、安全最弱
│
V8 Isolate │ ★ Cloudflare Workers
(V8 sandbox) │ 毫秒级、跑不了 numpy(无原生 syscall)
表格加载中...
#OhNtdWypETJC text { white-space: pre; }#OhNtdWypETJC .fb0 { stroke: var(--N900-FG, 0.15); }#OhNtdWypETJC .fb0 {stroke: rgba(31,35,41, 0.15)}#OhNtdWypETJC .fx0 { stroke-miterlimit: 10; }#OhNtdWypETJC .fx0 {stroke-miterlimit: 10}#OhNtdWypETJC .fa1 { fill: rgb(187, 191, 196); }#OhNtdWypETJC .fa1 {fill: rgb(187, 191, 196)}#OhNtdWypETJC .fx1 { font: 400 12px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#OhNtdWypETJC .fx1 {font-style: normal}#OhNtdWypETJC .fx2 { text-anchor: middle; }#OhNtdWypETJC .fx2 {text-anchor: middle}#OhNtdWypETJC .fx3 { dominant-baseline: central; }#OhNtdWypETJC .fx3 {dominant-baseline: central}#OhNtdWypETJC .fx4 { stroke: none; }#OhNtdWypETJC .fx4 {stroke: none}#OhNtdWypETJC .fc0 { fill: var(--text-caption); }#OhNtdWypETJC .fc0 {fill: #646a73}#OhNtdWypETJC .fa2 { fill: var(--text-link-disabled); }#OhNtdWypETJC .fa2 {fill: rgb(187, 191, 196)}#OhNtdWypETJC .fx5 { font: 400 13px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#OhNtdWypETJC .fx5 {font-style: normal}#OhNtdWypETJC .fx6 { text-anchor: start; }#OhNtdWypETJC .fx6 {text-anchor: start}#OhNtdWypETJC .fx7 { dominant-baseline: alphabetic; }#OhNtdWypETJC .fx7 {dominant-baseline: alphabetic}#OhNtdWypETJC .fc1 { fill: rgb(0, 0, 0); }#OhNtdWypETJC .fc1 {fill: rgb(0, 0, 0)}#OhNtdWypETJC .fb1 { fill: var(--N900-FG, 0.15); }#OhNtdWypETJC .fb1 {fill: rgba(31,35,41, 0.15)}#OhNtdWypETJC .fb2 { fill: rgb(209, 217, 224); }#OhNtdWypETJC .fb2 {fill: rgb(209, 217, 224)}#OhNtdWypETJC .fa3 { fill: var(--bg-body); }#OhNtdWypETJC .fa3 {fill: #fff}ABCD123456技术FirecrackergVisorKata ContainersDocker containerV8 Isolate隔离机制KVM 硬件级 microVM,独立 Linux kernel,50k 行 Rust用户态 Sentry 拦截 syscall(Go 写)microVM + OCI 兼容共享 host kernel、namespace + cgroupV8 引擎沙箱启动125ms1-5s秒级<1sms关键约束需 KVM 支持;5MB/instance 内存开销兼容性 + 中等启动;只实现 ~70-80% Linux syscall(FUSE、io_uring 不支持)Daytona "升级选项"内核漏洞 = 多租户灾难只能跑 JS/WASM;跑不了 numpy 等需原生 syscall 的库
面试评判要点:候选人应能区分"软件隔离"(gVisor)与"硬件隔离"(Firecracker / Kata),并说出 Lambda 用 Firecracker 的原因(多租户 + 不信任代码 + 高密度)。AWS 用 Firecracker 的核心论据:
"We needed strong isolation for multi-tenant, untrusted code, with the density and start-up speed of containers."
Cold Start 与计费精度的 trade-off
代码块
Plain Text
延迟 (P50)
│
│ 5-10s ──────┐ Browserbase headless browser 首次拉起
│ │
│ 1-5s ──┐ │ Modal 标准、Vercel Sandbox
│ │ │
│ ~200ms ┤ │ Firecracker warm(E2B)
│ ~125ms ┤ │ Firecracker cold
│ 78ms ┤ │ E2B optimal
│ 27ms ┤ │ Daytona warm pool
│ ms ┤ │ Cloudflare V8 Isolate
└────────┴────┴──────────────────────────────►
适用场景
•
毫秒级(27–200 ms):Daytona warm pool / E2B Firecracker / Cloudflare V8 Isolate。代价是预热池占资源 / 功能受限。
•
优点:适合"长任务 + 多轮交互"的 Coding Agent
•
亚秒级(500 ms – 2 s):Modal 标准、Vercel Sandbox。
•
缺点:成本高、需要 GC 策略
•
秒级(5–10 s):Browserbase headless browser 首次拉起。
per-second 计费成为行业默认:E2B、Daytona、Modal、Cloudflare 全部按秒计费(per-execution 计费已被 sandbox 时代抛弃)。Cloudflare 在 2025-11-21 进一步把 Container 计费从"按 provisioned CPU"改成"按 active CPU"——agent 突发型负载因此降本数倍,是 2025-2026 最重要的计费变革。
网络 Egress:沙箱最容易出 CVE 的边界
2025-2026 真实事件链
CVE-2025-66479(Claude Code BashTool)
文件系统持久化的两种范式
代码块
Python
# 设计缺陷示意(伪代码复现)
def is_allowed_command(cmd: str, allowlist: list[str]) -> bool:
if not allowlist: # ⚠ 空 allowlist 直接 return True
return True
return any(cmd.startswith(p) for p in allowlist)
# 用户期望:空 allowlist = 禁止所有命令
# 实际行为:空 allowlist = 放行所有命令
# 结果:用户配置错误时全网暴露
范式 1:临时态 + 显式快照
•
代表:Browserbase(30 min idle 即销毁)、Modal(早期预览 memory snapshot)、Vercel Sandbox
•
优点:密度高、cold start 快
•
缺点:状态丢失风险,agent 自己把 artifact 推到对象存储
范式 2:持续态 / 长会话
•
代表:E2B 24h sessions、Daytona Running→Stopped→Archived→Deleted 四态 lifecycle、Cloudflare Sandbox 借 Durable Object 维持、container-use 直接落 Git branch 永续保存
SOCKS5 null-byte 注入(影响 Claude Code v2.0.24 – v2.1.89)
代码块
Python
# 设计缺陷示意(伪代码复现)
ALLOWED_DOMAINS = [".google.com", ".github.com"]
def check_host(hostname: str) -> bool:
return any(hostname.endswith(d) for d in ALLOWED_DOMAINS)
# 攻击 payload:
malicious = "attacker-host.com\x00.google.com"
# Policy 层(Python endsWith):
check_host(malicious) # True ✓ 因为字符串以 ".google.com" 结尾
# OS 层(DNS resolver / SOCKS5):
# 解析 hostname 时遇到 \x00 直接截断 → 实际连接 attacker-host.com
# Parser-differential 漏洞典型!
两个 CVE 的共同教训:单层 string-matching allowlist 永远会被 parser-differential 攻击绕过。
业界已收敛的最佳实践(OWASP / NVIDIA / Microsoft 共识)

egress 是沙箱最脆的边界:单层 allowlist 必被 parser-differential 绕过,要 default-deny 起步的五层纵深。
Anthropic Managed Agents 三层网络防御(实战范例)
Anthropic 在 Managed Agents 公开博客中拆解了内部三层网络防御:
代码块
Plain Text
Pluto Security 的逆向分析进一步证实:Anthropic Managed Agents 即使 agent 被 prompt injection 攻陷,agent 进程也永远拿不到明文 API token——proxy 层完成所有凭证替换。
多 Agent 并行的 Harness 设计
Coding Agent 平台希望支持"一个仓库同时跑 5 个 background agent 并行尝试 5 种重构方案,最后让人类挑一个 merge"。两种主流形态:
形态 1:远程沙箱 SDK 模式
代表:E2B / Modal / Daytona / Browserbase
代码块
Python
# E2B SDK 模式
from e2b import Sandbox
async def parallel_refactor_branches(task: str, n: int = 5):
sandboxes = await asyncio.gather(
*[Sandbox.create(template="python") for _ in range(n)]
)
results = await asyncio.gather(
•
优势:跨网络执行、弹性横向扩展、Firecracker 强隔离
•
劣势:成本(每 sandbox $0.05/h)、网络延迟、需出公司内网
形态 2:本地 MCP Server 模式
代表:container-use(Dagger)
代码块
Markdown
•
优势:zero-network-latency、不出公司内网、Git 永续审计(branch = worktree = container 三位一体)
•
劣势:不能弹性横向扩展、本地资源受限
Anthropic 演进路径的启发
Anthropic Managed Agents 的实际演进路径是行业典型范式:
代码块
Plain Text
v1: 单 container 全揽
┌──────────────────────────────────┐
│ harness + sandbox + tool │
│ 所有东西塞一个 container │
└──────────────────────────────────┘
这套抽象的工程价值:
•
本地开发用 container-use(零成本、便于审计)
•
CI 阶段用 E2B/Modal(云端 Firecracker,安全敏感)
•
同一 harness 代码,仅替换 provision() 实现
隔离 vs 成本 vs 性能:五维度选型表
选型决策树
代码块
Plain Text
你的场景是什么?
│
├── C 端 Code Interpreter(不信任用户代码)
│ → E2B / Vercel Sandbox(Firecracker,~125ms warm)
│ → 必须硬件隔离防多租户逃逸
常见误区 / 面试追问
误区:"只要用了 Docker 就安全了" — Docker 共享 host kernel,任何 kernel 漏洞都是多租户灾难。这就是 AWS Lambda 用 Firecracker microVM 而不是 Docker 的根本原因。多租户 + 不信任代码 = 必须硬件级隔离(Firecracker / Kata)。Docker 适合"自家代码、不同业务隔离"场景。
误区:"V8 Isolate 比 Firecracker 更安全" — V8 Isolate 启动是毫秒级、密度极高,但是只能跑 JS/WASM,跑不了 numpy/scipy/pandas(需要原生 syscall)。隔离强度也弱于 Firecracker。两者不是 substitute 关系——V8 适合纯计算/逻辑 worker,Firecracker 适合任意 Linux 工作负载。
误区:"Allowlist 一层就够防 egress 攻击了" — 完全错误。CVE-2025-66479(空 allowlist = 全放行)和 SOCKS5 null-byte(v2.0.24-v2.1.89)都证明单层 string-matching allowlist 永远会被 parser-differential 绕过。必须 default-deny + 三层独立防御(env / DNS / iptables)+ 拦 IMDS + 连接时验 IP + token broker。
追问:"如何避免 SOCKS5 null-byte 这种 parser-differential 漏洞?" —
追问:"为什么 Anthropic Managed Agents 的 token broker 模式重要?" —
◦
即使 prompt injection 攻陷 agent,agent 永远拿不到明文 API token
◦
Outbound Worker 在 egress 层注入凭证(agent 拿短期 JWT,proxy 替换为真实 token)
◦
这是"假设 agent 必然被攻陷"的零信任设计——比"努力让 agent 不被攻陷"更可靠
◦
Cloudflare Outbound Workers 是同款思路
追问:"Cloudflare 2025-11-21 active CPU 计费改变了什么?" —
◦
之前按 provisioned CPU(无论你是否在跑都计费)
◦
现在按 active CPU(只在真正消耗 CPU 时计费)
◦
对 Agent 影响巨大:Agent 是典型"突发型负载"——LLM 调用等待时 sandbox 完全 idle,按 provisioned 计费极不经济
◦
实测 agent 任务降本 3-5x,使 Cloudflare Sandbox 在"长会话 + 间歇活动"场景下成本优势明显
追问:"多 agent 并行用 E2B 还是 container-use?" —
◦
隔离敏感(C 端 / 多租户 / 未知代码):E2B(Firecracker 硬件隔离)
追问:"Sandbox 内的 LLM 输出如何防 prompt injection 二次注入?" —
◦
Sandbox 是"代码执行隔离",不解决 prompt injection
◦
Prompt injection 防御应在 harness 层(input filter / structured output / two-LLM pattern)
◦
但 sandbox 的 egress 防御能限制 prompt injection 的 blast radius——即使 LLM 被骗到执行恶意命令,token broker + allowlist 能阻断数据外泄
◦
详见 030(工具安全)与 081(最小权限沙箱)