沙箱与代码执行

A15
概念 · 智能体 AI 详解

沙箱与代码执行。

让智能体能够运行代码,是你手上能力跃升最大的一步,也是"可能出岔子的范围"扩张最大的一步——因为这些代码出自一个可以被说服去写出错误代码的系统。本条目讲清为何代码执行依然值得、沙箱究竟在防什么,以及实践中真正要紧的那几条隔离维度。

STEP 1

代码是那个万能工具。

多数工具都很窄:一个函数、一份 schema、一个动作。代码执行不同——它是单独一个工具,却涵盖了无穷多个工具。这买来三样东西:

  • 不必铺开工具面就能覆盖长尾。解析这种古怪的文件格式、重塑这份数据、算出这个统计量、把这两百个文件改个名。为每一项都写一个专用工具是不可能的;一个运行时却能全部搞定。
  • 真正的计算,而非被预测出的计算。让模型做算术,它会预测一个貌似合理的答案。让模型写出并运行这段算术,它拿到的是真实答案。任何确定的、可核验的东西——数学、排序、日期逻辑、格式转换——交给运行时都好过在权重里完成。
  • 把大块数据挡在上下文窗口之外。代码可以拉取一份百万行的文件、过滤它,然后只返回四个数字。没有执行能力,这百万行就都得穿过上下文窗口才能被推理——更慢、更贵,效果还更差。

这正是为何几乎每个称职的编码与数据智能体,核心处都摆着一个 shell 或一个 Python 运行时。对这类工作而言,这项能力并非可选;而隔离,才是让你敢拥有它的原因。

STEP 2

你实际上在防什么。

人的直觉是把它当成"恶意用户"问题。多数时候并不是。坏代码有三个各不相同的来源,其中只有一个牵涉到怀有敌意的人:

  • 模型犯错。智能体写出了一条路径写错的删除、一个永不结束的循环、一次针对错误数据库的迁移。不需要任何对手——只是一个普通失误,却带着 root 级的后果。
  • 提示词注入不可信内容进入了循环——一个网页、一封邮件、一个仓库文件、一份工具结果——其中夹带着指令,而智能体写出了遵从这些指令的代码。在这种情形下,"用户是可信的"完全提供不了任何保护,因为攻击者并不是那个用户。
  • 运行期被拉进来的不可信代码与数据。智能体安装的某个依赖、下载的某个脚本、被交到手上的某个文件。智能体忠实地执行它,而它所做的一切,如今就跑在你的边界之内。

那条承重的观念是:智能体写出的代码,永远是不可信代码。不是因为模型怀有敌意,而是因为它的输出是一个你并不完全掌控的输入的函数。请像对待一个公开的代码执行端点那样对待这个运行时——因为在有注入存在的情况下,它跟那个也差不了多少。

STEP 3

隔离的五条维度。

"已沙箱化"不是一个布尔值。它是一组彼此独立的决策,而团队们常常做对了其中两条,其余全都大敞着:

  • 文件系统。它能读什么,能写什么?默认应当是一块临时工作区加上显式挂载的输入——而不是整个宿主文件系统,外加一句"请智能体守好本分"的客气叮嘱。
  • 网络出站。配置得最不到位的一条,也是把"被控住的失误"变成"数据泄露"的那一条。在出站不受限的情况下,沙箱能读到的任何数据,它都能发出去。请默认拒绝,并对任务确实需要的主机做白名单。
  • 凭据。从内部能够到哪些机密?环境变量、云实例元数据、挂载进去的 SSH 密钥、一个已登录的 CLI——所有这些都是被执行代码白白继承到的凭据。最强的模式是把机密完全留在沙箱之外:智能体请求一个需要鉴权的动作,由你掌控的一个进程去执行它。
  • 算力与时间。CPU、内存、磁盘,以及一个墙上时钟上限。这一条主要是冲着失控循环和成本去的,而非攻击——但一个能无限消耗算力的智能体,本身就是另一种事故。
  • 生命周期。逐次运行即抛,还是跨会话持久?持久化确实有用——已安装的包、中间文件、工作状态——但它也正是"某一次运行里被埋下的东西"够到下一次的路径。请默认即抛,并让持久化成为一个刻意的选择。

各种机制构成一条谱系,大致按强度与成本递增:在宿主进程内运行(毫无隔离——别这么做)、以受限用户身份起子进程、容器、微虚拟机,以及一个替你把守边界的托管执行服务。容器级隔离是常见的底线;凡是真正在跑不可信代码的场景,都该要一层更硬的边界。

STEP 4

四条规矩,以及这整个思路的边界。

  • 内部不放任何环境凭据。如果沙箱能够到某个机密,就假定被执行的代码能把它带走。请从边界之外代理特权动作,而不是把钥匙递进去。
  • 沙箱的输出是不可信输入。代码打印出的任何东西,都会作为一次观察回到智能体循环里,模型会照着它行动。沙箱能阻止代码碰到你的系统;它丝毫阻止不了代码产生的那些文字去操纵下一步。
  • 把运行过的东西记下来。被执行的代码、它的参数与它的输出,正是意外发生时你会需要的那条追踪——也是关于"智能体实际做了什么"(而非"它说自己做了什么")唯一持久的记录。
  • 按租户、按信任边界隔离。跨用户共用一个长期存活的沙箱,就是一条交叉污染的通路,无论进程级隔离做得多漂亮。

沙箱限定的是智能体能够到什么;它对"它被允许采取的那些动作是否正确"只字未提。一个被正当授权可以发邮件的智能体,在一个完美的沙箱里照样能把邮件发错。隔离处理的是"非预期能力"的影响范围;批准闸与最小权限处理的是"预期能力"的后果。两者你都需要,且它们不能互相替代。

沙箱与隔离模式深入解析会详述这些机制,沙箱与执行实战手册专讲编码智能体这一情形,而数据外泄风险讲的则是单靠隔离解决不了的出站问题。至于智能体操作屏幕而非 shell 的相邻情形,见计算机操作