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