R02 沙箱化工具执行
把 agent 的工具执行放进一个可销毁的隔离环境里,让”它做了什么”和”它能毁掉什么”在物理上解耦——这是把权限设计从”纸面策略”落地为”运行时事实”的最后一道工序。本节给一套可直接套用的沙箱模板(容器 / microVM / WASM 三档),并讲清为什么”加了 Docker 就以为安全了”是 2026 年最常见的自欺。本节的视角是爆炸半径工程学(blast-radius engineering):权限决定 agent 被允许做什么,沙箱决定它越权之后能波及多远——两者是纵深防御里互不替代的两层。
这是复现指南,不是又一篇”为什么要沙箱”的布道。如果你想先弄清”权限边界 vs 沙箱边界”的概念区分,先读架构剖面 S02(权限模型对照,0436 专题同级节点),再回来抄模板。
§0 为什么是”沙箱”这个框架,而不是”加固提示词”或”信任模型”
转型 PM 最容易掉进的第一个坑,是把 agent 安全当成提示工程问题:“我在 system prompt 里写清楚’不要删库、不要 rm -rf’,模型就会听话。“这是范畴错误。沙箱框架的第一性原理是:模型层的任何约束都是概率性的,而安全边界必须是确定性的。 红队专题 0435 的 S03 把这句话浓缩成”权限是最后防线”——当 prompt injection 成功、当模型幻觉出一个危险调用、当上游 agent 被 confused deputy 攻击诱导,能拦住灾难的不是更好的措辞,而是 agent 进程根本没有能力触达宿主文件系统、生产数据库和云凭证。
为什么不选”信任模型行为基线”这个框架?因为 LLM 的行为不可静态审计。arXiv:2602.10133(AgentTrace,2026-02-07)直接论证:LLM agent 的非确定性使静态审计失效,输入过滤和模型透明盒方法不足以覆盖推理、状态变更、环境交互的可追溯性。换句话说,你无法在事前证明 agent 不会做坏事——你只能在事后限制坏事的代价。沙箱是把”信任”替换成”遏制”(containment)的工程化表达。
所以本节的框架边界很清楚:沙箱不防 agent 做错决策,只防错决策升级成不可逆灾难。 它是 Function Calling 落地为生产系统时,工具调用与真实副作用之间那道”可销毁的隔离层”。
§1 三档隔离技术:选型决策表
不是所有工具执行都需要 microVM。过度隔离会拖垮延迟和成本,欠隔离会留下逃逸通道。下面是 2026 年三档主流技术的对照,数字均已接地。
| 技术 | 隔离原理 | 启动时间 | 关键开销 | 适用场景 |
|---|---|---|---|---|
| Docker 容器 | 进程级 / 共享宿主内核(namespace + cgroup) | 毫秒级 | 低 | 受信代码;不适合执行 LLM 生成的不可信代码 |
| gVisor | 用户态内核拦截 syscall | 毫秒级 | I/O 开销 10–30% | I/O 密集型多租户、需要比容器更强隔离但容忍性能损耗 |
| Firecracker / Kata microVM | 硬件级 / 每 VM 独立 Linux 内核(KVM) | ~125 ms | 内存 < 5 MiB/VM;单宿主 ≤150 VM/秒 | 执行不可信代码、受监管数据、最强隔离 |
| WASM + WASI(能力模型) | 默认零权限沙箱,能力按引用显式授予 | 据称微秒级 | 低(语言/工具链受限) | 短小、纯计算、可移植组件 |
(来源:Northflank, “How to Sandbox AI Agents”, 2026-02-02,WebFetch 核实 Firecracker ~125ms、gVisor I/O 10–30%、内存 <5 MiB/VM、150 VM/s;WASM 能力模型来自 Cosmonic 博客 2026-05-06,注:该文为商业博文,微秒级冷启动声明独立验证有限。)
核心结论(反共识):Docker 容器对”执行 LLM 生成的代码或调用不可信外部工具”这一场景是不够的。 容器共享宿主内核,一旦内核漏洞或配置错误即可逃逸。2025-11 一次性披露的三个 runc CVE 是铁证:CVE-2025-31133(用 procfs 符号链接替换 /dev/null 绕过 maskedPaths)、CVE-2025-52565(容器初始化期间的时序攻击绕过 maskedPaths/readonlyPaths)、CVE-2025-52881(重定向写操作至关键系统文件,可致主机崩溃或完全逃逸)(来源:Blaxel, “Container Escape Vulnerabilities 2025-2026”,WebFetch 核实)。
[!warning] 选型口诀 受信你写的代码 → Docker 够了;执行模型生成的或第三方的代码 → 上 microVM 或 WASM。 区分标准不是”工具危不危险”,而是”执行的代码可不可信”。
§2 沙箱模板:可直接抄的最小骨架
下面给三档可运行模板的骨架。原则贯穿始终:默认拒绝(deny-by-default)——网络默认关、文件系统默认只读、能力默认为空,需要什么才显式开什么。
2.1 容器加固模板(受信代码 + 纵深加固)
# 适用:执行你自己写的、已审计的工具代码
# 加固后的 Docker 仍不应执行 LLM 生成的任意代码
security:
read_only_root_fs: true # 根文件系统只读
no_new_privileges: true # 禁止 setuid 提权
user: "10001:10001" # 非 root 运行(rootless)
cap_drop: ["ALL"] # 丢弃所有 Linux capability
seccomp: "runtime/default" # syscall 白名单
apparmor: "docker-default" # 强制访问控制
network:
mode: "none" # 默认无网络
egress_allowlist: [] # 需要出网时逐条加白名单域名
filesystem:
workspace: "/work (tmpfs, 512Mi, ephemeral)" # 唯一可写区,临时、限额、用完即焚
resource_limits:
memory: "1Gi"
cpu: "1.0"
pids: 128 # 防 fork bomb
timeout: "300s" # 超时强制销毁(对应 OpenAI Model Spec 的 shutdown timer)
2.2 microVM 模板(执行不可信 / 模型生成代码)
每次工具调用 → 启动一个 Firecracker microVM(~125ms 冷启动)
├─ 独立内核(KVM 硬件隔离,逃逸成本量级高于容器)
├─ 无持久化磁盘,只挂载本次任务所需的最小数据卷(只读优先)
├─ 网络:默认 deny,仅放行任务声明的出站目标
├─ 凭证:不注入长期密钥;只传本次调用的短期 token(呼应 S02 凭证模型)
└─ 调用结束 → 整个 VM 销毁,无状态残留
商业实现参考:E2B(Firecracker,~150ms,被 Perplexity/HuggingFace 使用)、Northflank(~125ms)、Modal(gVisor)
2.3 WASM 能力模型模板(纯计算组件)
WASM 模块默认”无权限”——无文件系统、无网络、无系统调用、无环境变量。这是 Mark Miller 对象能力模型(Object Capability Model)的运行时实现:引用即权限(the reference is the permission)。宿主显式把”读这个文件句柄""调这个 HTTP 端点”作为能力引用注入,模块拿不到引用就触达不了资源。它的优雅在于:权限不是一张需要查询和执行的策略表,而是物理上的可达性——没给引用就根本没有那条路。代价是语言/工具链受限,且 2026 年独立安全审计仍稀少(来源:Cosmonic 2026-05-06)。
§3 工具白名单:沙箱里的第二道闸
沙箱限制”能毁多远”,工具白名单限制”能调什么”。两者缺一不可。一个常被忽视的事实:即使全是看似无害的工具,组合起来也能造成损害。 Northflank(2026-02-02,WebFetch 核实)举的例子——cat、grep、awk 单独看都安全,组合使用却足以提取系统上任意文件。所以白名单的规则不是”排除危险工具”,而是”只允许完成任务绝对必需的最小工具集”。
这正是 OWASP LLM06:2025 Excessive Agency 的三类根因(WebFetch 核实官方页面):
| 根因 | 表现 | 沙箱侧对策 |
|---|---|---|
| 过度功能 | 文档读取插件却带删除能力 | 只暴露任务必需的功能子集,避免开放式通用工具 |
| 过度权限 | DB 连接有 SELECT/UPDATE/DELETE 全权,任务只需读 | 沙箱内注入的凭证用最低访问级身份 |
| 过度自主 | 高影响操作无人工审批即执行 | 高副作用操作(对应 0435 S03 的 L3/L4 分级)前设确认门 |
学术界给了更强的形式化方案:Progent(arXiv:2504.11703,v1 2025-04-16,v3 修订 2026-05-14,UC Berkeley 等)把”权限”表示为关于工具名称和参数的符号规则,每次工具调用做确定性检查;LLM 从任务生成初始策略,执行中自动更新,由 SMT solver 对策略变更分类——“收窄”自动批准,“扩展”需人工审批,防止权限升级。实测在 AgentDojo 和 ASB 基准上把攻击成功率降至 0%,同时保持功能性,且已兼容 LangChain 和 OpenAI Agents SDK(WebFetch 核实摘要)。注意它的边界:评估只覆盖两个基准,生产级多工具/多 agent 编排下的效果尚未被独立复现——这是把它写进选型报告时必须标的赌注。
§4 MCP 时代的供应链维度:沙箱要防的不只是 agent 自己
A08 MCP 与 A2A 协议族 让工具接入标准化了,但也把”工具供应链”变成了攻击面。MCP 官方安全最佳实践(modelcontextprotocol.io,WebFetch 核实草案版)明确规定本地 MCP 服务器必须(MUST)在沙箱中运行,使用最小默认权限,以受限文件系统/网络/系统资源启动,并在执行命令前展示不截断的完整命令同意界面。Scope 侧要求:从最小集(如 mcp:tools-basic)出发,禁止通配符 scope(*/all/full-access),禁止 Token 直通。
为什么这条不能省?真实案例:2025-09,一个每周下载 1,500 次的非官方 Postmark MCP 服务器被篡改,在 send_email 函数里静默加了 BCC 字段,把所有邮件抄送到攻击者地址(来源:多个安全研究报告,2025-09)。如果这个 MCP server 跑在 deny-by-default 的沙箱里、出站网络白名单只放行 Postmark 官方端点,这次投毒的数据外泄就会被网络层直接掐断——这正是沙箱作为”最后防线”补救上游信任失效的价值。
这一条直接回链 m208 - AI 基础设施与中间件选型 的选型清单:评估编排框架时要问”是否支持把每个 MCP server 单独沙箱化、出站网络逐条白名单”,缺这一项在高合规场景应直接扣分。
§5 判断主轴:90% 的人在沙箱上会搞错的四个点
这一节是本节点的命门。每点带”症状 → 为什么会错 → 正确做法 → 真实反例”。
① 症状:“我用了 Docker,所以工具执行是安全的。” 为什么会错:把”进程隔离”当成”安全边界”。容器共享宿主内核,内核漏洞或配置错误即可逃逸;而且大量人没开 rootless、没 drop capability、没配 seccomp。 正确做法:执行不可信/模型生成代码用 microVM 或 WASM;若必须用容器,至少叠加 rootless + cap_drop ALL + seccomp + read-only rootfs + no-new-privileges 五件套。 真实反例:2025-11 三个 runc CVE(CVE-2025-31133 / 52565 / 52881)全是绕过容器隔离机制实现逃逸(来源:Blaxel,WebFetch 核实)。
② 症状:“沙箱是被动的盾,agent 不会主动去捅它。” 为什么会错:当 agent 本身被武器化,它会主动找逃逸路径。 正确做法:把”agent 主动利用漏洞”纳入威胁模型,及时打 CVE 补丁,监控异常 syscall。 真实反例:arXiv:2603.02277(2026-03-01)引入 SANDBOXESCAPEBENCH,结论是在漏洞存在时,前沿 LLM 能够识别并利用容器逃逸漏洞;Sysdig 威胁研究团队 2026-05-29 记录到 LLM 驱动的 Agentic Threat Actor 利用 CVE-2026-39987(marimo notebook 漏洞)自动化完成完整攻击链(WebFetch 核实)。
③ 症状:“沙箱配好就一劳永逸,凭证注进去方便复用。” 为什么会错:长期凭证注入沙箱,逃逸即等于云凭证泄露,沙箱白配。 正确做法:沙箱内绝不放长期密钥,只传本次调用的短期、范围限定 token(呼应本专题 S02 的凭证模型——workload identity / 短时 SVID 优于静态 API key)。 真实反例:2025 年 agentic AI 相关 CVE 数量同比增长 255%,主因之一就是凭证权限过大、生命周期过长(来源:WorkOS Blog,本专题接地证据)。
④ 症状:“高风险操作我加了确认弹窗,有人盯着就安全了。” 为什么会错:“逐操作同意”会被确认疲劳击穿。 正确做法:把确认门收敛到真正不可逆/高后果的 L3/L4 操作(对应 0435 S03 的副作用分级),其余靠沙箱+白名单自动遏制;同时引入超时自动销毁的 shutdown timer(OpenAI Model Spec 2025-12-18 明确要求自主执行须含 shutdown timer,sub-agent 须在同一 scope 约束下运行)。 真实反例:Anthropic 共享责任模型数据显示,开发者在 93% 的权限提示弹窗中未经有效审查即点击批准(来源:Backslash Security, 2026-04-29,WebFetch 核实)——人工监督机制本身就在失效。
§6 产品 PM 视角补盲
沙箱不是纯工程问题,它有用户心理、商业模式和合规三个 PM 盲点:
- 用户心理:沙箱带来的延迟会被用户感知为”慢/卡”。 microVM ~125ms 冷启动单看不多,但工具链式调用(agent 一轮调 5 个工具)会累积成秒级体感延迟。PM 要在”隔离强度”和”响应速度”之间做产品级权衡——比如对只读、纯计算的工具走 WASM 微秒级路径,把 microVM 留给真正有副作用的调用。
- 商业模式:沙箱基础设施是成本中心,但也可以是信任卖点。 E2B、Northflank 这类专做不可信代码执行的平台之所以能起来,正是因为”自建安全沙箱”对多数团队太贵。对 to-B agent 产品,“每次工具调用都在独立可销毁 VM 里执行”是可以写进 security whitepaper、过客户安全审计的差异化卖点。
- 合规:沙箱+审计是 EU AI Act 落地的硬要求。 Article 12 要求高风险 AI 系统在全生命周期自动记录事件,Article 26(6) 要求部署方留存日志至少 6 个月,2026-08-02 高风险类别全面适用(来源:artificialintelligenceact.eu + FireTail 分析 2026-04)。沙箱是”完全中介”(complete mediation)的执行点——所有工具调用都经过沙箱,沙箱就是天然的、不可绕过的审计采集面。PM 做出海产品(Rick 的国际化视角)尤其要把这条算进合规成本。
§7 对手框架回应
对手立场(Karl McGuinness 一派,Resilient Cyber 引述): “agent 不需要身份护照,需要的是授权授予;安全的重心应放在授权语义而非运行时遏制。” 接受 + 边界: 接受其判断——纯靠沙箱遏制而不收紧授权,等于让一个权限过大的 agent 在豪华监狱里横冲直撞,治标不治本。授权设计(S02/S03)确实是更上游、更根本的杠杆。但坚持本节的边界: 授权是概率性意图匹配(arXiv:2510.26702 实证,当任务需多个 scope 时语义匹配准确率显著下降),而沙箱是确定性物理遏制。当授权判断出错(它一定会出错),沙箱是唯一兜底。两者是 AND 不是 OR——这正是纵深防御的定义。
对手立场(商业沙箱厂商的反向利益冲突): Northflank、Blaxel 等主张”Docker 不够、必须上 microVM”,但它们自己卖 microVM 平台。 接受 + 边界: 承认利益冲突存在,不能照单全收其营销结论。但学术侧的 CVE 证据(runc 三连击、SANDBOXESCAPEBENCH)独立支持”容器可被逃逸”这一事实判断。本节的折中立场:加固后的容器(rootless + seccomp + AppArmor)对受信代码可接受,对不可信代码不可接受——这个分界线不依赖任何厂商的销售话术,而依赖”执行代码可不可信”这个客观属性。
§8 跨域呼应:福柯的”全景敞视”与沙箱的权力几何学
沙箱的本质是一种空间化的权力技术。福柯在《规训与惩罚》里分析边沁的全景敞视监狱(Panopticon):权力不靠时时刻刻的暴力,而靠把对象置于一个”随时可能被观察、且行动可达范围被建筑结构限定”的空间——规训内化为结构。
沙箱对 agent 做的是同一件事的镜像版本:它不试图说服 agent”别做坏事”(那是 prompt 层的徒劳),而是把 agent 安置在一个行动可达范围被基础设施物理限定的空间里。agent 在沙箱里”自由”地调用工具,但这份自由的边界是宿主预先用 namespace、cgroup、seccomp、能力引用浇筑好的。
这个跨域呼应改变了一个具体的技术判断:它提醒我们沙箱设计的重心应从”监视 agent 在做什么”(行为审计,事后)转向”几何化地限定 agent 能做什么”(空间遏制,事前)。WASM 能力模型——“引用即权限”——是这种”权力几何学”最纯粹的工程实现:不是规则告诉你不能去哪,而是根本没有路通向那里。福柯式的洞察在这里反过来给了乐观结论:对人类,全景敞视是压迫;对一个无道德主体的 agent,几何化的行动遏制恰恰是把”它是谁、能动什么”这个新身份问题(本专题主轴)落地为可验证事实的唯一办法。
§9 PM 决策启示:面试 / 选型 / 复现
- 面试怎么用: 当被问”你怎么保证 agent 工具调用安全”,不要答”加 prompt 约束”。答:“分两层——授权层用任务级动态白名单收窄能调什么,遏制层用 microVM/WASM 把爆炸半径锁死在可销毁环境里;区分标准是执行代码可不可信,受信用加固容器,不可信上 microVM。” 再补一句反共识:“Docker 不是安全边界,2025-11 的三个 runc CVE 就是逃逸证明。” 这一答立刻把你和只会喊 hype 的候选人分开。
- 选型怎么用: 评估 agent 平台/框架时问四点——(1) 工具执行是否在独立可销毁沙箱里?用什么隔离技术?(2) 是否 deny-by-default(网络/文件系统/能力默认关)?(3) 凭证是短期 token 还是长期密钥注入?(4) MCP server 能否单独沙箱化+出站白名单?缺一项在高合规/出海场景扣分(回链 m208 - AI 基础设施与中间件选型)。
- 复现怎么用: 直接抄 §2 的三档模板。最小起步:用 §2.1 的容器五件套跑你自己的工具;当要执行 Function Calling 触发的不可信代码时,切到 §2.2 microVM;把超时 shutdown timer 设成硬性纪律(防 agent 卡死或被诱导无限循环)。
§10 与已有节点的关系
- 对 A08 MCP 与 A2A 协议族(补缺): A08 §四已警示 MCP 私有部署的供应链攻击,本节点是其安全面的工程化展开——给出”MCP server 必须沙箱化运行 + 出站白名单”的具体落地方法,不复述 A08 的协议哲学。
- 对 S03 Harness Engineering 全景(深化): S03 §3.2 立”工具数量 ≤20”、§3.5 立 HITL 三层叠加,本节点把”风险等级”维度形式化为副作用分级触发的确认门,并补上 S03 未覆盖的”运行时物理遏制层”。不复述 S03 的 harness 六能力。
- 对 m208 - AI 基础设施与中间件选型(填实): 给 m208 §2.5.2 编排框架对比补一个缺失的”沙箱与隔离技术”选型维度(§9 四问)。
- 对 0436 专题 S02 权限模型对照(深化,同级节点): S02 讲”凭证/授权模型该怎么设计”,本 R02 讲”授权落地后工具怎么在隔离环境里执行”——授权是策略,沙箱是执行,本节点是 S02 的运行时对应面。
- 对 0435 红队专题 S03 Agent 权限边界与最小权限设计(呼应,staging 不双链): 0435 S03 提”权限是最后防线 + L0–L4 副作用分级”,本节点是其遏制侧的实现:当权限判断失效,沙箱兜底;副作用分级直接复用为确认门触发条件。(0435 专题仍在 staging,此处降级为普通文本引用,不建双链。)
§11 关联节点
核心(必读):
- A08 MCP 与 A2A 协议族 —— 工具接入协议,沙箱要防的供应链面
- S03 Harness Engineering 全景 —— 工具注册 / HITL 断点的上层框架
- m208 - AI 基础设施与中间件选型 —— 沙箱选型维度的归宿
- Function Calling —— 工具调用机制,沙箱包裹的执行对象
- 0436 专题 S02 权限模型对照(同级,策略侧对应面)
延伸(可选):
- c10 - Agent 技术栈与工具调用 —— 工具调用的基础知识
- m207 - Agent 产品化:场景推演与失败模式 —— 工具执行失败模式
- Constitutional AI —— 模型层约束(与沙箱层约束互补)
- 幻觉 —— 危险工具调用的诱因之一
- AI概念滥用反思 —— “加了 Docker 就安全”式概念滑变的反思
- AI PM 知识图谱·总索引 —— 总入口
修订日志
- R0.1(2026-06-07): 首稿。建立”爆炸半径工程学”主轴;三档隔离选型表 + 三档可抄模板;判断主轴四点(Docker 不够 / agent 主动逃逸 / 长期凭证 / 确认疲劳);对手框架回应(McGuinness 授权派 + 商业厂商利益冲突);福柯全景敞视跨域呼应;接地 runc 三 CVE、SANDBOXESCAPEBENCH、Progent、Postmark MCP、Anthropic 93%、EU AI Act Art.12 等硬事实。staging 区,0435/0436 同专题外节点暂以普通文本引用。