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 作為沙箱方案,並開源他們的解決方案。