118 次逃逸全失败:Perplexity 开源 SPACE,给每个 Agent 一台用完就销毁的虚拟机
过去一年你大概有过这种感觉:Agent 越聪明,你越不敢把活儿整个交给它。它真能自己写代码、自己跑、自己改,快是真快,可你得在旁边盯着它每一步干了什么。省下来的时间,又原样还回去了。
于是行业里的主流解法是审它。看它调用的工具对不对,评它产出的东西靠不靠谱。装 Skill 之前先扫一遍,跑起来之后再让它家模型来当裁判,这两条我们都聊过。思路没错,但它有个前提:你得先相信执行环境是干净的。
Perplexity 在 2026 年 10 月 15 日开源的 SPACE,换了个答案。别审了,把它关进一台一次性的虚拟机里,钥匙留在门外。全名是 Sandboxed Platform for Agentic Code Execution,Apache-2.0,主语言 Rust。

容器为什么挡不住它
先把最底层那件事说清楚。容器和宿主共享内核。这不是 bug,是设计。
进程跑在容器里,系统调用照旧打在宿主机的内核上。内核露一个洞,或者容器被多给了点能力,边界就没了。命名空间和 cgroup 管得住看得见的资源,管不住内核那条共享的通道。
Firecracker 走的是另一条路。它起的是 microVM,每台虚拟机有自己独立的内核。guest 里想碰宿主,得先穿过硬件虚拟化那一层。这玩意儿 AWS 2018 年就用在 Lambda 和 Fargate 上了,跑了八年生产流量,不是实验室玩具。
说白了,容器隔离的是进程,microVM 隔离的是机器。前者赌内核不出事,后者把内核也一起关进去了。
如果你的 Agent 只是跑几行 Python 算个数,容器完全够用。如果它会自己上网装包、自己改配置、自己写脚本再执行,那共享内核就不是一笔你该下的赌注。
顺带一句,把 Docker 沙箱直接搬上云那条路我们也聊过:容器关不住 AI Agent:Docker 沙箱搬上云。那是上一代思路,能缓解,解不干净。
SPACE 把钥匙留在门外
光有独立内核还不够。SPACE 真正狠的地方,是把凭证和出网策略放到了沙箱外面。
官方文档写得很直白:SPACE 把沙箱当作不可信环境,网络访问与平台凭证的管理模块部署在沙箱之外。翻译成人话就是,Agent 在 guest 里可以做 root,但它手上没有钥匙。
第一个是一次性的机器。template 只是起始环境,sandbox 才是带独立 VM 和可写文件系统的实例。任务结束,机器就没了,下一个任务从干净的模板重新起。
第二个是凭证在宿主侧。需要出网的时候由沙箱外的模块代持代发,Agent 拿不到长期明文凭据。
第三个是出网白名单。能不能上网、能访问哪些地址,是平台侧的策略,不是 guest 自己说了算。
第四个是快照与回滚。频繁的文件快照和检查点保存进度,出问题直接回滚,还支持 pause、suspend、wake 和会话分支,一条路走歪了可以分叉重来。
再往下是它的架构:API 把期望状态写进 PostgreSQL,controllers 编排 VM,worker 管网络和凭证,数据面用 btrfs 写时复制从模板生成每个 rootfs。四层各干各的,边界清清楚楚。

118 次逃逸全失败,但翻过一次车
现在说数据。先把出处层级讲清楚:下面这些是 Perplexity 自己的红队自述,经多家外媒转述,没有第三方独立复现,官方 README 里也不写。
9 个前沿模型配置,118 次 VM 逃逸尝试,零次摸到宿主,其中还包括模型手里已经拿到 SPACE 源码的那几轮。
但这里有个坑。118 和 108 两个数字都在流传,有一份细读把总数拆成 216 次运行,其中逃逸任务 108 次。我们不替它圆,两个口径你都记着。
更值得看的是另一项:绕过网络限制去取 flag。断网状态下零成功。可当沙箱允许包镜像和网页搜索时,54 次里成功了 11 次,手法是伪造 DNS,或者搭共享 CDN 地址的便车。Perplexity 称已经修好了网关,复测没有绕过。
然后它拿同一套共享地址测试去打第三方沙箱,结果是 9 个里 7 个被绕过,E2B、Vercel、Modal、Daytona 都在名单上。扛住的是 Cloudflare 和 NVIDIA 的 OpenShell。
真正的边界不是虚拟机,是出网策略。虚拟机决定它能不能破墙,出网策略决定破墙之后它能拿到什么。
还有几个厂商自述的数字:SPACE 每天处理数百万次沙箱创建,在同一生产流量上创建速度比上一家供应商快 3 到 5 倍,warm pool 让 VM 中位启动约 60 毫秒。CoreWeave、Akamai、Crusoe 已经同意对外提供 SPACE。同期竞品是上月开源的 NVIDIA OpenShell,同样 Rust 写的,约 16532 星。
已经在用 E2B 的人要改什么
你手上要是有跑在 E2B 上的代码,官方留了一条兼容的路,叫 ECW,全称 E2B Compatibility Wrapper。它把 E2B 兼容的 HTTP 请求翻译成 SPACE 操作。注意它跟 SPACE API 是两套东西,别混着用。
官方自己把话说得很明白:ECW 是 SPACE 维护的兼容目标,不是某个版本化开放 E2B 规范的实现。这话的意思是,兼容到什么程度,是 SPACE 说了算。
测试基线只有两个 Python 版本,e2b 2.21.1 和 e2b-code-interpreter 2.6.2。其他版本和 JS SDK 都不在覆盖范围内,别赌。
客户端侧改动很小,设好 E2B_DOMAIN 和 E2B_API_KEY 两个环境变量就行:
Sandbox.create(..., domain=..., template="seed", timeout=60)服务端要配 SPACE_ECW_HOSTS,一个 JSON 数组,还有 SPACE_ECW_CREDENTIAL_KEY_PATH。API 只存 key 的 SHA-256 哈希,明文不落库。建 key 用 scripts/seed-api-key.sh,带 –org-id、–created-by、–name 三个参数,跑完会打印一次明文 key,并输出一段要你执行的 SQL。

五步跑通第一个沙箱
安装就一行命令,真正的门槛在机器上,那个放到下一节说。仓库是 github.com/perplexityai/SPACE,10 月 1 日建库,10 月 18 日还在推代码,1411 星,112 fork。
git clone https://github.com/perplexityai/SPACE.git && cd SPACE- 第一步,克隆仓库并进目录,就是上面这一行。
- 第二步,跑官方文档里的检查块,确认 /dev/kvm、/dev/net/tun、loop 设备、btrfs,还有允许特权容器的本地 Docker daemon 都在。
- 第三步,跑 infra/space/kind/scripts/install-prereqs.sh,它会装 Kind、kubectl、Helm、grpcurl、Tilt、Go、jq。
- 第四步,跑 install-fc-vendor.sh 装 Firecracker 依赖,再跑 bootstrap.sh 起整套环境。
- 第五步,执行 python3 examples/first_sandbox.py。只用 Python 标准库,不用装任何包,成功会打印 Hello from SPACE 和 Command completed successfully。
脚本内部自己走六步:Create 从 seed:latest 请求一台 Firecracker 沙箱,Wait 轮询 operation 直到成功且 sandbox 变 running,Execute 建 command session 再 attach 到事件流启动进程,Check 把 base64 的 stdout/stderr 解出来并确认 process_exited 且退出码 0,Inspect 列沙箱看详情看进程,最后你决定删不删。
想换命令就改 COMMAND 常量,官方给的例子长这样:
COMMAND = {
"command": ["sh", "-c", "printf '%s\\n' \"$GREETING\"; pwd"],
"cwd": "/tmp",
"env": {"GREETING": "Hello from Python"},
"timeout": "30s",
}四个坑:README 里都不写
这部分是文档里散落着、但没人替你归到一起的东西。踩中任何一个,你都会浪费半天。
- 第一道门槛是机器。必须是 Linux x86_64 且带 KVM 的主机,文档原话是这些步骤不能直接在 macOS 上跑。前置还得有 Bash、Git、curl、tar、OpenSSL、Python 3.8+、ssh-keygen。
- 第二,请求被接受不等于沙箱就绪。架构是 API 把期望状态写进 PostgreSQL,controllers 和 worker 去收敛,生命周期变更是异步的,返回的是 operation ID,你得自己轮询。
- 第三,命令走的是参数数组,不会隐式经过 shell。想用管道、重定向、变量展开,必须显式写 sh -c。另外可执行程序和工作目录必须存在于沙箱内部,不是宿主机上。
- 第四,两种 token 不通用。管理请求用 API bearer token,命令流用返回的 command attachment token,不能互换。环境变量是 SPACE_API_URL、SPACE_DATA_PLANE_URL、SPACE_API_TOKEN,SPACE_TEMPLATE 默认 seed:latest。
还有一句提醒别当耳旁风:这套部署用的是开发用密码和签名密钥,别把生产凭证放上去。仓库现在有 95 个 open issue,建库才半个月,它是真早期,不是成熟件。
把损失压到一台虚拟机那么大
Agent 安全这件事,最后拼的不是你能多准地判断它想干什么,而是它真干了坏事之后,你能承受多大损失。
审它、评它、盯着它,是在提高判断精度。关起来,是在压低损失上限。
前者永远追不上模型进化的速度,后者压根不追,它只是把爆炸半径锁死在一台一次性虚拟机里。
回到开头那种感觉。你不敢放权,不是因为 Agent 不够聪明,是因为你心里清楚,一旦它跑偏,没人知道损失会有多大。SPACE 给的不是一个更聪明的审查员,是一间炸了也不心疼的屋子。
说实话,这才是让人敢真正放权的东西。
关注圈圈,持续带你玩转 AI 工具。
暂无评论内容