Mozilla HacksのStandardizing WASI: A system interface to run WebAssembly outside the webを読みました。WASIは、WebAssemblyをブラウザの外でも安全に動かすためのシステムインターフェースを標準化しようとする取り組みです。
WebAssemblyは、もともとWebページ内で高速にコードを実行するための技術として広まりました。ただ、WebAssemblyの特徴である安全なサンドボックス、移植性、コンパクトなバイナリ形式は、ブラウザ外でも役立ちます。問題は、ファイル、ネットワーク、時刻、乱数のようなシステム機能へどう安全にアクセスするかです。WASIは、その境界を設計するための標準です。
記事の要点
- WASIは、WebAssembly System Interfaceの略で、WebAssemblyプログラムがOSの機能へアクセスするための標準化されたインターフェースです。
- 従来のシステムコールをそのままWebAssemblyへ渡すのではなく、移植性と安全性を保ちながら、必要な権限だけを渡すことを目指しています。
- 記事では、wasmtimeやLucetのようなブラウザ外WebAssemblyランタイム、ブラウザ用polyfillが初期実装として紹介されています。
- WASIはcapability-based securityを重視します。たとえば、プログラムへファイルシステム全体ではなく、特定ディレクトリへの権限だけを渡す考え方です。
- Emscriptenのような既存の移植手法とは異なり、WASIは各環境ごとにOSをエミュレートするのではなく、共通の低レベル標準を作ろうとしています。
- wasi-sysrootやlibpreopenのような部品は、既存言語やC/C++プログラムをWASI上で扱うための基盤です。
参照リンクから見えたこと
WASI.devを見ると、WASIは今も「securely access operating system capabilities」という方向で説明されています。WebAssemblyの安全な実行モデルを、ブラウザ外のCLI、サーバー、プラグイン、エッジ環境へ広げるための土台です。
記事中のwasmtimeやLucetは、WebAssemblyを単なるブラウザ機能ではなく、独立した実行環境として扱う流れを示しています。後のBytecode AllianceやサーバーサイドWasmの流れを考えると、この記事はかなり早い段階でその方向を説明していました。
また、Mozilla HacksのWebAssembly modulesの記事では、WebAssemblyが概念上の機械向けアセンブリとして説明されています。WASIは、その概念機械が外部世界とやり取りするときの標準的な窓口を決める話だと捉えると分かりやすいです。
気づき
今回の気づきは、WASIの本質が「WebAssemblyをOSっぽく便利にする」ことではなく、「OSへ触れる境界を最初から権限ベースで作り直す」ことにある点です。既存のアプリを動かすために何でも許すのではなく、必要な能力だけを明示的に渡す。この発想があるから、WebAssemblyをブラウザ外へ出しても安全性の物語を保てます。

コメントを残す