AI News HubLIVE
站内改写2 分钟阅读

使用MicroPython和WASM在沙箱中运行Python代码

Simon Willison 发布了 micropython-wasm 的 alpha 版本,这是一个将 MicroPython 编译为 WebAssembly 并通过 wasmtime 运行在沙箱中的 Python 库。该沙箱提供了内存和 CPU 限制、受控的文件和网络访问以及主机函数支持,旨在安全地执行插件代码。文章详细介绍了构建过程、持久化解释器状态的实现、主机函数的 C 扩展,以及如何在 Datasette Agent 中使用。

Simon Willison 一直在探索在沙箱中运行代码的不同方法,他的最新尝试终于找到了一个具备所有期望特性的方案。他发布了名为 micropython-wasm 的 alpha 包,并基于此构建了用于 Datasette Agent 的代码执行沙箱插件 datasette-agent-micropython。

为什么需要沙箱?

Willison 的开源项目——Datasette、LLM、sqlite-utils——都支持插件。插件系统虽然能极大降低尝试新功能的风险,但一个关键缺陷是:插件代码以完全权限运行,错误或恶意的插件可能破坏整个应用或泄露数据。因此,他希望有一个环境,使插件代码无法读取未授权的文件、连接网络,或进行其他危险操作。

沙箱的期望特性

Willison 列出了沙箱所需的关键特性:依赖项必须能通过 PyPI 简洁安装(包括跨平台的二进制 wheel);执行代码必须受内存和 CPU 限制;文件访问需严格受控;网络访问同样受控;必须支持与主机函数的交互;并且要健壮、有维护和文档。

WebAssembly 的潜力

WebAssembly 被设计为支持所有上述特性,并在浏览器中经过近十年的测试。wasmtime Python 库活跃维护且提供二进制 wheel,因此成为理想的基础。

MicroPython 在 WebAssembly 中

为了在 WebAssembly 中运行 Python,需要一个完整的解释器。Pyodide 虽然优秀,但仅支持浏览器和 Node.js。Willison 转向了 MicroPython——一个为微控制器和受限环境优化的 Python 3 实现。WebAssembly 无疑是一个受限环境。

构建第一版

Willison 使用 GPT-5.5 Pro 进行研究,发现了 Yamamoto Takahashi 的 PR(为 unix 端口提供实验性 WASI 支持)。随后他让 Codex Desktop 和 GPT-5.5 high 根据研究文档构建原型。最终成功得到了一个原型 Python 库,能够在 WebAssembly 沙箱中执行 Python 代码。

最棘手的问题是解释器状态的持久化。WASM 构建通常只提供单次入口点,运行完代码就停止。但对于 Datasette Agent,需要跨多次执行保持变量和函数。解决方案是:在 MicroPython 内部运行一个循环,调用主机函数 get_next_python_code() 获取下一段代码并 eval(),该函数通过线程和队列阻塞等待新代码。

另一个复杂点是支持主机函数。Codex 用 78 行 C 代码实现了主机模块,编译后成为 362KB 的 WebAssembly blob。Willison 强调自己不是 C 程序员,但通过了多种测试,且 WebAssembly 的异常安全性降低了风险。

内存限制由 wasmtime 直接支持;CPU 限制则通过“燃料”概念实现,默认设为 2000 万单位,但 Willison 认为该值仍需调整。

亲自尝试

micropython-wasm alpha 已发布在 PyPI 上。用户可通过 uvx 无需安装直接运行:

uvx micropython-wasm -c 'print("Hello world")'

也可以在 Datasette Agent 中使用。

信任问题

Willison 承认自己曾批评其他沙箱项目不成熟,现在自己却构建了一个。他特意打了 alpha 标签,不推荐冒大风险使用。但他自己已经足够信任,并发布了第一个集成插件。他还用 GPT-5.5 xhigh 尝试逃脱沙箱,至今未成功。他期望这个实现能鼓励有专业安全团队的公司采用 Python in WebAssembly 作为沙箱方案,并开源他们的解决方案。