背景: 从Context Engineering 角度出发
在量子力学中,希尔伯特空间内的任何复杂量子态,本质上都是一组正交完备基矢的线性叠加
在过去我们总是以为,只要给LLM足够多的tools,则agent就更强大,但事实总是事与愿违,工具并非越多越好,过多的工具,会降低使用准确率和浪费宝贵的上下文,也就是 Context Rot; 于是乎,有了一个新的领域:Context Engineering。
根据业界领先的context Engineering的经验:
-
Cursor 的 “File-based Tools”: Cursor 采取了一种文档化方案,将工具的“说明书”全部文件化。当 Agent 需要使用某个能力时,它会先通过Retrieval找到对应的文档,阅读后生成代码
-
Manus 的 “Context Offloading”: 在 Manus 的设计中,采用了层级化的工具架构。为了应对复杂的长流程任务,Agent 不再试图把所有中间状态都记在 Context Window 里,而是利用文件系统进行 Context Offloading(上下文卸载)。文件系统成为了 Agent 的外挂memory(不同于compact的有损压缩,Offloading是无损的)
-
Anthropic 的 “Programming tool-using” 和skills:由agent自身编写代码实现tool-call相比于直接的tool-call能够节约大量context;同时agent skills本质上也是利用了file-system,对宝贵的context 进行节约的设计
显而易见,代码执行环境 (Code Execution) 和 可读写的文件系统 (File System) 已经超越了辅助工具的范畴,成为 Agent 组件中必要且不可或缺的部分。
しかし赋予 Agent “写代码”和“改文件”的能力,等同于赋予了它巨大的破坏力。
与传统软件确定的执行路径不同,Agent 的行为是基于概率和上下文动态生成的
意味着:
-
Prompt Injection
-
Agent 的幻觉导致死循环或资源耗尽
因此,通过为 Agent 划定严格的 安全边界(Sandbox)——如网络隔离、文件系统隔离、进程隔离,便显得尤为重要。
此外与 Claude Code 这样跑在开发者本地电脑上的 Coding Agent 不同,开发者通常拥有把控风险的能力(虽然在 “YOLO 模式” 下误删文件的事故屡见不鲜);对于部署在云端的 Agent 服务,这两者存在着信任边界的差异,用户不希望为 Agent 的每一次执行 点击“批准”,只要 Agent 在sandbox内折腾,它就是安全的;
技术实现比较
| 技术方案 | 核心原理 | 隔离强度 | 典型适用场景 | |
|---|---|---|---|---|
| Local Runtime | OS 原语 (bubblewrap) | 低 | 本地开发、CLI 工具 | |
| WASM | 字节码沙箱 | 中 | 简单的纯计算任务 | |
| Docker (Standard) | 进程级 (Cgroups/NS) | 中 | 通用任务,需深度加固 | |
| gVisor | 内核模拟 (Sentry) | 高 | 多租户、不可信代码执行 | |
| MicroVM (Firecracker) | 硬件虚拟化 (KVM) | 极高 | 公有云、高密度 Agent 托管 |
从技术实现角度,现阶段的Sandbox有以下几种实现方式
Local Sandbox-runtime
其原理利用 Linux 的 namespaces 和 cgroups 或 macOS 的 sandbox-exec 等操作系统原语直接限制进程权限, 如限制对配置路径的读/写访问,通过内置代理路由网络流量。
-
优点:极轻量,无镜像拉取开销,适合用户的本地开发环境。
-
缺点:依赖宿主内核,如果内核存在漏洞,恶意代码可能逃逸。
如 Claude Code 中 执行 /sandbox
可在 .claude/settings.json 中配置对应的权限:
{
"sandbox": {
"enabled": true,
"autoAllowBashIfSandboxed": true,
"excludedCommands": ["git", "docker"],
"network": {
"allowUnixSockets": ["/var/run/docker.sock"],
"allowLocalBinding": true
}
}
}
本质上,Claude Code 的 sandbox runtime 是一个 OS 级别的“受限 Bash 运行环境”。
对 Claude code 发出的 bash 命令及其所有子进程统一施加:
-
文件系统隔离(只允许访问/写入你事先配置的目录);
-
网络隔离(只允许访问你事先配置的域名/IP,通常通过本地 proxy/过滤实现)
好消息是,Anthropic 将这个sandbox开源了,通过:
npx @anthropic-ai/sandbox-runtime <command-to-sandbox>使用,不只只能给CC使用的,也可用于自己的agent项目中,通过MCP的方式配置使用。
具体可见:anthropic-experimental/sandbox-runtime
不过,macOS 的 sandbox-exec 基本上处于废弃状态,建议谨慎使用。
WebAssembly (WASM)
WASM 最初是为浏览器设计的,天生具有沙箱属性。
WASM 将代码编译成通用的二进制格式(.wasm)。Runtime 会像显微镜一样检查每一条指令,确保它只能访问分配给它的那块内存数组。越界访问会被立即掐断。
WASM 的冷启动时间极快, 成本低,适合执行简单逻辑的场景。
但其生态兼容性是最大痛点。虽然 Python 可以编译为 WASM (Pyodide),但许多依赖 C 扩展的库(如 Pandas, NumPy, Scipy 的某些部分)支持尚不完善,且网络栈受限
Docker
默认的 Docker 是不安全的,在标准 Docker 中,容器只是宿主机上的一个进程。
存在容器逃逸的问题: Linux 内核由数千万行代码组成,不可避免地存在 Bug(漏洞)。如果 Agent 发送了一个精心构造的“恶意系统调用”触发了内核漏洞(Kernel Panic 或 提权漏洞),它就能瞬间逃出容器,直接控制整台宿主机。
因此必须进行安全加固。
docker run \
--cap-drop ALL \
--security-opt no-new-privileges \
--security-opt seccomp=/path/to/seccomp-profile.json \
--read-only \
--tmpfs /tmp:rw,noexec,nosuid,size=100m \
--tmpfs /home/agent:rw,noexec,nosuid,size=500m \
--network none \
--memory 2g \
--cpus 2 \
--pids-limit 100 \
--user 1000:1000 \
-v /path/to/code:/workspace:ro \
-v /var/run/proxy.sock:/var/run/proxy.sock:ro \
agent-image
关键配置包括移除 Linux capabilities、只读文件系统、禁用网络接口等
| 选项 | 目的 |
|---|---|
--cap-drop ALL |
删除 Linux 功能,如 NET_ADMIN 和 SYS_ADMIN,这些功能可能导致权限提升 |
--security-opt no-new-privileges |
防止进程通过 setuid 二进制文件获得权限 |
--security-opt seccomp=... |
限制可用的系统调用;Docker 的默认值阻止约 44 个,自定义配置文件可以阻止更多 |
--read-only |
使容器的根文件系统不可变,防止代理持久化更改 |
--tmpfs /tmp:... |
提供一个可写的临时目录,在容器停止时清除 |
--network none |
删除所有网络接口;代理通过下面挂载的 Unix 套接字进行通信 |
--memory 2g |
将内存使用限制为 2GB 以防止资源耗尽 |
--pids-limit 100 |
限制进程数以防止 fork 炸弹 |
--user 1000:1000 |
以非 root 用户身份运行 |
-v ...:/workspace:ro |
以只读方式挂载代码,以便代理可以分析但不能修改。避免挂载敏感的主机目录,如 ~/.ssh、~/.aws 或 ~/.config |
-v .../proxy.sock:... |
挂载连接到在容器外运行的代理的 Unix 套接字 |
--userns-remap |
将容器 root 映射到非特权主机用户;需要守护程序配置,但限制容器逃逸造成的损害 |
--ipc private |
隔离进程间通信以防止跨容器攻击 |
(from Claude: Securely deploying AI agents)
gVisor
标准docker容器共享主机内核,这意味着内核漏洞可能允许容器逃逸。
gVisor 通过在用户空间中拦截系统调用来解决这个问题,然后才到达主机内核,实现自己的兼容性层来处理大多数系统调用,而无需涉及真实内核。
简单来说,使用 gVisor,攻击面要小得多,恶意代码首先需要利用 gVisor 的用户空间实现,并且对真实内核的访问有限。不信任容器内的进程,不让它们直接接触真内核。
流程对比:
-
Docker: Agent -> Syscall -> 宿主机真内核
-
gVisor: Agent -> Syscall -> Sentry (伪内核) -> (检查并过滤) -> 必要的 Syscall -> 宿主机真内核
要将 gVisor 与 Docker 一起使用,安装 runsc 运行时并配置守护程序:
// /etc/docker/daemon.json
{
"runtimes": {
"runsc": {
"path": "/usr/local/bin/runsc"
}
}
}
运行容器:
docker run --runtime=runsc agent-image
| 工作负载 | 开销 |
|---|---|
| CPU 密集型计算 | ~0%(无系统调用拦截) |
| 简单系统调用 | ~2 倍慢 |
| 文件 I/O 密集型 | 对于繁重的打开/关闭模式,最多慢 10-200 倍 |
计算密集型任务(如矩阵运算)几乎无损耗,但系统调用密集型任务(如大量小文件读写、网络请求)损耗显著, 对于多租户环境或处理不受信任的内容时,额外的隔离通常值得开销。
MicroVM
MicroVM 其的核心逻辑,是为了解决 Docker 无法解决的根本性矛盾:既要像容器一样快,又要像物理机一样安全。
AWS 在 2018 年开源了 Firecracker,专为 Serverless 和多租户容器设计: 砍掉了传统虚拟机(如 QEMU)中 90% 对 Agent 无用的功能,只保留了 CPU、内存、网络和最基础的块设备, 因而带来了惊人的性能,约 125 毫秒的冷启动时间,内存开销不到 5 MiB。
因此成为了目前公有云Sandbox 服务商,如E2B、Modal的底层标准技术。
除了Firecracker以外:
-
QEMU (Traditional VM):功能更强但启动慢、内存占用高
-
Kata Containers:对外暴露 Docker/K8s 的操作接口,但对内它会启动一个轻量级虚拟机(支持调用 QEMU 或 Firecracker)来包裹容器
如何选择: 分类维度
从工程落地角度,可以在以下几个维度做出权衡。
自托管 (Self-hosting) vs 云服务 (Managed Provider)
并非所有企业的数据隐私要求都能够接受云托管的sandbox。拥有成熟运维团队的前提下,基于 Hardened Docker、gVisor 或 Kata Containers 自建集群都是不错的选择。
当然,云托管解决了Firecracker 极度复杂的网络配置和资源调度,也让开发者能够将精力放在开发和快速验证上,更何况如E2B之类的sandbox服务商,已是不少agent项目(Manus、Perplexity等)的底层技术的一环。
Long running vs High-frequency (Lifecycle, persistence)
现阶段的sandbox的最主要用途,还是 code Interpreter,如执行agent生成的代码、数据分析等。
对于大多数情况下,用完即焚,每次请求启动一个全新环境,任务结束立即销毁。同时通过预装环境的sandbox(常用数据分析库)也可节约响应时间。
在如Agent skills所需要file-system的场景下,持久化则显得很重要。像E2B也支持了一定时间内(30天内)的持久化:
from e2b_code_interpreter import Sandbox
sandbox = Sandbox.create() # Starts in Running state
# Pause the sandbox
sandbox.betaPause() # Running → Paused
# Resume the sandbox
sandbox.connect() # Running/Paused → Running
# Kill the sandbox (from any state)
sandbox.kill() # Running/Paused → Killed
Serving vs Agentic RL Rollout
不同业务场景下的并发密度和Isolation要求不同。
User-facing Serving: 核心关注点在多租户隔离和响应延迟;因而,Firecracker 或 gVisor成为首选,同时通过Warm Pool预热机制以最大程度降低冷启动延迟。
Training & Data Gen: 这时候考虑的是Throughput和Cost;需要 Agent 在 Sandbox 中并行执行数万次代码,以生成用于 RLVR算法的奖励数据(Rollout);此时docker已经足够(如 sandbox fusion)
Text-only vs GUI (Computer Use & Browser)
Text-only (Code Interpreter): 标准的 REPL 环境,仅涉及 stdin/stdout 和文件读写,基于轻量级 Linux 发行版和极低的资源消耗;
GUI / Computer Use (Browser-using): 需要VNC提供实时截屏于VLM,意味着更大的资源要求,和更复杂的数据传输;常见如[browserbase](https://www.browserbase.com/), steel-browser
主流 Sandbox 方案汇总
通用sandbox(云服务)
轻量级(开源)
Browser-using
结语
起初OpenAI Code Interpreter 的出现, 需要一个安全的 Sandbox 来执行它生成的 Python 代码,仅仅为了弥补数学计算和逻辑执行的短板。
随后, 随着 Context Engineering 的深入,Manus 和 Anthropic 的实践告诉我们,Sandbox 里的 File System 不再只是存临时文件的地方,它是 Agent 的memory,于是Sandbox 变成了 Agent Skills 和Memory 的载体。
那么未来?是 Agent Using Sandbox,还是 Agent Inside Sandbox?
参考
Beyond permission prompts: making Claude Code more secure and autonomous