AI News HubLIVE
站内改写3 分で読了

MicroPythonとWASMを使ったサンドボックスでのPythonコード実行

Simon Willison 氏は、MicroPython を WebAssembly にコンパイルし、wasmtime ランタイム内で実行することでサンドボックス環境を作成する Python ライブラリ micropython-wasm のアルファ版を発表しました。このサンドボックスは、メモリと CPU の制限、ファイル/ネットワークアクセスの制御、ホスト関数のインタラクションを提供し、Datasette のような Python アプリケーションで安全にプラグインコードを実行するニーズに応えます。記事では、ビルドプロセス、永続的なインタプリタ状態、78行のC拡張によるホスト関数、Datasette Agent との統合について詳しく説明しています。

Simon Willison 氏は、コードをサンドボックス内で実行するさまざまな方法を長年実験してきましたが、最新の試みでついに求めるすべての特性を備えたソリューションにたどり着きました。彼は micropython-wasm というアルファパッケージを公開し、それを基に Datasette Agent 用のコード実行サンドボックスプラグイン datasette-agent-micropython を構築しました。

なぜサンドボックスが必要か?

Willison 氏の主要なオープンソースプロジェクト(Datasette、LLM、sqlite-utils)はすべてプラグインをサポートしています。プラグインシステムは新しい機能の試行リスクを最小限に抑える素晴らしい仕組みですが、深刻な欠点があります。プラグインコードはフル権限で実行されるため、バグや悪意のあるプラグインがアプリケーション全体を破壊したり、プライベートデータを漏洩したりする可能性があります。そこで、認可されていないファイルの読み取りやネットワーク接続など、危険な操作を防ぐ環境でプラグインコードを実行したいと考えました。

サンドボックスに求める特性

Willison 氏はサンドボックスに以下の要件を挙げています。依存関係は PyPI からクリーンにインストール可能で(必要ならクロスプラットフォームのバイナリ wheel を含む)、実行コードはメモリと CPU の制限を受け、ファイルアクセスとネットワークアクセスは厳格に制御され、ホスト関数とのインタラクションをサポートし、堅牢で保守・文書化されていること。

WebAssembly の可能性

WebAssembly は当初からこれらの特性を全てサポートするよう設計されており、ブラウザで約10年にわたってテストされています。wasmtime Python ライブラリは活発にメンテナンスされ、バイナリ wheel も提供されているため、理想的な基盤となります。

WebAssembly 上の MicroPython

WebAssembly で Python を実行するには、完全なインタプリタが必要です。Pyodide は優れていますが、ブラウザと Node.js に限定されます。そこで Willison 氏は MicroPython に注目しました。MicroPython はマイクロコントローラや制約のある環境向けに最適化された Python 3 の軽量実装です。WebAssembly はまさに制約のある環境です。

最初のバージョンの構築

Willison 氏は GPT-5.5 Pro で調査を行い、Yamamoto Takahashi 氏による PR(unix ポートへの実験的 WASI サポート)を発見しました。その後、Codex Desktop と GPT-5.5 high に調査ドキュメントを基にプロトタイプを構築させたところ、見事に動作する Python ライブラリができました。

最も難しい課題はインタプリタ状態の永続化でした。WASM ビルドは通常、インタプリタを起動しコードを実行して終了する単一のエントリポイントしか提供しません。しかし Datasette Agent では、複数のコード実行呼び出しにわたって変数や関数をメモリに保持する必要があります。解決策は、MicroPython 内部でループを実行し、ホスト関数 get_next_python_code() を呼び出して次のコードを取得して eval() するというもので、この関数はスレッドとキューを使って新しいコードが利用可能になるまでブロックします。

もう一つの複雑な点はホスト関数のサポートです。Codex は 78 行の C コードでホストモジュールを実装し、それが 362KB の WebAssembly blob にコンパイルされています。Willison 氏は C プログラマではないと述べていますが、複数のモデルにコードを説明させ、徹底的なテストを実施しました。WebAssembly の利点は、C コードに致命的な欠陥があっても、WebAssembly の実行が例外で失敗するだけであり、リスクを許容できる点です。

メモリ制限は wasmtime が直接サポートします。CPU 制限は「燃料」概念で実現し、デフォルトは 2000 万単位ですが、最適な値についてはまだ検討中です。

自分で試す

micropython-wasm アルファ版は PyPI で公開されています。uvx を使えばインストールせずに以下のように実行できます。

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

また、Datasette Agent からも利用可能です。

この「バイブスコード」サンドボックスは信頼できるか?

Willison 氏は、未成熟なサンドボックスライブラリを批判してきたにもかかわらず、自ら構築したことを皮肉に感じています。アルファ版としてリリースし、大きなリスクを取る覚悟のある人以外には推奨していません。しかし自身は十分テストを行い、最初のプラグインを出荷しました。さらに GPT-5.5 xhigh にサンドボックスからの脱出を試みさせましたが、今のところ成功していません。彼は、この実装がプロフェッショナルなセキュリティチームを持つ企業に、Python in WebAssembly をサンドボックスアプローチとして採用し、自社のソリューションをオープンソース化するきっかけとなることを期待しています。