Simon Willison 这次发布的东西不大,但卡在一个很要命的位置:Python 插件怎么安全运行。
他做了一个 alpha 包 micropython-wasm,把 MicroPython 编译成 WebAssembly,再通过 wasmtime 嵌进 Python 应用里跑。这个包已经用在 Datasette Agent 的插件 datasette-agent-micropython 里。
反常点在这里:Python 很适合做插件,也很不适合做沙箱。插件一旦在宿主应用里跑起来,通常就有完整权限。能读文件,能连网络,也可能泄露数据、拖垮进程。
这不是理论洁癖。对插件系统和 AI Agent 来说,代码执行能力越强,安全边界越不能靠“相信作者”和“相信模型”。
它解决的是插件权限,不是完整 Python 运行时
micropython-wasm 的目标很清楚:在 Python 应用里跑一小段受控代码。
它不是把 CPython 原样塞进沙箱。MicroPython 是 Python 3 的轻量实现,标准库和运行能力是子集。适合小脚本、数据转换、受限逻辑,不适合拿来跑完整 Python 生态。
核心取舍可以压成一张表:
| 问题 | 普通 Python 插件的风险 | micropython-wasm 的处理 |
|---|---|---|
| 安装 | 依赖复杂会劝退用户 | 依赖 wasmtime,PyPI 有 binary wheels |
| 执行权限 | 插件常拿宿主完整权限 | 代码跑在 WASM 里的 MicroPython |
| 内存 | 恶意或错误代码可能拖垮进程 | wasmtime 支持内存限制 |
| CPU | 死循环不好收 | wasmtime 用 fuel 限制执行量 |
| 文件/网络 | 默认能力太危险 | 通过宿主控制,没开放就不能用 |
| 宿主交互 | 沙箱太封闭就没产品价值 | 用 host functions 精准开口 |
这里最重要的不是“WASM 天然安全”。这句话太粗。
WASM 的好处是边界清楚。内存怎么限,能力怎么暴露,宿主函数给不给,至少能被设计、配置和测试。过去很多 Python 插件系统的问题,是边界根本没摆上桌。
Pyodide 没被选中,也不奇怪。它很强,但主要面向浏览器和 Node.js。原文提到,作者能找到的最新建议仍是:Pyodide 由 Emscripten 工具链构建,只能跑在浏览器或 Node.js。服务器端 Python 嵌入场景,不是它的主场。
MicroPython 反而合适。它本来就为受限环境设计。WebAssembly 在这里也像一个受限环境。
对 Python 插件开发者来说,这意味着一个现实动作:如果你只是想让用户写小段转换逻辑、调度脚本、Agent 工具函数,可以开始观察这条路线。别急着迁移生产系统,但可以把“WASM + 轻量解释器”列进技术预研。
真正的工程亮点,是把沙箱做成可用的笼子
把解释器编进 WASM,只是第一步。
Willison 碰到的难点是会话状态。普通 WASM 入口跑完就停。但 Agent 场景需要变量和函数留在内存里。上一段代码定义的东西,下一段还得能用。
他的做法有点土,也有效:宿主侧开线程和队列;MicroPython 里通过 host function 等下一段代码;拿到后 eval 执行;执行完再把结果传回宿主。
这让代码可以像会话一样运行:先设 x = 10,下一次还能 x += 5。
另一个关键点是 host functions。项目里用了 78 行 C,把宿主函数能力编进一个 362KB 的 WebAssembly blob。
这个细节决定了它不是玩具。
完全隔绝的沙箱很安全,也很没用。产品里真正需要的是“能开洞,但每个洞都要可控”。比如只允许读取某个文件,只允许请求某个批准过的 JSON 地址,只允许调用某个数据库写入函数。
问题也在这里回来。
“利之所在,弊亦随之。”host function 暴露什么、参数怎么校验、异常怎么处理,都会变成攻击面。WASM 负责把笼子搭出来,但钥匙怎么发,还是宿主应用自己的责任。
这也是它和一些替代路线的差别:
| 路线 | 优点 | 现实约束 |
|---|---|---|
| 直接跑 Python 插件 | 生态完整,开发快 | 权限边界弱,风险大 |
| 浏览器/Node.js 里的 Pyodide | Python 能力强,生态成熟 | 不适配服务器端 Python 嵌入场景 |
| 系统级容器/进程隔离 | 隔离强,工程经验多 | 部署重,插件体验不轻 |
| MicroPython + WASM | 轻、可嵌入、边界清楚 | 不是完整 CPython,安全仍需审计 |
所以它最适合的不是“跑任何 Python 代码”。
更适合这些场景:小段数据处理、受控插件逻辑、Agent 调用的工具函数、定时抓取批准来源后做格式转换。原文里提到的例子,就是从批准位置抓 JSON,跑一点代码整理成字典列表,再插入 SQLite 表。
不适合的场景也要说清:复杂依赖、完整 Python 标准库、需要大量第三方包、强安全承诺的多租户生产环境。至少现在不适合。
方向对,但安全账还没结
我更愿意把 micropython-wasm 看成行业信号,而不是现成答案。
它说明 Python 插件生态终于摸到一条相对干净的沙箱路径:用 WASM 做执行边界,用 MicroPython 承担轻量代码,用 wasmtime 管资源,再通过 host functions 开受控能力。
这条路比“插件作者不会乱来”靠谱。
但它离“可托付生产”还差几笔硬账。
作者自己也说得很清楚:这是 alpha。他不建议风险偏好低的人使用。这个项目还带着明显的个人原型色彩,甚至有大量 AI coding agent 参与构建。
这不丢人。真正重要的是别把原型当证明。
CPU 限制就是一个例子。wasmtime 的 fuel 概念适合限制执行量,但单位不直观。作者现在实验的默认值是 2000 万 fuel,他自己也不确定是不是合适。
GPT-5.5 没能越狱,也只能说明这轮攻击没打穿。它不是安全审计。不是形式化证明。更不是生产背书。
如果一个团队真要评估这条路线,我会看四件事:
- 默认权限是不是足够保守,文件和网络是否默认关闭;
- host functions 是否少到不能再少,参数校验是否清楚;
- CPU、内存、输出大小、执行时间是否都有上限;
- 是否有人做过独立安全审计,维护节奏是否稳定。
对 Agent 工具开发团队来说,下一步不是立刻把生产插件迁进去。更现实的做法是拿低风险任务试水:数据清洗、格式转换、内部 demo、无敏感数据的插件实验。
对安全要求高的团队,结论更简单:观望,等审计,或者自己投入安全团队做验证。
这件事的历史感很强。早期浏览器也不是因为“脚本方便”才真正长大,而是因为它们学会了在敌意代码里建立边界。插件和 Agent 现在走到类似位置,但不完全一样:浏览器沙箱经过了多年攻击和修补,micropython-wasm 还只是一个聪明原型。
主线还是那句:代码执行能力会变得越来越便宜,安全边界会变得越来越贵。
模型越会写代码,平台越想让代码自动跑。沙箱就不是高级功能,而是地基。地基靠运气,楼越高,越心虚。
