博客
可靠性与生产环境

发布于 更新于

Anshu 和 Shouryamaan

AI Agent 沙箱:安全执行代码实用指南

以 Markdown 阅读

AI agent 沙箱是指在边界明确的环境中执行不受信任或由模型生成的代码,并明确控制文件系统、进程、网络、凭据、资源、生命周期、产物和清理。仅仅使用名为“容器”的产品,并不能证明这些属性存在。

先确定代码必须访问什么,再拒绝其他一切。如果任务只需要调用类型明确的 API,就应移除代码执行,而不是为它增加沙箱。

先编写威胁模型

假设生成的代码可能:

  • 读取每个挂载文件和环境变量;
  • 扫描内部网络和公网;
  • 联系命令服务器或外传输出;
  • fork 进程、填满磁盘、占用内存或无限输出;
  • 通过修改文件、软件包、缓存或计划任务长期驻留;
  • 检查云 metadata 或本地运行时 socket;
  • 访问其他租户的产物或凭据。

提示词指令无法降低这些风险。即使代码故意尝试逃逸,运行时也必须强制执行边界。

隔离文件系统与进程树

为每次执行创建临时工作区。只挂载必要输入,并尽可能设为只读。不要挂载宿主仓库、容器 socket、home 目录、云配置、SSH 密钥或共享软件包缓存。

以非特权用户运行,移除 capability,在支持时限制系统调用,并限制进程数量。终止顶层命令时必须同时终止子进程。墙上时间超时后仍有后台进程存活,说明清理并不完整。

通过范围严格受限的服务导出已批准产物。校验路径和文件类型、设置大小限制,并在销毁工作区前复制输出。

默认禁止网络访问

许多代码任务不需要网络。确实需要时,通过允许列表或经过身份验证的代理路由出站流量。控制 DNS 和 IP 访问,包括私有地址、loopback、link-local 地址和云 metadata 端点。

允许列表中的域名也可能重定向或解析到意外地址,因此应在建立连接时校验。不要让生成的代码直接访问内部服务发现机制。

如果任务需要访问 Web,带有策略和会话隔离的浏览器工具可能比不受限制的 socket 更安全。下载文件和页面指令均应视为不受信任的数据。

注入范围小且短期有效的凭据

不要继承应用服务器环境。为确切资源和操作签发任务范围凭据,并在执行后撤销或等待其过期。管理、计费和资源配置凭据必须留在沙箱外。

应假定放入沙箱的任何凭据都能被代码读取。“隐藏”的环境变量对进程仍然可见。真正要判断的是:凭据在自身范围和有效期内泄露是否可以接受。

Agent 安全指南介绍了下游授权和审计要求。

限制所有资源与输出渠道

限制 CPU、内存、磁盘、进程、文件、网络、stdout、stderr 和墙上时间。限制软件包安装和依赖来源。反复违反策略时停止运行或隔离任务。

向模型返回结构化摘要或长度受限的日志。即使运行时本身保持隔离,无限终端输出仍会消耗内存、token 和可观测性存储。

根据工作负载选择隔离深度

可信应用代码可以使用进程内函数或后台 worker。需要隔离软件包的代码可以使用受限容器。不受信任的生成代码需要强化沙箱,而需要更强内核边界或特权系统访问的工作负载可能需要专用 VM。

计算资源升级阶梯按照代码可信度、网络、生命周期、状态和延迟映射这些层级。Cloudflare 的 Project Think提供了类似的分层方案;其中产品层级只是示例,并非通用边界。

让清理过程可观察且具备幂等性

记录执行 ID、租户、镜像或运行时版本、策略、凭据引用、时间戳、资源用量、产物引用、退出类别和清理结果。成功、失败、超时、取消或 worker 崩溃后都应执行清理。

使用 reconciler 查找因进程故障而残留的过期环境。撤销凭据和删除环境必须能够安全重复执行。

在不危及生产的情况下测试边界

在专用测试环境中尝试读取禁止挂载、列出环境变量、访问公网和私有目标、读取 metadata、创建过多进程、填满输出、在终止后继续存活,以及获取其他租户的产物。验证每次尝试都被拒绝并留下记录,同时不暴露敏感值。

也要测试允许路径。限制过严会导致真实任务全部失败,迫使团队添加宽泛例外。每项例外都应具体、经过审核,并关联到确实需要它的工作负载。

下方的提示词会在不运行攻击代码的情况下审计现有边界,区分提供商保证和当前仓库配置。这往往正是沙箱检查发现缺口的地方。