Peter Pang (@intuitiveml)
2026-06-17
D
原文
---
title: "笨沙箱,聪明宿主"
author: "Peter Pang (@intuitiveml)"
source_url: "https://x.com/intuitiveml/status/2066982286395068540"
published_at: "2026-06-16T20:32:34.000Z"
fetched_at: "2026-06-17T15:58:37Z"
updated_at: "2026-06-17T15:58:37Z"
language: "zh"
review_status: "draft"
---

# 笨沙箱,聪明宿主
大多数云端智能体(cloud agent)架构,一开始问的都是:沙箱能做什么。
它能跑 shell 命令吗?能装包吗?能调 API 吗?能持久化文件吗?能发起 LLM 调用吗?崩溃之后能恢复吗?
把这一层搭了一阵子之后,我觉得更好的问题恰恰相反:
什么是绝不该信任沙箱去做的?
桌面端智能体把一切都收拢进同一道边界。用户、机器、文件系统、凭据、运行时、进程,全都住在一起。智能体可以读取本地文件、使用本地环境变量、直接调用 API,出了问题还能指望用户重试。
云端智能体没有这份简单。
它跑在共享的基础设施上。它执行的是由 LLM 写出来的代码。触发它的可能是一个人、一个定时任务、一次 API 调用,或者另一个智能体。用户可能并不在场。提示词可能怀有恶意。执行环境里的代码可能早已被攻陷。
这就改变了架构。我们最终落定的规则很简单:宿主是聪明的,沙箱是笨的。

宿主是那个可信的、长期存活的控制面。它掌管身份、密钥、计费、持久化、重试、策略、可观测性,以及本次运行的权威记录。
沙箱是那个一次性的执行边界。它运行由模型选定的代码和 shell 命令。它可以创建文件。它可以通过狭窄的通道调用工具。但它不持有长期有效的凭据,不直接写入业务状态,不决定计费,也不以自己的身份去调用内部服务。
这种切分事后看起来理所当然。可在搭建的过程中,它一点都不显然。
诱人的设计是:每当一个新功能需要点什么,就把沙箱变得更聪明一点。智能体需要 Slack,就给沙箱一个 Slack token。它需要持久化,就让它往数据库里写。它需要计费,就在执行器内部扣减额度。它需要调一个内部 API,就给它一个服务 URL 和一个密钥。
每一个决定,在局部看来都很方便。合在一起,它们就把一个不受信任的执行环境,变成了整个系统里权限最高的部分。
这是本末倒置。
沙箱只该在一个维度上强大:执行。它可以运行模型选定的代码。其余的一切,都应当由宿主居中代理。
当智能体需要调用一个需要鉴权的服务时,沙箱拿不到那个 OAuth token。它通过一座桥(bridge)发出请求。宿主验证这个请求确实属于当前这次运行,检查策略,在服务端附上真正的凭据,转发这次调用,记录下发生了什么,然后只把响应返回回去。
当智能体需要持久化输出时,沙箱不会变成数据库客户端。它发出结构化的事件,或者写出由宿主决定是否存储的产物。即便沙箱在运行进行到一半时消失了,持久的记录依然存活在它之外。
当智能体需要花钱时,沙箱不会给自己计费。宿主看到这次调用,施加速率限制,扣减额度,并把这个决定记入日志。任何依赖不受信任的代码自愿上报自身用量的记账系统,最终都会出错。

同样的模式也适用于可观测性。困在沙箱内部的日志对调试有用,但它们不是权威的记录系统。宿主需要看到每一次有意义的边界穿越:工具调用、生成的产物、用户可见的事件、额度扣减、重试、失败,以及最终状态。
沙箱仍然可以有有限的智能。它可以运行辅助脚本、调用本地工具、使用 MCP 服务器,并在需要时发起 LLM 调用。但那些 LLM 调用应当经过一个网关,使用范围受限、短时有效的凭据。沙箱永远不该看到真正的服务商密钥。
边界本身就是产品。
一个好的云端智能体运行时,在宿主和沙箱之间有一道狭窄的接口。沙箱可以请求。宿主来决定。
那道接口通常看起来很无趣:stdout 标记、桥接调用、范围受限的 token、会过期的凭据、结构化的事件。无趣是好事。无趣意味着可审计。无趣意味着可重放。无趣意味着你能想清楚,当沙箱被攻陷时究竟会发生什么。
失败场景就是设计的试金石。
如果提示注入说服了智能体去倾倒它的环境变量,会泄露什么?
在「聪明宿主、笨沙箱」这个模型里,答案应该是:没有长期有效的服务商密钥,没有数据库凭据,没有用户的 OAuth token,没有内部服务的密钥。最坏的情况下,攻击者拿到的也只是范围受限的凭据——只在这一次运行、只从这个环境、只在一个很短的时间窗内有效。
如果沙箱崩溃了,会丢失什么?
也许是一些临时文件。大概还有正在进行的执行。但不会丢掉用户的身份,不会丢掉计费状态,不会丢掉持久的事件日志,也不会丢掉平台重试或解释发生了什么的能力。
这就是让沙箱保持笨拙的意义所在。不是因为它什么都不做,而是因为它可以被替换掉。

云端智能体不是一台里面塞了点 AI 的虚拟机。它是一个可信的宿主,在协调一个不受信任的执行器。
用户的意图归宿主所有。执行归沙箱所有。密钥、计费、持久化和策略,都应当待在影响范围之外。一旦你划出这条线,新功能就更容易安放。
它需要密钥吗?宿主。
它需要持久状态吗?宿主。
它要决定一个用户是否被允许做某件事吗?宿主。
它要执行智能体写出来的代码吗?沙箱。
它需要跨回到产品里吗?桥接。
于是架构关心的,就不再是给沙箱添加能力,而更多是围绕它去设计那些通道。
这才是让云端智能体可以无人值守地安全运行的原因。不是一个更聪明的沙箱,而是一个更笨的沙箱,外面包着一个更聪明的宿主。