
2026/06/06 23:15
MicroPython と WASM を活用したサンドボックス環境での Python コードの実行
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
2026 年 6 月 6 日、著者が未検証コード(大規模言語モデルや
sqlite-utils などのユーティリティを含む)を厳格なサンドボックス内で安全に実行するための アルファ版パッケージ micropython-wasm をリリースしました。このツールは、GPT-5.5 Pro、Codex Desktop、および Yamamoto Takahashi氏による WASI サポートに関する PR に基づく研究成果を活用し、MicroPython を WebAssembly と組み合わせて wasmtime ランタイムを用いて実装しています。セキュリティを確保し、フルなホスト権限付与なしにデータ漏洩やシステムクラッシュを防ぐため、以下の厳格な制御が施されています:クリーンな PyPI 依存関係、メモリ/CPU の制限(wasmtime の「燃料」機能によりデフォルトで 2,000 万回の操作に設定)、厳密なファイルアクセス制御、および制御されたネットワークアクセス。ホスト関数は、78 行の C コードで実装され、362KB の WebAssembly ビlob にコンパイルされたものを使って公開されており、ホスト機能とのシームレスな統合を可能にしつつも隔離性を維持しています。
MicroPython が選択されたのは、WebAssembly 内での制約環境に適合する性質が理由です。一方、JavaScript エンジンではなく WebAssembly(
wasmtime を通じて)が選ばれたのは、優れた保守性と組み込み可能性のためです。実装では MicropythonSession クラスを用いてスレッドとキューを介して永続的なインタプリタ状態を管理しています。テスト結果により、GPT-5.5 xhigh がサンドボックスからの脱出を試みたが、現在の試行では失敗していることが示されています。
本プロジェクトには Datasette Agent プラグインである
datasette-agent-micropython が含まれており、α版パッケージは PyPI で利用可能です。CLI(例:uvx micropython-wasm)を通じて直接アクセスするか、Datasette Agent として使用することで、強力なユーティリティを既存のデータスタックに安全に統合しつつ、マルウェアや誤ったコードの実行に対するシステムの完全性を維持することが可能になります。本文
WebAssembly による安全な Python サンドボックスの構築と公開
数年来、サンドボックス内でのコード実行方法を模索していましたが、今回の試みが長らく求められていた要件をすべて満たす成果となりました。これは「micropython-wasm(アルファ版)」としてリリースし、「datasette-agent-micropython」プラグイン内で使用しています。
なぜサンドボックスが必要なのか
主なオープンソースプロジェクト(Datasette, LLM, sqlite-utils など)はプラグインをサポートしており、慎重に設計されたシステムはリスクをゼロに近づけます。朝まで新機能を追加でき、プルリクエストの確認さえ不要です。
- 現在の課題: プラグインは Python と Pluggy を使用し、完全な権限で実行されます。
- 脆弱性の多いマルウェアや悪意あるプラグインがシステムを崩壊させたり、機密情報を漏洩したりする恐れがあります。
- 望ましい挙動: プラグイン風コードを実行しつつも、以下の制限を加える必要があります。
- 未承認ファイルへの読み取り不可
- ネットワーク接続不可
- 有害な動作全般の防止
- 利用シーン: コード実行が必要な機能のサポート。
- テーブル内の値をコードで変換(Datasette Enrichments の実験)
- 承認済み JSON からデータを取得し、辞書形式に変換後、SQLite に挿入
私がサンドボックスに求める要件
自社の Python アプリケーション内で安全にコードを実行するために、以下の条件が必須です。
- 依存関係
- PyPI でクリーンにインストール可能。
- 必要に応じてマルチプラットフォーム対応のバイナリホイールを含める。
- 追加の手順(手動でのライブラリ設置など)は不要。
- 制限 (Limits)
- メモリーと CPU の両方に制限を課す。
- 無限ループ (
) によるクラッシュを防ぐ。while True
- ファイルへのアクセス
- 厳密な制御、または完全なファイルシステムの無効化。
- どのファイルを読み書きできるかの定義が必要。
- ネットワークへのアクセス
- ホストの管理するレイヤーを経由せず外部と通信できないように制限。
- 対話機能
- ホスト関数との相互作用をサポート(プラットフォーム機能を適切に暴露)。
- 信頼性
- ロバストでサポートがあり、明確なドキュメントが必要。
- メンテナンスが続けられていること。
WebAssembly が最適な理由
Web ブラウザは悪意のあるコードと対峙する過酷な環境であり、JavaScript エンジンはサンドボックスとして有力ですが、複雑すぎて他プロジェクトへの埋め込みが困難です。V8-in-Python 系プロジェクトも更新が遅く、不信任コードとの併用には注意が必要です。
- WebAssembly (Wasm) の利点
- ブラウザで長期間テストされており、安定性が高い。
Python ライブラリは活発にメンテナンスされ、バイナリホイールが提供されています。wasmtime
- Python 実装の課題
- Rust など静的言語は直接コンパイルしやすいが、動的言語(Python)はランタイムが必要なため困難。
はブラウザ向けだが、サーバーサイドでの利用はサポートされていない。Pyodide
WebAssembly 内での MicroPython 選定理由
MicroPython は「軽量で効率的な実装」であり、標準ライブラリの一部を備え、制約のある環境(WebAssembly)への最適化が可能です。
MicroPython は Python 3 プログラミング言語の軽量で効率的な実装であり、Python 標準ライブラリのサブセットを含み、マイクロコントローラーや制約のある環境での実行に最適化されています。
第 1 バージョンの開発工程
GPT-5.5 Pro を用いた調査により、Yamamoto Takahashi 氏の MicroPython WASI サポート PR が発見されました。これを基に以下が構築されました。
- 初期実装: research.md に基づき、独自版 MicroPython の WebAssembly コンパイルスクリプトを作成。
ディレクトリからコードを取得する仕組みを実装。/tmp
- 永続化インタープリタの課題解決:
- 単一エントリーポイント(起動→実行→停止)ではメモリの再利用が困難。
- スレッドを起動し、リクエストキューを設定。
でキューにメッセージを送信する仕組みを導入。session.run()
- 内部ロジック:
- WebAssembly 内の MicroPython インタプリタは
関数を呼び出し、次のコードブロックを待つ(ブロック)。__session_next__() - ホスト側でコードを取得し、
で実行。eval() - 正常終了時は
を発行。__session_result__({"id": request_id, "ok": True})
- WebAssembly 内の MicroPython インタプリタは
Python での使用例
from micropython_wasm import MicroPythonSession with MicroPythonSession() as session: # 変数の設定と出力 print(session.run("x = 10\nprint(x)").stdout) # 算術演算 print(session.run("x += 5\nprint(x)").stdout) # 演算結果の出力 print(session.run("print(x * 2)").stdout)
ホスト関数の暴露 (C コードによる実装)
プラグインから呼び出されるホスト関数を安全に暴露するために、Codex が 78 行の C コード で解決しました。これにより約 362KB の WebAssembly バインディングが生成されています。
- リスク: C コードへの依存ですが、最悪の結果は WebAssembly 実行失敗のみであり、受け入れるレベルです。
リソース制限の設定
- メモリー:
が直接サポート。wasmtime - CPU (燃料): wasmtime は「燃料 (fuel)」という仕組みを提供し、呼び出し可能な操作数を制限できます。
- 現在デフォルト設定を 2,000 万 に experimenting し、最適値を探る段階です。
ご自身でお試しください
micropython-wasm(アルファ版) は PyPI で利用可能です。README を参照してください。また、バージョン 0.1a2 では CLI モードが追加されました。
コマンドラインでの試行
# 基本動作の確認 uvx micropython-wasm -c 'print("Hello world")' # 燃料切れ時の挙動 (無限ループによる除外) uvx micropython-wasm -c 's = ""; while True: s += "longer"' # 出力結果:micropython-wasm: guest exited with code 1
Datasette Agent での試行
以下のコマンドでプラグインを組み合わせた環境を作成します。
uvx llm keys set openai # OpenAI キーを貼り付け後、以下を実行 uvx --with datasette-agent \ --with datasette-agent-micropython \ --prerelease allow \ datasette --internal internal.db \ -s plugins.datasette-llm.default_model gpt-5.5 \ --root -o
アクセス後、以下のプロンプトを入力すると動作確認が可能です。
micropython の例を見せてください
ライブデモは GitHub アカウントでの
agent.datasette.io ログインが必要です。
まとめ:このサンドボックスを信用すべきか?
不成熟なライブラリへの不満を持っていた私が、ついに独自構築のサンドボックスを公開するのは皮肉ですが、現実的な選択です。
- 現状: 重大なリスクを受け入れられない方へは未だ推奨できません(アルファ版のため)。
- 自己検証: 十分なテストにより、自分自身での使用には問題ないと確認済み。
- 実証:
で GPT-5.5 xhigh を固定し、サンドボックスからの脱出を試みたが成功していない。datasette-agent-micropython - 展望: 専門的なセキュリティチームがいる企業向けに説得力のある Open Source 解決策として採用されれば幸いです。