学习笔记 · Obsidian
Sandboxes:隔离执行与生命周期
能力地图
/sandboxes 与 /sandboxes/index 当前同正文,定义“让 agent-generated code 在隔离环境执行”的 provider 抽象。索引还列 Daytona、Modal、AgentCore、Runloop、Vercel、E2B、Baponi、OpenShell、Islo、UpstashBox、Leap0、Superserve 与 LangSmith;本站只有四个 provider 深链页。
| 路由 | 安装/创建 | 生命周期责任 |
|---|---|---|
aws | langchain-agentcore-codeinterpreter;CodeInterpreter.start() 后包装为 AgentCoreSandbox | 必须 interpreter.stop(),示例用 try/finally。隔离单元是 AgentCore MicroVM。 |
daytona | langchain-daytona;Daytona SDK 创建后包装 | 调用方通过 Daytona SDK stop/destroy。 |
langsmith | langsmith[sandbox] + deepagents;SandboxClient.create_sandbox() | sandbox 持续占资源,必须 delete_sandbox();示例明确用 try/finally,也可在 UI 管理。 |
modal | langchain-modal;modal.Sandbox.create(app=...) 后包装 | 调用方负责 terminate。 |
四个 backend 都可交给 create_deep_agent(backend=...),示例也可直接 backend.execute()。这些页面主要是同步调用示例,没有宣称所有 provider 的创建、执行、文件和销毁具有同一 async/streaming 语义。
隔离不等于安全完成
沙箱仍需显式控制:
- 基础镜像/依赖 allowlist、CPU/GPU/内存/磁盘/PID、wall-clock 和空闲超时;
- 默认拒绝网络,只放行任务所需域名;防止 metadata endpoint、内网、控制面和任意代理访问;
- 不把宿主/生产 secret 注入执行环境;需要的临时凭证应短期、最小 scope、可撤销;
- 输入文件扫描、路径规范化、大小/数量限制;输出 artifact 做 MIME/大小/恶意内容检查;
- 每用户/租户独立 sandbox,禁止复用未清理的 cookie、文件、进程或 package state;
- 创建、命令、网络、artifact、销毁和费用可审计,但 stdout/stderr 先脱敏。
可靠生命周期
建议状态机为 requested → created → ready → running → terminating → terminated,另有 failed/expired/orphaned。创建和销毁使用 provider resource ID 做幂等;请求结束的 finally 之外还要有定时 reaper,对进程崩溃遗留资源补偿删除。监控 active sandbox、age、orphan、create latency、termination failure、资源/费用和拒绝事件。
持久 snapshot、service URL、auth proxy 或浏览器 profile 会改变威胁模型;启用前单独审计数据保留、共享范围和回收策略。不要把“provider managed”理解为无需做租户隔离或删除验证。
验证边界
已精读 6 个官方 Markdown 路由并核对安装、创建和 cleanup 责任。没有实际启动沙箱,也未验证网络隔离、镜像供应链、配额、销毁时延和数据擦除保证。