Show HN:使用 WebAssembly 沙盒化不受信任的程式碼

Hacker News·

一位開發者利用 WebAssembly (Wasm) 和 WASI 建構了一個運行時,用於沙盒化不受信任的程式碼,透過控制 CPU、記憶體和檔案系統存取等資源來保護主機系統。該專案為 Python 和 TypeScript 提供了 SDK,以促進慣用語的整合。

背景

Capsule 是一款基於 WebAssembly (Wasm) 技術開發的沙盒執行環境,旨在為 Python 與 TypeScript 提供一個安全且受控的隔離空間,用以執行不可信的程式碼。開發者透過 Rust 構建核心,並利用 WASI 0.2 與組件模型(Component Model)來精確控制 CPU、記憶體及檔案系統權限,特別針對 AI Agent 執行動態程式碼或 LeetCode 類型的程式競賽平台提供資源限制與安全保障。

社群觀點

在 Hacker News 的討論中,社群對於 Capsule 採用的技術路徑展現出濃厚興趣,但也針對其實現方式與相容性提出了不少質疑。許多討論聚焦於 Python 的 C 擴充套件(C extensions)支援問題。部分評論者指出,Python 之所以強大是因為擁有如 Pandas 等第三方套件,但這些套件通常包含 C 語言綁定,在目前的 Wasm 組件模型下難以直接運行。對此,有觀點認為與其強求 Python,不如直接讓 AI 模型撰寫 JavaScript 可能更為實際。不過,知名開發者 Simon Willison 補充道,Pyodide 已經證明在 Wasm 中運行 Pandas 是可行的,關鍵在於如何將 C 擴充套件編譯並封裝進 Wasm 檔案中。開發者則回應,目前 Capsule 遵循標準 WASI 路徑而非 Emscripten,因此在動態連結上尚不如 Pyodide 成熟,但隨著 WASI 0.3 的推進,跨語言組件的整合預計會更加完善。

關於 API 設計,Capsule 使用的裝飾器(Decorator)語法引發了正反兩面的評價。支持者認為這種設計非常符合 Python 的習慣,類似於 Modal 等現代雲端基礎設施的調用方式。然而,Simon Willison 則表達了安全上的疑慮,他認為裝飾器語法雖然簡潔,卻可能讓開發者混淆哪些程式碼是在主機運行、哪些是在沙盒內運行。他建議若能將沙盒程式碼獨立為單獨的檔案,在信任審查上會更加清晰。開發者對此表示認同,並考慮在未來版本中加入直接執行獨立檔案的功能。

此外,針對 AI Agent 的應用場景,社群成員關心如何處理動態生成的程式碼。開發者解釋,Capsule 的運作機制是在 Wasm 沙盒內運行一個解釋器(如 JavaScript 的 StarlingMonkey),這意味著每個沙盒都擁有專屬的引擎來執行 eval 操作,從而實現完全的邏輯封裝。也有討論提到,除了目前的運算與記憶體限制外,未來若能加入網路存取限制,將能更有效地防止 AI Agent 進行惡意的循環請求或大量數據下載。最後,有技術深度的評論者分析了底層實現,指出將 CPython 交叉編譯為 Wasm 組件雖然技術上令人印象深刻,但在處理複雜類型傳遞(如字串 ABI)時仍存在不便與效能挑戰,這也是 Wasm 組件模型目前亟需克服的痛點。

延伸閱讀

  • componentize-py:將 Python 程式碼編譯為 WebAssembly 組件的工具。
  • jco:用於 WebAssembly 組件的 JavaScript 工具鏈。
  • Pyodide:將 Python 科學運算堆疊(包含 NumPy、Pandas 等)帶入瀏覽器的專案。
  • StarlingMonkey:在 Wasm 中運行的 JavaScript 引擎,用於 Capsule 的動態執行。
  • Modal:一種新興的 Python 開發框架,提供類似的裝飾器語法來調用遠端運算資源。
  • just-bash:Vercel 實驗室推出的專案,提供另一種沙盒化執行環境的思考方向。

Hacker News

相關文章

  1. Rust 編寫 WebAssembly 的實戰筆記

    大約 2 個月前

  2. Pyodide:基於 WebAssembly 的 Python 發行版

    大約 1 個月前

  3. 讓我們來探討沙盒隔離技術

    大約 2 個月前

  4. 讓 WebAssembly 成為 Web 平台的一等公民語言

    大約 1 個月前

  5. Edge.js:在 WebAssembly 沙箱中執行 Node 應用程式

    大約 1 個月前