MicroPython と WASM を活用したサンドボックス環境での Python コードの実行

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) の利点
    • ブラウザで長期間テストされており、安定性が高い。
    • wasmtime
      Python ライブラリは活発にメンテナンスされ、バイナリホイールが提供されています
  • 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()
      でキューにメッセージを送信する仕組みを導入。
  • 内部ロジック:
    1. WebAssembly 内の MicroPython インタプリタは
      __session_next__()
      関数を呼び出し、次のコードブロックを待つ(ブロック)。
    2. ホスト側でコードを取得し、
      eval()
      で実行。
    3. 正常終了時は
      __session_result__({"id": request_id, "ok": True})
      を発行。

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
ログインが必要です。

まとめ:このサンドボックスを信用すべきか?

不成熟なライブラリへの不満を持っていた私が、ついに独自構築のサンドボックスを公開するのは皮肉ですが、現実的な選択です。

  • 現状: 重大なリスクを受け入れられない方へは未だ推奨できません(アルファ版のため)。
  • 自己検証: 十分なテストにより、自分自身での使用には問題ないと確認済み。
  • 実証:
    datasette-agent-micropython
    で GPT-5.5 xhigh を固定し、サンドボックスからの脱出を試みたが成功していない
  • 展望: 専門的なセキュリティチームがいる企業向けに説得力のある Open Source 解決策として採用されれば幸いです。

同じ日のほかのニュース

一覧に戻る →

2026/06/07 4:17

Ntsc-rs ~アナログテレビおよびVHS のアーティファクトを模倣するオープンソースのビデオエミュレーター~

## 日本語翻訳: ntsc-rs は、単純なカラーフィルターではなく、実際の送信符号化の原理に基づいた高度なアルゴリズムを使用して、ヴィンテージ NTSC テレビと VHS テープのアートファクトを本物らしく再現する無料のオープンソースツールです。マルチスレッドおよび SIMD 加速を実現した Rust で構築されており、超標準解像度でもリアルタイムで動画を処理し、ntscQT といった旧来のツールよりも優れたパフォーマンスを発揮します。そのアルゴリズムは composite-video-simulator、zhuker/ntsc、および ntscQT で開発されたものを採用しています。独立したアプリケーション、ウェブプラットフォーム、または Adobe After Effects、Premiere Pro、DaVinci Resolve、Hitfilm、Vegas(すべての OpenFX ソフトウェアと互換性あり)用のプラグインとして利用可能であり、歴史的正确性と現代の効率性を兼ね備えており、クリエイターがリアルなアナログの美学を現代的なワークフローに直接統合できるよう支援します。

2026/06/07 3:35

Meta、AI チャットボットの悪用によるInstagramアカウントの乗っ取りが数千件あったと確認

## Japanese Translation: Metaは、ハッカーがAIチャットボットのバグを悪用し、Instagramのアカウント20,000個以上を乗っ取ったという重大なセキュリティ不備を公表しました。このシステムは、パスワードリセット用として設計されたものの、誤って認証コードを受け取るメールアドレスを登録済みのアカウント所有者に限定せず、任意のメールアドレスに入力した者に送信してしまっていました。これにより、無許可ユーザーが数日以内にして完全なアクセス権を引き渡すことができました。脆弱性は二段階認証を行っていないアカウントを狙い、4月中旬から最近まで活性していました。 この侵害事件は、人工知能(AI)に対する大幅な投資が行われている時期に発生しており、人員削減を踏まえ、イノベーションとセキュリティのバランスに関する懸念が浮上しています。Metaはこの乗っ取られたボットを停止し、コードを修正済みですが、同社は直接メッセージやプロフィール情報など機密データの暴露があったことを認めています。メイン州在住の30人が直接通知を受けたものの、同社は犯罪者がアクセスした個人データ総量について現在把握していないと確認しています。専門家は、この事件がAIの急速な展開に伴う重大なリスクを浮き彫りにしているとし、ユーザーに対して即時にパスワードのリセットと、認証済みチャネル経由での再認証を行ってアカウントのセキュリティを回復するよう求めており、またMetaは同様の再発を防ぐため、現在自社プラットフォーム上の他のチャットボットの調査を進めています。

2026/06/06 23:59

Zeroserve:eBPF を用いてスクリプト可能なゼロ設定 Web サーバー

## 日本語訳: ゼロサーブ(Zeroserve)は、最小限のセットアップで静的ファイルを配信できる軽量かつ高性能な HTTPS サーバーです。各サイトごとに単一のタールアーカイブのみを用いて動作を開始できます。改行・認証・レート制限・リバースプロキシなどの機能を実装するサンドボックス化されたミドルウェアとしてユーザー空間で動作する eBPF プログラムをサポートしています。パフォーマンスの主な特徴は、io_uring I/O インターフェースと即時コンパイル(Just-In-Time コンパイル)された eBPF スクリプトによる卓越したシングルスレッド速度です。Ryzen 7 3700X ベンチマークでは、小規模ファイルにおいて nginx を約 17% 上回り、Caddy よりも大幅に高性能であることが示されました。そのアーキテクチャはバイナリコードを共有する複数プロセスの並列実行によりスケールし、各インスタンスはシングルスレッドモデルの monoio ランタイムを使用します。BoringSSL を用いた高度な TLS 機能もサポートしており、TLS 1.3、暗号化された ClientHello(ECH)、SNI サーティフィケート選択、JA4 フィンガープリント、および ECH リレーモードを含みます。運用上の利点として、原子スワップ(SIGHUP)によるホットリロードやダウンタイムなしの瞬時の構成更新が可能です。eBPF プログラミングモデルは、ヘッダー操作やテンプレート置換を行うために共有されるパーリクエストメタデータマップを持つ、ファイル名順ソートされたスクリプトチェーンを使用します。ヘルパー関数はリクエスト検査・変異、暗号処理(SHA-256、HMAC、base64)、JSON 処理、トークンバケット方式のレート制限、AWS SigV4、および XChaCha20-Poly1305 クッキーを用いた OIDC ログインをカバーします。デフォルト設定では eBPF インスタンスあたりのメモリ使用量の上限が 256 KB で、他の接続を止めることを防ぐためにプリエンプト間隔は 2 ms に設定されています。この間隔を増やすことで動的レスポンスのスループットをさらに向上させることが可能です。リバースプロキシとしての性能では、プーリングされた io_uring コネクションを用いて小規模応答において最先端の速度を発揮し、大規模ボディにおいては nginx と競合するレベルのパフォーマンスを示します。全体として、このサーバーは Lua や Perl などの遅いインタプリターに依存せず、ユーザー空間内で直接低レイテンシーとより細かいセキュリティ制御を提供します。

MicroPython と WASM を活用したサンドボックス環境での Python コードの実行 | そっか~ニュース