SmolVM 沙箱化 AI Agent 非受信代码 · 干货攻略
- 链接:https://simonwillison.net/2026/Aug/19/smolmachines-untrusted-sandbox
- 分类:x-tips
- 来源:X @simonw
- 作者:Jay
- 更新:2026-08-26
这是什么
SmolVM(smol-machines/smolvm)是一个开源的轻量级 microVM 运行时,专门解决 AI Agent 执行 LLM 生成代码时的隔离问题。由 Aniket Maurya 与 Celesto AI 团队开发,Apache 2.0 开源协议,2026 年 4 月 21 日正式发布,GitHub 发布首日即获得 482 个 HN 点。
核心定位:让每个 AI Agent 任务拥有自己独立的一次性虚拟机——有独立内核、独立网络、独立文件系统,通过虚拟机监控器(VMM)边界与宿主机隔离,比 Docker 容器共享内核的安全模型高一个档次。
官方 GitHub 仓库:
- smol-machines/smolvm(主仓库):https://github.com/smol-machines/smolvm
- CelestoAI/SmolVM(Celesto AI 维护版):https://github.com/CelestoAI/SmolVM
为什么值得关注
谁在分享:Simon Willison
Simon Willison(@simonw)是 AI 工具领域的知名独立研究者,长期撰写深度技术博客。此次他让 Claude Fable 5 在 Claude Code for Web 环境中自主完成任务——测试 SmolVM 作为非受信 Python/JS 代码的沙箱方案。Fable 5 在发现容器环境无法运行 KVM 时,自主演示了通过 GitHub Actions 绕过环境限制的方案,展示了"持续主动"的工作风格。
解决什么问题:Docker 的安全模型不适用于 AI 生成代码
LLM 生成的代码本质上等同于「来自互联网的任意输入」,传统方案 Docker 存在根本性缺陷:
- 共享内核:容器与宿主机共享同一个 Linux 内核,系统调用、内存管理、调度器全部共用。若代码通过内核漏洞实现容器逃逸,直接拿到宿主机 root 权限。历史 CVE 如 CVE-2019-5736(容器覆写宿主机 runc)、CVE-2024-21626(工作容器逃逸)均利用这一攻击面。
- 冷启动成本:容器冷启动约 500ms–2s,导致团队在高频热路径上跳过沙箱环节。
- 无法恢复状态:容器退出即销毁,无法 pause/resume、无法快照。
SmolVM 的方案:每个 Agent 任务跑在一个独立 VM 里,有独立内核和网络命名空间,通过虚拟机监控器(VMM)边界隔离。攻击难度远高于容器逃逸——即使 Guest 内核有漏洞,攻击者仍需突破 VMM 层才能接触宿主机。
社区对比(r/LangChain 2026 年 4 月 benchmark)
| 维度 | SmolVM | E2B | OpenSandbox | Microsandbox |
|---|---|---|---|---|
| 快照 ergonomics | ✅ 领先 | ❌ | ❌ | ❌ |
| fork/clone 支持 | ✅ 领先 | ❌ | ❌ | ❌ |
| pause/resume | ✅ 领先 | ❌ | ❌ | ❌ |
| computer-use 支持 | ✅ 领先 | ❌ | ❌ | ❌ |
| 私有化部署 | ✅ 领先 | ❌ | ✅ | ❌ |
| SDK 生态成熟度 | ❌ | ✅ 领先 | ❌ | ❌ |
结论:SmolVM 在沙箱核心能力上领先,E2B 在 SDK 语言覆盖(Python/TypeScript/Go/Ruby)上领先,二者定位不同。
核验过程
本次攻略查阅并交叉验证了以下官方来源:
- GitHub README(
smol-machines/smolvm):安装命令、沙箱功能、Somolfile TOML 配置格式、pack/push/pull 机制、安装路径(~/.local/share/)。 - Celesto AI 官方博客(2026-07-11):Firecracker/QEMU/libkrun 三种后端的受控基准测试数据,包含详细配置(1 vCPU / 512 MiB 内存 / Alpine 客人 / Linux KVM 宿主 / 5 次计时 / SSH 和 vsock 双控制通道)。
- mywrittenword.com 技术博客(2026-04-26):SmolVM 发布背景、定位与行业对比(E2B/OpenSandbox/Microsandbox),明确标注作者 Aniket Maurya + Celesto AI 团队、许可证 Apache 2.0。
- Simon Willison 博客(2026-08-19):smolvm 1.8.3 实测数据,冷启动 0.6–1.5s,热执行约 50ms,测试了网络隔离、CPU/RAM 限制、超时强制终止、存储配额、只读输入挂载、可写输出挂载、
--unprivileged全部按预期工作。
数字冲突说明: - Celesto AI 官方博客报告:Linux KVM 宿主机上,Firecracker SSH 通道首次命令耗时约 1,594ms,QEMU vsock 约 1,571ms(均为历史受控数据,p50/p95/mean/min/max 均公开)。 - Simon Willison 实测(smolvm 1.8.3):冷启动 0.6–1.5s(未明确标注宿主环境;Claude Code for Web 本身是 Firecracker guest,可能存在嵌套虚拟化开销)。 - 官方 README 声称"sub-second cold start"但未注明平台,GitHub releases 显示最新版本为 v1.13.0。
关键数字一致部分:冷启动在 0.5s–2s 量级因平台而异;热执行为 1ms–50ms 量级;vsock 控制通道可将热命令延迟从 ~42ms 降至 ~1ms。
上手步骤
安装(macOS / Linux 一行命令)
curl -sSL https://smolmachines.com/install.sh | bash
或从 GitHub Releases 下载二进制放到 ~/.local/share/。
Windows 需要下载 windows-x86_64 压缩包(含 krun.dll + libkrunfw.dll),并启用 Windows Hypervisor Platform (WHP)。
验证安装
smolvm --version
# 或指定后端验证
smolvm doctor --backend firecracker
smolvm doctor --backend qemu
smolvm doctor --backend libkrun
运行一个非受信代码命令(默认无网络)
# 网络默认关闭 —— 非受信代码无法对外连接
smolvm machine run --image alpine -- nslookup example.com
# 预期失败:无网络访问
# 在热路径上运行一个清洁的命令
smolvm machine run --image alpine -- sh -c "echo 'Hello from a microVM'"
配置 Smolfile(类似 Dockerfile,但管理整个 VM)
创建 Smolfile(TOML):
image = "python:3.12-alpine"
net = false # 默认无网络,强制隔离
cpus = 2
memory = 2048 # MB
volumes = ["./src:/app"] # 只读输入挂载
init = ["pip install -r /app/requirements.txt"]
启动命名 VM
smolvm machine create --name myvm -s Smolfile
smolvm machine start --name myvm
smolvm machine shell --name myvm # 交互式进入
smolvm machine stop --name myvm
打包为便携文件(跨平台分发)
# 打包状态 VM
smolvm machine stop --name myvm
smolvm pack create --from-vm myvm -o myvm
# 推送到 OCI registry
smolvm pack push --file myvm.smolmachine ghcr.io/you/myvm:v1
# 其他机器拉取重建
smolvm pack pull ghcr.io/you/myvm:v1
定向允许网络(精确白名单)
# 只允许访问 npm registry
smolvm machine run --net \
--image alpine \
--allow-host registry.npmjs.org \
-- wget -q -O /dev/null https://registry.npmjs.org
# 成功
smolvm machine run --net \
--image alpine \
--allow-host registry.npmjs.org \
-- wget -q -O /dev/null https://google.com
# 失败:不在白名单
运行基准测试(Celesto AI 官方脚本)
# 需要 SmolVM 仓库 checkout
git clone https://github.com/smol-machines/smolvm
cd smolvm
uv run python scripts/benchmarks/bench.py \
--backend firecracker \
--only cold-start,tti \
--iterations 10 \
--output /tmp/firecracker.json
# 同理测 qemu / libkrun
坑与适用边界
⚠️ 冷启动不是 sub-second 所有场景都满足
官方 README 声称"sub-second cold start"但未标注平台。实测数据: - macOS Hypervisor.framework / libkrun:可达 <200ms(官方数据) - Linux KVM:约 1.3–1.9s(Celesto AI 受控基准,SSH 通道) - 嵌套虚拟化环境(Claude Code for Web 本身是 Firecracker guest):可达 1.5s
建议:在目标平台实测,不要假设冷启动满足 SLA。
⚠️ macOS 上 Firecracker 不可用
Firecracker 依赖 Linux KVM,macOS 上只能用 QEMU 或 libkrun 后端。跨平台开发时注意后端差异(vsock 通道在 QEMU 上可将热命令延迟从 42ms 降至 1ms)。
⚠️ libkrun 后端尚不支持 pause/resume/snapshots
若需要沙箱暂停/恢复或快照功能,当前只能选 Firecracker 或 QEMU 后端。libkrun 路线图支持这些,但尚未实现。
适用场景
✅ 强隔离需求:AI Agent 执行用户提交的代码、Web 数据转换脚本
✅ 并发沙箱池:每个请求独立 VM,宿主机资源严格隔离
✅ 跨平台代码执行:同一 .smolmachine 包在 macOS/Linux/Windows 均可运行
✅ 需要快照/pause-resume:选 Firecracker 或 QEMU 后端
不适用场景
❌ 超低延迟热路径(P99 < 10ms):VM 启动本身有数百毫秒开销,Docker subprocess 更合适
❌ macOS 上需要 Firecracker:不可用
❌ 需要 pause/resume 但选 libkrun:功能缺失
❌ 纯 Python SDK 生态深度:E2B SDK 支持 Python/TypeScript/Go/Ruby,SmolVM 目前 SDK 相对薄
一句话结论
SmolVM 是 AI Agent 执行非受信代码的实用沙箱方案:以 microVM 替代 Docker,硬件级隔离,冷启动 0.5s–2s(平台相关),支持跨平台打包与快照,Firecracker/QEMU/libkrun 三后端自动切换,私有化部署首选。
核验来源:GitHub README(smol-machines/smolvm)、Celesto AI 官方博客(Firecracker/QEMU/libkrun benchmark,2026-07-11)、mywrittenword.com 技术测评(2026-04-26)、Simon Willison 博客实测(smolvm 1.8.3,2026-08-19)。社区对比数据来自 r/LangChain 2026 年 4 月 benchmark,未能直接访问原始帖,以 mywrittenword.com 转引为准,标注为「原帖主张,未直接核验」。