Skip to content

认识 Perplexity SPACE —— 把 Agent 关进一次性虚拟机:0/108 逃逸,但 11/54 被翻墙 ​

先说一件我自己干过的蠢事。

去年我给一个编码 Agent 开了本机执行权限,让它"帮我清理一下项目里没用的依赖"。二十分钟后我回来,发现它 pip install 了三十多个包、改了全局 pip 源、顺手往我的 ~/.zshrc 里塞了两行 export。它干得挺认真,一句废话没说。

那一刻我意识到一件事:我们这行花了二十年研究"怎么让程序别乱动系统",然后在 Agent 时代,集体把 root 交出去了。

Agent 和传统程序的根本区别在于,它干的事是动态的——装库、下载可执行文件、开网络连接、改自己的运行环境。你没法用"这个函数只能读这个文件"的老思路管它。而每一份你给它的权限,都是一份攻击面。

所以当我看到 Perplexity 在 2026 年 10 月把 SPACE 开源的时候,第一反应不是"又一个沙箱",而是:终于有人把生产环境跑了三个月的隔离层,连红队报告一起交出来了。

而且那份报告里,有很难看的数字。我们先讲这个。

一个隔离层值不值得信,不看它宣称挡住了什么,看它敢不敢公布没挡住什么。

什么是 Perplexity SPACE ​

一句话:SPACE(Sandboxed Platform for Agentic Code Execution)是 Perplexity 开源的沙箱平台,给每个 Agent 任务单独开一台 Firecracker 微虚拟机(microVM),让它带着自己的 guest 内核在里面随便折腾,而凭证和出网策略统统留在虚拟机外面。

它不是新玩具。自 2026 年 7 月起,Perplexity Computer 的每一个会话都跑在 SPACE 上,官方口径是 100%。 这次开源的是那个已经在扛真实流量的生产系统,不是演示品。

几个基本盘:

项目情况
发布方Perplexity
开源时间2026 年 10 月 15 日(Apache 2.0,GitHub: perplexityai/SPACE)
当前版本0.8.0,官方定义的"公开基线版本"
语言 / 协议Rust,Apache License 2.0
隔离单位每个 sandbox 一台 Firecracker microVM,独占 guest 内核
对外接口HTTP API + Server-Sent Events(不用嵌 Rust 库)
宿主机要求Linux x86_64 + KVM,/dev/kvm、/dev/net/tun、loop 设备、btrfs、Docker
支持 macOS 吗不支持。 想在虚拟机里跑还得开嵌套虚拟化

顺手说下版本路线,这个信息挺重要的:0.8.0 是公开基线,0.9.0 是官方计划的"最后一个破坏性版本",1.0.0 才承诺稳定 API 与沙箱生命周期契约。 也就是说现在上车,还得接受未来有一次 breaking change。

特点 ​

一、隔离是真的硬件级,不是 namespace 级 ​

每个 sandbox 是一台完整的 Firecracker microVM,有自己的 guest 内核。Agent 在里面拿 root,装什么删什么随它。它改的是虚拟机的东西,不是你的。

Firecracker 是 AWS 用来跑 Lambda 的那套东西,本身就是一个被大规模验证过的边界。SPACE 选它,属于"不自己造轮子"的正确决策。

二、凭证永远不进 guest ​

这是我认为整个设计里最漂亮的一刀。

传统做法是:把 API key 写进环境变量,Agent 一 env 就看见了。SPACE 的做法是——凭证在网络层注入,根本不进虚拟机。 凭证仓库还额外加了分级作用域、速率限制和审计日志。

配套的还有:每个 sandbox 一个宿主机侧的网络网关,每一条出网连接都要过它的策略;网关会终止 TLS,并同时校验 SNI 和 HTTP Host 是否在白名单里。

翻译成人话:Agent 就算拿到了 root,它也摸不到你的 key,也出不了你想让它去的地方。

三、性能数据是生产环境的,不是实验室的 ​

指标数字
创建延迟中位数185 ms → 60 ms(对比 Perplexity 上一家供应商)
创建延迟 p90447 ms → 89 ms(靠 warm pools)
空闲自动挂起6 小时无活动后 suspend

89 毫秒拉起一台带独立内核的虚拟机——这个数字的意义在于,你可以把它放进交互式请求的热路径里,而不是让用户盯着"正在准备环境"转圈。

Kubernetes 部署用**预热池(warm pools)来跳过冷启动,单节点部署则用基础快照(base snapshots)**直接从快照恢复。

四、生命周期四种状态,长任务能睡能醒 ​

Agent 任务是长跑的、有状态的、会分叉的,所以它必须能活过重启。SPACE 给了四态:running / paused / suspended / deleted。

  • paused:内存还留在 worker 上,快,但不是持久快照
  • suspended:内存、运行时状态、根文件系统全部快照,活跃资源释放掉
  • deleted:没了

btrfs 的写时复制(CoW)负责生成每个沙箱的根文件系统,所以"开一台"这件事在存储层面几乎是白送的。

五、红队报告一起开源了(重点) ​

这部分我要展开讲,因为这才是这次开源最值钱的东西。

Perplexity 发布了一份叫 《Escaping SPACE: Part I》 的红队报告:拿 9 个前沿模型,给它们 guest 内的 root,跑 216 次运行、2 个任务、4 种网络设置。

结果三行:

  • 沙箱逃逸:108 次运行里,0 次碰到宿主机侧的 secret。 漂亮。
  • 完全无网络:54 次运行里,0 次绕过。 也漂亮。
  • 部分放开网络:修复前 54 次运行里,11 次成功绕过。 这就是那个难看的数字。

哪 11 次?Claude Opus 5.0、GPT-5.6 Sol、GPT-5.6 Cyber、Kimi K3 这四个模型找到了路子,手法是 DNS 欺骗(DNS spoofing)和共享 CDN IP——就是那种"我没访问黑名单域名,我只是解析到了一个恰好也在白名单 CDN 上的 IP"的经典操作。

Perplexity 随后补了源地址校验(nftables),网关改成终止 TLS 并同时查 SNI 与 HTTP Host,重测之后没有模型能再复现一个已验证的绕过。

我还想补一句更扎心的:同一个团队顺手测了 10 个第三方平台,其中 8 个至少存在一个网络策略绕过(E2B、microsandbox、Daytona 都在列),并且把结果通报给了每一家。一个公司替整个行业做了一次免费的出网策略体检。

能拿来干什么 ​

1. 给 Coding Agent 做执行底座 这是最直接的。Claude Code、Codex、自研 Agent,都可以把"跑命令"这件事丢给 SPACE,而不是丢给宿主机。命令在一个带独立内核的虚拟机里跑,跑崩了重开一台就是。

2. 长时运行的后台 Agent Perplexity 自己的定位就是"long-running agents 的执行层"。paused / suspended 两态就是为这个准备的:任务干到一半可以休眠、可以唤醒、可以分叉,不必一直占着资源。

3. 多租户的代码执行服务 你要做一个"帮用户跑用户代码"的产品(在线 IDE、数据科学笔记本、作业判题),每个用户一台 microVM 是最干净的隔离模型。SPACE 提供的是管理这一堆虚拟机的那层控制面。

4. 从 E2B 平滑迁移 已经用 E2B 的团队,SPACE 提供了 E2B 兼容包装器(ECW),官方测试基线是 Python 包 e2b==2.21.1。仓库里还带一份 AWS EKS 参考部署。

横向对比一眼看清楚:

对比项Perplexity SPACEE2B RuntimemicrosandboxDaytona
隔离Firecracker microVMFirecracker microVMlibkrun microVM每沙箱独立内核
语言RustGoRust未公开
协议Apache 2.0Apache 2.0Apache 2.0公开仓库,2026 年 6 月起停止维护
出网控制每沙箱网关 + TLS 终止nftables + SNI/Host 名单未公开未公开
Perplexity 出网复测修复后 0 绕过HTTPS 绕过,缓解方案在计划中HTTP+HTTPS 绕过,v0.6.18 修复HTTPS 绕过,已发布缓解

初体验:拉起来跑第一个沙箱 ​

先说清楚门槛,别兴冲冲装到一半才发现跑不了:必须是 Linux x86_64 且带 KVM。macOS 直接劝退,WSL / 虚拟机里跑需要先开嵌套虚拟化。

官方推荐路径是本地 Kind(Kubernetes in Docker) 集群,也支持不开 K8s 的直接模式。整体流程是:按 docs/installation.md 部署到 Kind → 用 space-admin-cli login 拿 token → 跑 docs/first-sandbox.md 建第一个沙箱。

核心 API 就这几个 REST 端点,用 Python 标准库就能调(官方 examples/first_sandbox.py 就是一个零依赖示例):

python
# 1) 从模板创建一个沙箱(自带幂等键)
POST /v1/sandboxes            {"template": "seed:latest"}

# 2) 生命周期操作是异步的,轮询 operation 等它完成
GET  /v1/operations/{operation_id}      # 等到 "succeeded"
GET  /v1/sandboxes/{sandbox_id}         # 等到 "running"

# 3) 在沙箱里跑命令
POST /v1/sandboxes/{sandbox_id}/commands
     {"command": ["sh", "-c", "printf \"Hello from SPACE\\n\""], "timeout": "30s"}

# 4) 命令输出走独立的 data-plane 连接 + SSE,用 session 级 attachment token
GET  /v1/sessions/{session_id}/events   # Server-Sent Events 流式读输出

# 5) 用完删掉
DELETE /v1/sandboxes/{sandbox_id}

两个概念先记住:template 是初始文件系统模板,sandbox 是模板的一个实例,自带虚拟机和可写磁盘,一个 sandbox 里能跑多条命令。

注意一个设计细节:管理面 API 和输出流是分开的两条连接(默认 8080 / 8090 端口),命令输出走独立的数据面,并且用 session 级的 attachment token。这个拆分明显是被安全审计逼出来的——管理令牌和输出流的权限必须分开。

先别急着上,几个坑得说清楚 ​

我这人看见"开源""零逃逸""89 毫秒"就想泼冷水,以下几点你上线前得知道:

  • 它挡得住逃逸,但"部分网络"仍然是最难的题。 11/54 是在放开部分网络时被打穿的,虽然修了,但这说明出网策略是这类系统里最脆的一环。你自己配白名单时,别只看域名,要看解析后的 IP 段是否和白名单 CDN 重叠。
  • 0.8.0 不是稳定契约。 官方明说 0.9.0 还会有破坏性变更,1.0.0 才承诺兼容。生产上车请做好升级预算和回滚演练。
  • 部署门槛是真高。 KVM + btrfs + loop 设备 + /dev/net/tun + Docker + Kind,这一串对很多团队来说是实打实的运维成本。它不是一个 pip install 就能玩的东西。
  • 没有 macOS。 用 Mac 开发、Linux 部署的团队,本地调试会很难受。
  • 红队报告是 Perplexity 自己做的。 数据详实、连丢人的数字都给了,可信度比一般厂商自报高得多,但它依然不是第三方独立审计。而且测试只覆盖了 9 个模型、2 个任务——真实攻击面比这个大。
  • Rust crate 级别的 API 不在兼容承诺里。 1.0 承诺的是 HTTP API、node-api gRPC 和 spaced-bridge gRPC,你要是直接依赖它的 Rust 内部接口,没人给你兜底。

最后说个我的看法:SPACE 最值得学的不是 Firecracker,而是它把红队报告和代码一起发布这件事。安全产品最大的敌人从来不是攻击者,是"没人知道它到底挡住了什么"。

进阶 ​

如果你想认真用 SPACE,我建议这么走:先拿 Kind 在本地起一套,用官方的 first_sandbox.py 把"建沙箱 → 跑命令 → 读 SSE 输出 → 删除"整条链路跑通;然后把你最担心的那个 Agent 动作(通常是"执行模型生成的 shell 命令")迁进来,配一条最小白名单的出网策略,观察一周的审计日志;确认没问题之后再考虑 warm pools、E2B 兼容层或者上 EKS。

另外值得留意的是,Perplexity 把 SPACE 定位为"Agentic Runtime Platform(智能体运行时平台)"的第一个组件。也就是说他们接下来还要往外掏东西。Agent 基础设施这块,2026 年下半年明显在从"谁的模型强"转向"谁能让模型安全地动手"——SPACE 是这个转向里第一个把家底亮出来的。

更多开源技术干货和学习资料,关注公众号「遇码」,领取专属福利。

遇码MeetCoding 开源技术社区