编码Agent沙箱:如何安全运行Agent生成的代码

编码Agent沙箱:如何安全运行Agent生成的代码

编码Agent沙箱让Agent生成的命令和代码变更在受限的工作区中运行,在该工作区内,文件、进程、网络访问、密钥、日志以及审查制品均可被控制。实际目标并非假装任意生成的代码是无害的。目标是将Agent视为一个拥有一次性开发机器、明确边界、可观察执行过程以及投产前需经人工审批路径的不可信贡献者。

编码Agent沙箱需要隔离的内容

一个编码Agent在能够检查仓库、编辑文件、运行测试、安装依赖并提交补丁时,才变得有用。而这些操作也正是使环境具有风险的行为。一次提示注入导致的依赖安装、一条破坏性的Shell命令,或一个意外暴露的密钥,可能造成比一个错误文本答案更严重的损害。

围绕编码Agent可能接触的资源来设计沙箱:

层面 需要控制的内容 重要性
仓库检出 分支、提交SHA、写入范围、子模块、生成文件 防止Agent更改错误的代码库,或隐藏审核路径之外的变更。
文件系统 工作区根目录、挂载文件、忽略路径、输出目录 防止对主机文件、凭据、缓存和不相关项目进行广泛访问。
Shell执行 允许的命令、工作目录、超时、输出捕获、审批门禁 赋予Agent足够的构建和测试能力,同时限制高风险操作。
包安装 注册表策略、锁定文件、锁定版本、缓存策略、安装日志 当Agent请求新依赖时,减少供应链的不确定性。
网络访问 默认出站、白名单、DNS行为、API目标、包镜像 有助于防止意外数据移动,并使外部调用可审查。
密钥 范围受限的凭据、短期令牌、脱敏处理、不默认使用生产密钥 防止Agent读取或泄露其不需要的凭据。
制品 测试报告、构建输出、截图、生成文件、日志 为审查者提供证据,而不只依赖Agent的摘要。
生命周期 暂停、恢复、快照、重置、清理、保留策略 使Agent运行可重复且可丢弃,而非长期存在的迷之机器。

将此表作为设计清单。无论你的沙箱是基于容器、虚拟机、微型虚拟机、托管云沙箱还是内部运行器,它都适用。具体的隔离层很重要,但围绕该层的操作控制同样重要。

运行Agent生成代码的参考工作流

最安全的编码Agent工作流看起来不像聊天机器人,而更像一个受控的拉取请求管道。

  1. 为任务创建一个全新的工作区。
  2. 在特定分支或提交处检出目标仓库。
  3. 给Agent一个狭窄的任务、测试命令和文件范围。
  4. 让Agent检查文件并提出计划。
  5. 自动运行低风险的只读命令。
  6. 对高风险命令要求审批或策略检查。
  7. 捕获每条命令、退出码、标准输出、标准错误、文件写入和生成的制品。
  8. 在沙箱内运行测试、类型检查、代码检查、构建或目标脚本。
  9. 导出补丁、差异、测试输出和制品包。
  10. 审查后重置或销毁工作区,除非有意保存了快照。

重要的细节是:沙箱不仅是执行代码的地方,也是证据记录器。审查者应能回答以下问题:检出了哪个仓库?发生了什么变更?运行了哪些命令?哪些失败了?哪些通过了?产生了哪些文件?联系了哪些外部资源?

对于简单的Agent,这可以实现为一个带有策略检查的动作队列。对于更强大的Agent,保持相同的边界,但使控制平面更明确:一个组件决定Agent允许请求什么,一个组件执行已批准的动作,一个组件记录运行过程。

用户任务
  -> Agent 提出文件读取、编辑和命令建议
  -> 策略层对每个动作进行分类
  -> 沙箱执行已批准的动作
  -> 捕获日志、差异和制品
  -> 人工审查补丁,然后合并或部署

这种分离防止模型既是规划者,又是危险操作的最终权威。

命令执行前的安全检查点

首先假设生成的命令可能是错误的、过于宽泛的,或受仓库内容影响的。编码Agent可能从测试夹具、README、Issue正文、包脚本或网页中读取恶意指令。沙箱应使这些失败可见且可控。

在Shell执行之前,定义命令类别:

命令类别 示例 默认策略
只读检查 pwdlsgit statusrgcat package.json 通常允许并记录。
本地验证 npm testpytestgo testcargo test 允许,设置超时并捕获输出。
构建或生成 npm run build、代码生成、文档生成 允许,当输出路径在预期范围内时。
依赖变更 包管理器安装、锁定文件更新 需要策略检查或审批。
网络命令 获取URL、调用API、克隆额外仓库 需要目标策略并记录日志。
破坏性命令 删除、强制重置、磁盘清理、广泛的chmod/chown 阻止或需要明确的人工审批。
密钥访问 读取环境文件、凭据存储、部署配置 阻止,除非任务特定且范围受限。

这不需要完美的静态分析器。即使是简单的控制也有帮助:工作目录限制、明确的拒绝模式、命令超时、输出大小限制,以及针对改变依赖、接触凭据或联系外部主机的命令的审批提示。

文件系统边界也应同样具体。只挂载Agent所需的仓库和临时目录。避免挂载操作员的家目录、SSH密钥、云配置、包管理器凭据、浏览器配置文件或生产环境文件。如果需要缓存以提高速度,优先使用只读或任务范围的缓存,并明确保留策略。

如何处理包安装和网络访问

包安装是编码Agent沙箱中最困难的部分之一,因为它既有用又有风险。Agent需要重现构建和运行测试,但安装脚本可能执行代码、拉取传递依赖并联系外部基础设施。

对包操作使用更严格的策略:

  • 优先使用基于锁定文件的安装,而非自由形式的依赖解析。
  • 记录包管理器命令、注册表URL、包名称、版本和锁定文件变更。
  • 尽可能通过批准的注册表或镜像路由依赖下载。
  • 将新依赖添加视为需要审查的代码变更。
  • 对于高风险工作流,阻止安装脚本,除非项目明确需要。
  • 将依赖缓存与凭据和无关仓库分开。

网络出站也应同样对待。编码Agent可能需要访问互联网以获取包注册表、API文档、浏览器检查或集成测试。但这并不意味着需要无限制的出站访问。

至少,定义默认值:

网络问题 更安全的默认值
沙箱可以访问互联网吗? 除非任务需要,否则不允许。
它可以解析任意DNS名称吗? 限制或记录DNS和目标主机。
它可以调用生产API吗? 默认使用暂存端点或模拟服务。
它可以获取包依赖吗? 使用批准的注册表、镜像和锁定文件。
它可以上传文件或日志吗? 除非目标符合预期并经过审查,否则阻止。

不要将这些控制描述为对数据泄露或依赖妥协不可能发生的保证。更现实的声明是:策略、隔离、日志记录和审查减少了爆炸半径,并在补丁被信任之前使危险行为更容易被发现。

用于人工审查的差异、制品和日志

当沙箱产生一个紧凑的审查包,而不是冗长的聊天记录时,人工审查最有效。

对于每次运行,捕获:

  • 用于检出的仓库URL、分支和提交SHA。
  • 任务提示或问题摘要。
  • 读取的文件和写入的文件。
  • 每条命令、工作目录、开始时间、结束时间、退出码、标准输出和标准错误。
  • 依赖安装命令和锁定文件变更。
  • 测试、代码检查、类型检查和构建结果。
  • 生成的制品,如截图、报告、覆盖率、二进制文件或预览URL。
  • 最终差异,以标准补丁或拉取请求格式呈现。

审查者应首先检查差异,然后使用日志和制品来回答针对性问题。测试真的运行了吗?Agent是否修改了请求范围之外的代码?它是否添加了依赖?它是否重写了生成的文件?它是否调用了网络服务?它是否留下了大量或敏感的制品?

对于生产团队,使审查门控显式化:

  • Agent可以提出补丁。
  • 沙箱可以运行验证。
  • 系统可以打开拉取请求。
  • 人工或已批准的策略必须决定是否合并、部署或授予更广泛的权限。

对于包含基础设施、计费、认证、部署或客户数据路径的仓库,这个边界尤其重要。

Novita Agent沙箱的定位

Novita Agent沙箱 专为隔离、有状态的执行环境而设计,Agent可以在其中运行代码、安装依赖、访问文件、使用浏览器工作流,并在会话间保留执行状态。Agent沙箱概述 描述了三个核心构建块:用于隔离任务执行的沙箱、用于准备环境的模板,以及用于重用已配置状态的快照。

对于编码Agent工作流,这些原语自然地映射到受控的开发工作区:

编码Agent需求 沙箱模式
从已知环境开始 使用包含预期运行时和工具的模板。
在主机之外运行命令和测试 在沙箱特定的文件系统和运行时环境中执行。
重用已准备好的设置 在安装已批准的依赖或项目工具后保存快照。
调试长时间运行的Agent工作 当工作流需要连续性时,跨会话保留状态。
审查后清理 根据保留策略重置、停止或丢弃沙箱。

将产品使用和安全策略分开。Novita Agent沙箱可以为运行代码的Agent提供隔离的执行环境,但你的应用程序仍需定义仓库访问、命令策略、密钥范围、网络规则、制品保留和人工审批门禁。这些选择取决于你的威胁模型,并应在公开生产使用前由你的工程和安全负责人审查。

想要动手实践的开发者,还可以阅读Novita指南:使用Novita沙箱构建远程代码执行MCP服务器。产品文档,请从Novita Agent沙箱文档SDK与CLI安装指南 开始。

常见问题

编码Agent沙箱足以让生成的代码安全吗?

不是。沙箱只是一个控制层。你仍然需要范围受限的仓库访问、命令策略、依赖控制、网络限制、密钥处理、日志、制品审查,以及在合并或部署前的人工审批。

编码Agent应该拥有互联网访问权限吗?

只有当任务需要时才允许。许多代码审查、重构和测试工作流在依赖准备完毕后,无需一般互联网访问即可运行。当需要互联网访问时,记录目标,并优先使用白名单包注册表、文档站点、暂存API或模拟服务。

Agent应该获得生产密钥吗?

默认避免将生产密钥交给编码Agent。使用针对特定任务的范围受限、短期凭据,优先使用暂存服务,对日志进行脱敏处理,并除非有经过审查的理由,否则将密钥访问排除在仓库工作区之外。

在信任Agent补丁之前,应审查什么?

审查差异、变更的依赖、生成的文件、命令日志、测试结果、网络活动及任何制品。特别关注认证、授权、部署、计费、基础设施、数据访问和包管理变更。

何时应该重置沙箱?

每次任务后重置或销毁工作区,除非有意保存了快照。持久状态对长时间运行的工作流有用,但它应是一个经过深思熟虑的选择,并带有所有权、保留和清理规则。

推荐文章