GitHub 上的开源项目 plimsoll 用来在沙箱里运行不受信任的代码,例如 AI agent 写出的程序。项目 README 写道:每次运行的结果都会说明这次沙箱有多强;请求还可以要求一个最低强度,达不到就不执行任何代码。名字来自船体外侧供人核对的载重线(Plimsoll line),对应的是隔离强度要标在每次结果上,而不是只写在说明书里。
README 将隔离强度(isolation tier)分为四级,由弱到强依次是 process、container、kernel、vm。该级别是每次结果上的一个字段。请求可以设定 floor,即它愿意接受的最弱一级。守护进程若达不到这个下限,会在任何代码运行之前拒绝,返回 ErrInsufficientIsolation,表示什么都没有跑。官方 Go 客户端在结果返回后会再核对一次隔离级别。
项目同时说明:这一级别是守护进程收集的证据,依据的是它的配置和启动时的检查,并不是硬件对「正在运行什么软件」给出的密码学证明(attestation),这里的 provider 也不提供这种证明。README 还写明,process 表示完全没有操作系统层面的隔离墙,不要用于敌意代码。未设置 SANDBOX_PROVIDER 时,plimsoll 使用 Disabled provider,什么都不运行,从而避免代码执行被意外打开。
同一套机制也可以用来检验 agent 写的代码,而不只是把它关在沙箱里。建在模拟镜像里的测试运行器会让程序面对它无法读取的场景:每个场景以文件形式交给运行器,并在程序启动前删除。每次运行都会返回「按发出时计算的请求」和「按返回时计算的结果」的 SHA-256 哈希,官方客户端会重新计算并核对。独立于守护进程的程序 plimsoll-attest 为校验后的结果签名,拒绝缺少环节的调用链,并可以重放一次运行。README 写明,模拟系统、测试场景和及格线仍由使用者自己定义,plimsoll 提供的是边界和证据。
README 给出的一次真实运行中,AI agent 编写了控制器:程序在每个 tick 读取系统状态并决定如何推动。文中这个 tick 是模拟里的一步,步长 10 ms。plimsoll 让它去控制模拟的倒立摆(cart-pole):导轨上的小车,顶部铰接一根杆,控制器通过左右推小车使杆保持直立。模拟器被编译为 WebAssembly,并内置进沙箱镜像。调用方经普通项目 API 只送入控制器这一个文件,运行级别为 container。
内置运行器记下整条轨迹,也就是每个 tick 的每个状态,再把它哈希成指纹。指纹是 SHA-256,相同就表示数值完全一致。把被接受的控制器跑两次,两枚指纹一致。agent 的初稿把公式中的两个增益(乘数)符号写错,杆在 5.96 秒时倒下,指纹与通过版本不同。项目写明,把这个示例执行一遍会做三次沙箱运行:被接受的控制器两次,初稿一次。复现命令是 make docker-images && go run ./examples/oracle。
许可证为 Apache-2.0。README 的「Status, plainly」一节自述:项目处于 Pre-1.0,单一作者,尚无外部用户,破坏性变更会故意不提供弃用路径;从未做过第三方安全审计,作者自己的自查记录也未公开。