Agent 架构Agent 架构代码执行沙箱安全速答 · 约 6 分钟更新 2026-09-28

让 Agent 自己跑代码,沙箱要怎么设计?

一句话结论

核心是把模型生成的代码当成不可信输入,放进无默认网络、最小文件权限、严格资源限额且用完即弃的隔离环境,再受控回传结果。

先这样答

模型生成的代码必须按不可信代码处理,不能直接在宿主机执行,否则等于把任意代码执行权交给模型。设计时先根据风险选隔离层级,再收紧网络、文件系统和资源权限,最后规定结果回传方式,并让每次任务使用独立、用完即弃的环境。

隔离从弱到强可以是同机进程限制、容器、gVisor 一类的沙箱运行时,以及 Firecracker 一类的微虚拟机。进程和容器启动快,但仍共享较多宿主机内核能力;沙箱运行时和微虚拟机隔离更强,代价是启动延迟和运维复杂度更高。环境默认不联网,需要外部访问时只放行白名单域名。文件系统只读挂载必要依赖,另给临时工作目录,不暴露宿主机凭证和敏感路径。同时限制 CPU、内存、执行时间、进程数和输出大小,超限就终止任务。

执行结束后只回传受控的 stdout、stderr、退出状态和允许导出的产物文件,再销毁整个环境。面试时可以收束为:先把代码当攻击输入,再按业务风险在启动速度和隔离强度之间选运行时,其余权限一律默认关闭。

面试官会怎么追问

  • 「容器隔离还不够吗?」 容器适合低风险、短任务,因为启动快、成本低,但它和宿主机共享内核,内核漏洞或错误配置会扩大影响。涉及陌生依赖、用户数据或高权限工具时,我会考虑 gVisor 或微虚拟机,并配合内核加固和权限裁剪。
  • 「代码必须联网下载依赖怎么办?」 不直接开放公网,而是优先使用预构建镜像、内部依赖缓存或代理服务。确实需要外部访问时,只放行指定域名和协议,记录请求,并限制下载大小,防止数据外传和恶意载荷进入。
  • 「执行结果怎么安全地交回 Agent?」 标准输出和错误输出要截断并标记执行状态,不能无限写入。产物文件只从指定目录读取,还要检查路径、类型和大小,避免目录穿越、符号链接绕过,以及把可执行文件直接带回宿主环境。

回答的坑

  • 只说「用 Docker 就安全了」是把容器当成安全边界,正确方向是根据威胁模型选择进程、容器、沙箱运行时或微虚拟机,并继续限制权限。
  • 只关注代码能否运行,不提网络、文件、资源和结果回传,会漏掉主要攻击面,正确方向是坚持默认拒绝、最小权限和一次性环境。
—— 本题完 ——