The Hacker Newsは4月8日(現地時間)、「Google Chrome Adds V8 Sandbox - A New Defense Against Browser Attacks」において、Google ChromeにV8サンドボックスが追加されたと伝えた。V8サンドボックスの導入により信頼できないJavaScriptコードが分離され、メモリ破損がホストプロセス内に広がることを防止できる。
V8サンドボックス導入の経緯
今回Google Chromeに導入されたV8サンドボックスは「The V8 Sandbox · V8」で詳しく解説されている。V8はGoogleが開発するオープンソースのJIT Virtual MachineのJavaScriptエンジンで、V8サンドボックスはV8用のインプロセスサンドボックスとされる。
解説によると、2021年から2023年に発見されたすべてのChromeのエクスプロイトは、リモートコード実行(RCE: Remote Code Execution)のために悪用されたレンダラープロセスのメモリ破損の脆弱性から始まっており、その60%はV8の脆弱性だったという。これら脆弱性は古典的なメモリ破壊のバグ(解放後使用、範囲外アクセスなど)ではなく、微妙なロジックの問題のため、既存のメモリ安全ソリューション(Rustの使用やメモリのタグ付けなど)では対処できないとしている。
ただ、これら脆弱性のほぼすべてには共通点が存在するという。それは、コンパイラーとランタイムがV8 HeapObjectインスタンスに対して排他的に動作するため、メモリ破壊はV8ヒープ内で発生するという点。開発者はこの共通点に着目し、問題発生時に影響を軽減する方法としてV8サンドボックスを導入した。
V8サンドボックス
V8サンドボックスはオペレーティングシステムにおけるカーネル空間とユーザー空間のメモリー分離と同じ概念とされる。動作としては実行されるコードをプロセスの仮想アドレス空間のサブセットに制限し、プロセスの残りの空間へのアクセスをブロックする。具体的には生のポインターをサンドボックスのベース位置からのオフセットに変換、またはサンドボックス外のポインタテーブルのインデックスに変換することで実現する。
V8サンドボックスは将来的にハードウェアサポートを利用して実装可能だが、現在は必要なハードウェア実装がないためソフトウェアで実装しているという。しかしながら、実装コストは低いとしており、パフォーマンスへの影響は一般的なワークロードにおいて約1%以下としている。なお、V8サンドボックスを利用するには1テラバイトの仮想アドレス空間が必要なため、64ビットシステムが必須条件となる。
V8サンドボックスはGoogle Chrome バージョン123からデフォルトで有効化される。また、Chromeの脆弱性報奨プログラム(VRP: Vulnerability Reward Program)の対象にも追加される(参考:「Chrome Vulnerability Reward Program Rules - Rules - About - Google Bug Hunters」)。