Perplexity把内部跑Agent代码的沙箱平台开源了,名字叫SPACE。官方推文里说得很直接:这是他们内部用于安全Agent运行时的沙箱平台,支撑着Computer产品,也支撑着强化学习的训练和评估工作负载。

打开网易新闻 查看精彩图片

核心问题只有一个:Agent生成的代码、用户提交的代码,都是不可信的。怎么让它们跑起来,又不让它们碰到不该碰的东西?SPACE的答案是把这些代码塞进Firecracker microVM里隔离执行,对外只暴露纯HTTP和SSE接口。

开源地址已经放出来了:github.com/perplexityai/S。

五个概念,一条严格的生命周期

SPACE的抽象层不多,五个概念撑起整套体系:

  • Template:起始文件系统和运行时配置,不可变,类似镜像,按内容寻址(sha256 digest)
  • Sandbox:一个Template的实例,独立microVM加可写文件系统
  • Process:Sandbox内执行的程序,同一Sandbox内的进程共享环境
  • Command session:一次命令的连接信息与授权,创建即分配进程ID,attach才真正启动
  • Operation:异步生命周期请求的追踪记录,涵盖create、pause、suspend、wake、delete

这里有个关键设计:Sandbox的生命周期长于创建它的请求,也长于承载其输出的连接。管理面是异步的,API只把期望状态写进PostgreSQL,由控制器和worker协调收敛,客户端拿operation ID轮询。数据面则完全独立,通过会话级attachment token经SSE直连沙箱内进程取输出。

管理token和attachment token不可互换,这是它的安全边界之一。

控制面与数据面,两条路各走各的

请求和执行被拆成两条路径。管理面走的是:Application到API,写PostgreSQL存期望状态,再到集群控制器,到沙箱Pod(K8s模式下),到运行时shim,到Worker服务,最后进Firecracker microVM和客户进程。

数据面则是Application直接连Data plane再到客户进程,旁路整个控制面,输出流不经过数据库。

Worker负责VM、网络、卷、模板、凭证,用btrfs写时复制构建根文件系统,这是快速克隆沙箱的关键。模板与快照走对象存储,本地用Versity S3 Gateway。部署形态可插拔:Kubernetes适配器支持本地Kind和云端EKS参考部署,直接适配器则不经K8s直调worker,支持单机运行。

Pause和Suspend的区分能看出状态机的严谨。Pause保留常驻内存,恢复快但不持久;Suspend生成VM内存、运行时状态和根文件系统的完整快照并释放资源,是真正的持久化。两者都用Wake恢复。默认6小时无活动自动Suspend,这是空闲限制,不是最长存活时间。

冷启动的两层解法

冷启动是microVM沙箱平台的体验瓶颈,SPACE给了两个正交方案。K8s部署下用Warm pools,按模板版本乘VM规格预启动一批就绪沙箱,create直接领用,池空了才退化为冷启动。单机部署下用Base snapshots,从基线快照恢复,跳过完整引导。

配合Firecracker本身亚秒级的VM启动和btrfs CoW文件系统克隆,整体目标就是让Agent秒级拿到可用环境。

仓库描述里的pluggable-runtime是设计上最有前瞻性的部分。每个执行环境被定义为主机平台、运行时绑定、客户平台、引导配置、隔离语义、兼容性Profile的完整组合,整体SHA-256内容寻址。当前只实现了编译进代码的E0定义:Linux/x86_64宿主、KVM、Firecracker 1.15.1含jailer、内核6.1.155、快照格式9.0.0。

三条原则值得记下来。结构可解码不等于可执行,解码成功、工件存在、节点健康都不构成执行授权,三者分离校验。身份不可扩展含糊,任何改变引导或恢复语义的字段都必须产生新的schema或引用,加了字段还沿用旧引用被明令禁止。主机平台类型里已经预留了Linux、Windows、macOS的区分身份,虽然当前只实现了Linux适配器。

这明显是在为未来支持其他hypervisor、客户架构甚至非Firecracker运行时铺路,而不是把Firecracker硬编码进协议。

安全模型分了几层

硬件级隔离靠Firecracker microVM边界(KVM),这是对不可信代码的根本防线。token分域把管理面bearer token和数据面attachment token隔开。网络策略上,沙箱Pod有独立namespace,NetworkPolicy只放行API与控制器端口,出站默认限公网IPv4加集群DNS,可配egress profile精细管控,甚至有TLS拦截豁免机制。供应链方面,gitleaks、cargo-deny、supply-chain目录、pre-commit和lefthook一应俱全。内部RPC走TLS,模板注册可限制可信S3 bucket白名单。

兼容性上,SPACE做了E2B兼容层ECW,在边缘翻译E2B API的请求和响应,用E2B Python SDK的应用可以近乎无缝迁移,语义映射上E2B的pause对应SPACE的suspend。客户端零绑定,纯HTTP加SSE,OpenAPI规范直接服务在/openapi-m1.json,不需要嵌入Rust库。

运维面也齐全:space-admin-cli管节点、暖池、模板构建,还有Web UI、OpenTelemetry可观测性、mdBook文档。开发体验上,tilt up热重建,单测加Kind冒烟套件。