Google が Chrome に搭載する V8 Sandbox:Web ブラウザのメモリ破損に対する最適解とは?

Google Chrome Adds V8 Sandbox – A New Defense Against Browser Attacks

2024/04/08 TheHackerNews — Google が発表したのは、Chrome におけるメモリ破壊問題に対処するために、この Web ブラウザで V8 Sandbox という名の機能をサポートすることだ。V8 Security Technical Lead である Samuel GroB によると、このサンドボックスにより、V8 におけるメモリ破損のホスト・プロセス内での拡大が防止されるとのことだ。Google は V8 Sandbox について、JavaScript と WebAssembly エンジンのための、軽量化されたプロセス内サンドボックスだと説明しており、一般的な V8 の脆弱性を軽減するように設計したと言っている。


このアイデアは、V8 により実行されるコードを、プロセスの仮想アドレス空間のサブセット (サンドボックス) に制限し、プロセスの他の部分から隔離することで、V8 の脆弱性の影響を制限することにある。V8 に影響を及ぼす脆弱性は、2021年〜2023年に Google が対処したゼロデイ脆弱性の中で、かなりの部分を占めており、その数は 16件にも上る。

Chromium チームは、「この根本的な V8の要素により、典型的な脆弱性が構成される。したがってサンドボックスのアドレス空間内のあらゆるメモリを、攻撃者は任意かつ同時に変更できると想定している。さらに攻撃者は、サンドボックスの外側のメモリを、たとえばハードウェアのサイドチャネルを通じて読み取ることができると想定している。つまり、このようなプロセスの残りの部分を、攻撃から保護することがサンドボックスの目的となる。そのため、サンドボックスのアドレス空間外のメモリの破損は、サンドボックス違反とみなされる」と述べている。

GroB は、use-after-frees や out-of-bounds などの古典的なメモリ破損のバグとは異なり、メモリを破壊するために悪用できる、微妙なロジックの問題があるとしている。たとえば、Rust のようなメモリ安全性の高い言語や、メモリタグのようなハードウェアのメモリ・セーフティのアプローチに切り替えることにより、V8 の脆弱性に取り組むことが難しくなっていると強調している。

GroB は、「今現在において、V8 で悪用が発見される、ほぼ全ての脆弱性には、共通点がある。コンパイラとランタイムは、ほぼ V8 HeapObject インスタンスのみを操作するため、最終的なメモリ破壊は必然的に、V8 ヒープ内部で発生する」と述べている。

Chrome V8 Sandbox


このような問題は、典型的なメモリ破壊の脆弱性に使われるのと同じ技術では保護できないため、V8サンドボックスはV8のヒープメモリを隔離するように設計されている。

つまり、サンドボックス外のメモリにアクセスできる全てのデータ・タイプを、”サンドボックス互換” の代替に置き換えることで、攻撃者が他のメモリにアクセスすることを効果的に防止できる。このサンドボックスは、gn の args で “v8_enable_sandbox” を “true” に設定することで有効化される。

Speedometer と JetStream のベンチマーク結果によると、このセキュリティ機能により、典型的なワークロードで約1%のオーバーヘッドが上乗せされると示されている。したがって、Android/ChromeOS/Linux/macOS/Windows を横断するかたちで、Chrome バージョン 123 からデフォルトで有効化されるという。

GroB は、「この V8 Sandbox は、現時点において 1TB という大量の仮想アドレス空間を確保する必要があるため、64 Bit システムが必要となる。このサンドボックスを開発した背景としては、JavaScript エンジンの最適化において、現在のメモリ・セーフティ技術が、ほとんど適用できないという事実がある。新たに開発された技術でも、V8 自体のメモリ破壊を防ぐことはできないが、V8 Sandbox の攻撃対象領域を守ることは可能だ。したがって、このサンドボックスは、メモリ安全性への必要なステップとなる」と説明している。

今回の開発の背景には、ネイティブ・コードのメモリ・バグを検出し、Android ファームウェアのセキュリティを強化する、Kernel Address Sanitizer (KASan) が果たす役割がある。Google は、このコンパイラ・ベースのツールを使用することで、40 を超えるバグが発見されたと強調している。

Android チームの Eugene Rodionov と Ivan Lozano は、「テストやファジングの際に、KASan を有効化したビルドを用いることで、メモリ破壊の脆弱性や、安定性の問題を、ユーザー端末に搭載される前に発見できた」と述べている。