Sandbox 与虚拟化:为 Agent 建立可恢复的行动环境

1. 第一性原理:模型不可信,执行环境必须可控

Coding Agent 会读取代码、执行命令、安装依赖和访问网络。即使模型没有恶意,错误推理也可能删除文件、泄露凭据或破坏宿主机。Sandbox 的目标不是让任务永远安全,而是把风险限制在明确的边界内,并让环境能够创建、暂停、恢复和销毁。

一个完整的任务环境通常拆为:Session、Harness、Sandbox、Workspace、Network Policy 和 Secret Broker。不要把“Sandbox”理解成一个孤立容器;真正要设计的是它与任务状态、权限和产物的一致性。

2. 容器、MicroVM 与虚拟化层次

容器共享宿主内核,启动快、密度高,但隔离边界依赖内核和配置;MicroVM 拥有更强的内核隔离,适合运行不完全可信的代码,但启动和资源成本更高;裸机隔离最强但调度和成本最重。

选择时先问威胁模型:代码是否来自用户、是否允许网络、是否能访问凭据、是否可能运行任意二进制、失败后是否需要恢复。不要因为“用了 MicroVM”就认为所有问题都解决了,镜像供应链、挂载目录、日志、网络和身份仍可能泄露。

3. Sandbox 生命周期

Create → Provision → Ready → Running → Idle
                         ↓        ↓
                     Failed ← Paused
                         ↓
                    Destroyed
  • Cold Start:从镜像创建并初始化依赖,成本高但状态干净。
  • Resume:从暂停环境恢复,速度快但必须验证镜像、代码、凭据和状态版本。
  • Snapshot:保存磁盘、内存或工作区状态;快照不能替代任务检查点。
  • Idle:任务暂时没有动作,释放 CPU/GPU 或暂停实例,但保留可恢复引用。
  • Destroy:销毁计算资源,同时处理临时文件、凭据和日志生命周期。

Sandbox 快照保存的是执行环境,Harness 检查点保存的是任务语义。恢复时两者必须匹配,否则可能出现“代码环境回去了,但任务状态已经继续”的错位。

4. 调度与多租户

调度器管理的不只是并发数,还包括启动队列、资源配额、优先级、租约、区域、镜像缓存和公平性。长任务如果无限占用实例,会挤压短任务;短任务如果总是抢占,又会让长任务无法完成。

可以按租户、任务优先级和资源类型设置配额,并记录排队时间、冷启动时间、运行时间、空闲时间、恢复成功率和资源利用率。租约用于检测 Worker 失联,续租必须幂等;租约过期后,任务进入恢复队列而不是直接丢失。

5. 文件系统与凭据

工作区挂载应尽量只读或最小范围可写。构建缓存、源码、输出产物和临时目录要分开,避免恢复时把临时文件误当成正式产物。敏感凭据不应写入镜像、环境快照或模型上下文,使用短期 Token 和 Secret Broker 按动作授权。

网络要采用默认拒绝、按域名或服务白名单放行,并区分读取和写入。所有网络访问都要进入审计轨迹,便于定位提示注入和数据外传。

6. 失败恢复

Sandbox 可能在冷启动、执行中、快照、恢复和销毁时失败。每个阶段都应有超时、重试和清理策略。恢复前先验证实例是否仍在运行、工作区版本是否匹配、外部副作用是否已提交,再决定 resume、重建或人工介入。

7. 学习者练习

设计一个运行测试的 Sandbox:禁止访问宿主文件,默认无网络,允许写入工作区临时目录;模拟冷启动、Idle、Resume、Snapshot 和 Worker 失联;最后检查恢复后是否能继续运行而不重复提交外部动作。