AI Agent 执行生成代码,怎样确认隔离级别真的达标?
让 Agent 写一段脚本并运行,几行代码就能完成数据转换;但当脚本来自模型、输入又可能不可信时,“放进沙箱”并不等于安全。更棘手的是,托管平台可能按机器条件切换底层运行时:调用方只知道自己请求了执行,却未必知道这次实际经过了哪道隔离边界。
开源项目 plimsoll 把这个问题变成可检查的运行时契约:每次结果都报告实际隔离级别,调用方可以声明最低级别;后端达不到要求时,请求会在代码执行前被拒绝。它还提供按单次运行授权的 API 代理,让 Agent 代码不直接持有凭证。项目 README 当前标注 Apache-2.0,主要实现语言为 Go。
先看“隔离等级”而不是一句沙箱承诺
plimsoll 把隔离强度由弱到强分为 process、container、kernel、vm。不同 provider 采用不同执行边界,结果中会报告实际 tier。关键不在于等级名称听起来多安全,而在于调用方能否设置 floor:例如只接受 vm,若当前环境只能提供较低等级,就不应静默降级执行。
这是一个重要的设计取舍:失败关闭优于悄悄降低保证。Go 客户端示例直接把最低要求放进请求:
res, err := provider.Sandbox.RunJavaScript(ctx, sandbox.Request{
Code: "console.log(6 * 7)",
MinimumIsolation: sandbox.IsolationVM,
})
if err != nil {
// 检查拒绝原因;最低隔离级别不足时,代码不会被派发执行。
return err
}
fmt.Println("实际隔离级别:", res.Isolation)
ErrInsufficientIsolation 表示执行没有发生;但不要把所有错误都当作“肯定没运行”。文档指出,只有带有明确 not-dispatched 标记的拒绝,才可判定未派发;普通错误可能出现在代码已经启动之后,因此不能不加判断地自动重试。这个区别对有副作用的任务尤其重要。
从本机示例开始,别把开发模式当生产边界
仓库提供无需 daemon、Docker 或凭证的最小示例:
git clone https://github.com/plimsollmark/plimsoll cd plimsoll go run ./examples/minimal
这个示例用进程内的 WebAssembly/QuickJS provider,输出会包含 isolation process。它适合快速理解 API 和检查返回结果,但项目明确提醒:process 没有操作系统层面的隔离墙,不应拿来运行恶意代码。不能因为示例成功、代码“在 WASM 里”,就把它等同于强隔离部署。
README 还展示了使用 Docker 与 gVisor 的路线。安装项目固定版本的 gVisor 并注册 runsc 后,先构建项目沙箱镜像,再指定 provider 和 runtime:
sudo ./docker/install-gvisor.sh make docker-images SANDBOX_PROVIDER=docker SANDBOX_DOCKER_RUNTIME=runsc go run ./examples/minimal
是否达到目标不能只看环境变量写了什么:应检查运行结果的 tier,并在部署环境中验证启动检查确实识别到预期 runtime。README 还说明,未设置 SANDBOX_PROVIDER 时使用 Disabled provider,不会意外执行代码。实际接入前,应根据目标 threat model 阅读各 tier 的依据和部署指南;不要把示例命令当成完整生产部署方案。
凭证留在边界外
执行不可信代码时,网络权限同样是风险面。plimsoll 的 capability grant 将权限限定到一次 run 和指定 API 路由:没有 grant 时,运行没有网络访问;guest 代码通过沙箱内提供的 client 发起调用,外部 broker 校验调用者与路径,再由 broker 附加凭证。凭证不会交给 guest 代码,文档也说明可由 TokenMinter 为每次运行生成凭证。
因此它不是“给脚本一个 API key,再希望脚本不泄露”的做法,而是把网络访问变成宿主侧代理执行的能力。allowlist 应尽可能精确,只开放任务必需的路由;否则即使密钥没有直接暴露,过宽的授权仍可能让恶意或错误代码造成损害。
适合谁,边界又在哪里
如果你的 Agent 产品需要运行模型生成代码,且不同机器可能提供不同强度的沙箱,plimsoll 的价值在于把隔离级别、最低要求和拒绝原因纳入应用逻辑,而不是只依赖部署文档中的一句“已隔离”。README 列出 Vercel AI SDK、Google ADK、Agno、CrewAI、Trigger.dev 和 Mastra 等接入路径,可按现有框架选择客户端。
但它不是凭空创造隔离:实际墙来自底层 provider 与其配置。项目也明确区分“运行时收集到的隔离证据”和硬件级远程证明(attestation);报告 tier 并不等于密码学证明机器正在运行某个特定软件。上线前仍需审视 provider、主机权限、网络策略、资源限制与失败重试逻辑,并针对自己的攻击模型做测试。
对 AI 执行环境而言,值得追求的不是一个听起来绝对安全的标签,而是每次运行都能回答三个问题:代码实际跑在哪里、它拿到了什么权限、条件不满足时是否真的没有执行。plimsoll 的设计正是围绕这三件事提供可读、可拒绝、可复核的接口。
相关链接