Mozilla HacksのWebAssembly and Back Again: Fine-Grained Sandboxing in Firefox 95を読みました。Firefox 95で、RLBoxという細粒度サンドボックス技術を全対応プラットフォームへ広げ、Graphite、Hunspell、Oggなど複数のモジュールを隔離したという記事です。
Firefoxの防御には、Site IsolationやProcess Isolationのようにプロセス単位で境界を作る方法があります。ただし、小さなC/C++ライブラリをすべて別プロセスへ移すのは現実的ではありません。メモリコストも、非同期化の手間も大きくなります。RLBoxは、その隙間を埋めるために、同じプロセス内でライブラリだけを信頼しないコードとして扱う仕組みです。
記事の要点
- Firefox 95では、RLBoxを使ったサンドボックスがデスクトップとモバイルを含む全対応プラットフォームへ広がりました。
- Firefox 95ではGraphite、Hunspell、Oggが対象になり、ExpatとWoff2はFirefox 96で対象になると説明されています。
- RLBoxは、対象ライブラリをWebAssemblyへコンパイルし、さらにネイティブコードへ戻すことで、通常のFirefoxビルドに組み込みます。Firefoxが
.wasmファイルを配布するわけではありません。 - WebAssemblyを中間表現として使うことで、隔離されたコードが予期しない場所へジャンプしたり、許可された領域外のメモリへ触れたりできないようにします。
- サンドボックス内から返ってくる値は攻撃者に操作されている可能性があるため、RLBoxはtainting layerで境界を明示し、ホスト側コードに検証を促します。
- プロセス分離では重すぎるXMLパーサーやフォント・圧縮・メディア関連ライブラリのような部品に、より細かい隔離を適用できるのが狙いです。
参照リンクから見えたこと
RLBox公式ドキュメントを見ると、RLBoxはC++側から第三者Cライブラリを安全に呼び出すためのツールキットとして整理されています。単にメモリ隔離するだけでなく、サンドボックスをまたぐ関数呼び出し、コールバック、値の検証をAPIとして扱えるようにしている点が重要です。
以前のMozilla Hacks記事Securing Firefox with WebAssemblyでは、Graphiteを対象にしたプロトタイプ的な導入が説明されていました。今回の記事はその続きで、GraphiteだけでなくHunspell、Ogg、Expat、Woff2へ対象を広げる段階です。
また、wasm2cを使ってWebAssemblyからCへ戻し、既存のClang中心のビルドやプロファイルガイド最適化、クラッシュレポート、デバッグ、ソース検索へ乗せやすくしている点も面白いところです。WebAssemblyをランタイム機能ではなく、ビルドパイプライン上の隔離用IRとして使っているわけです。
気づき
今回の気づきは、WebAssemblyの価値が「ブラウザ上で別言語を動かす」だけに限らないことです。この記事では、WebAssemblyは配布形式ではなく、既存C/C++ライブラリを安全な形へ変換する中間表現として使われています。つまりRLBoxは、古いコードを全部Rustへ書き換える前に、信頼境界を先に作るための現実的な道具になっています。

コメントを残す