Mozilla Hacksの「Securing Firefox with WebAssembly」は、2020年2月25日に公開された記事です。テーマは、Firefoxに組み込まれているC/C++製ライブラリを、WebAssemblyとRLBoxで軽量に隔離する取り組みです。
ブラウザは巨大なアプリケーションですが、内部には画像、動画、フォント、圧縮などを扱う多数のライブラリが組み込まれています。Firefoxも例外ではなく、記事では複雑なフォント描画に使われるGraphiteを例に、サードパーティライブラリのメモリ安全性がブラウザ全体のリスクにつながる問題を取り上げています。
Rust化やプロセス分離だけでは届きにくい領域
Mozillaはこれまでも、危険な処理を別プロセスへ分けるサンドボックス化や、Rustのような安全な言語への置き換えを進めてきました。ただし、すべての既存C/C++コードを書き換えるのは現実的ではなく、小さなライブラリごとに専用プロセスを用意するのもコストが大きくなります。
そこで記事が紹介しているのが、RLBoxを使って既存ライブラリをWebAssemblyサンドボックス内で動かす方法です。C/C++コードをWasmへコンパイルし、Firefoxのビルド時にネイティブコードへ変換することで、実行時の安全な境界を作りながら、既存コードを大きく書き換えずに扱えるようにしています。
境界を越える値を「信用しない」設計
面白いのは、RLBoxが単にライブラリを隔離するだけでなく、サンドボックスから返ってきた値をそのまま信用しないようにC++の型レベルで扱う点です。サンドボックス内のコードが侵害されている可能性を前提に、戻り値やポインタを「tainted」な値として扱い、ホスト側で検証してから使う流れを強制します。
この仕組みにより、開発者の注意力だけに頼らず、境界を越えたデータの取り扱いをコード上で明示できます。RLBox公式ドキュメントでも、メモリ隔離と境界通過の明示化が中心的な役割として説明されていました。
関連リンクから見えた背景
RLBox公式ドキュメントでは、この技術がFirefox向けに始まり、既存のCライブラリをC++アプリケーションから安全に使うためのツールキットとして整理されています。手作業で境界処理を追加する方法は煩雑で間違いやすいため、RLBoxは隔離の低レベルな詳細を隠し、アプリケーション固有の検証に集中できるようにする狙いがあります。
また、USENIX Security 2020の論文ページでは、Firefoxのレンダラーに細粒度の隔離を後付けする研究としてRLBoxが紹介されています。libGraphiteだけでなく、画像、動画、音声、圧縮系ライブラリへの適用も扱われており、これは単発の実験ではなく、ブラウザ内部の信頼境界を作り直す方向性だと分かります。
さらに、記事内で触れられているWASI SDKやCraneliftを見ると、WebAssemblyがブラウザ内で動くアプリのためだけでなく、既存のネイティブコードを安全な実行単位へ変換する基盤としても使われていることが分かります。
気づき
この記事で一番印象的なのは、セキュリティ対策を「バグをなくす」だけでなく、「バグが残っても被害範囲を狭める」設計として捉えている点です。WebAssemblyはここではWebページ上で動く新しい実行環境ではなく、Firefox内部の古いC/C++資産に明確な信頼境界を追加するための部品として使われています。
これは、既存コードを全部捨てられない大きなソフトウェアにとってかなり実践的な発想です。安全な言語への移行を進めつつ、移行しきれない部分には隔離境界を置く。理想論と運用現実の間を埋める技術として、RLBoxとWebAssemblyの組み合わせは読み応えがあります。
読んでおきたい人
- ブラウザやレンダリングエンジンのセキュリティに関心がある人
- C/C++ライブラリを大きなアプリケーションに組み込んでいる開発者
- WebAssemblyをWeb以外の用途でどう使えるか知りたい人
- 既存コードを活かしながら攻撃面を小さくする設計に興味がある人

コメントを残す