ニュース
JITをやめてみる ~Microsoft、「Edge」で「めっちゃすげえセキュリティモード」をテスト
標的となっている「V8」の攻撃面を減らし、レンダラープロセスで強力な緩和策を有効化
2021年8月6日 15:46
米Microsoftは8月4日(現地時間)、「Microsoft Edge」の新しいセキュリティ機能「Super Duper Secure Mode」(意訳:めっちゃすげえセキュリティモード)を発表した。まだ実験的な段階で、名称も公式なものではないが、パフォーマンスよりもセキュリティを重要視するユーザーにとっては気になる存在になりそうだ。
同社によると、JavaScriptエンジンの欠陥を突いた攻撃はさまざまだが、基本は長い間変わっておらず、だいたい以下のパターンで行われているという。
- オブジェクトの偽装
- プリミティブ(基本データ型)のアドレス取得
- 任意の書き込み
セキュリティチームが発見した欠陥はこのテンプレートにコピー&ペーストするだけで実証可能で、攻撃者は「PwnJS」のようなフレームワークを用いて即座に悪用できる体制を整えている。
しかし、これは防御側としては悪夢だ。欠陥を発見するとすばやく対処し、ユーザーにアップデートを促さなければならない。そのため、MicrosoftやGoogle、MozillaといったWebブラウザーベンダーは欠陥を見つけ出す手法の開発に大規模な投資を行うとともに、大規模な懸賞プログラムを用意してハッカーに問題の報告を促している。にもかかわらず、JavaScriptエンジンはWebブラウザーにとってのセキュリティ上の課題であり続けているのが現状といえる。
そこで同社のセキュリティチームが提案するのが、「ジャストインタイムコンパイル」(JIT)と呼ばれるJavaScriptエンジンのパフォーマンス技術をいっそのことやめてしまおうという解決策だ。
2019年以降のCVE(脆弱性に割り当てられる認識番号)を調査すると、JavaScriptエンジン「V8」で発見された脆弱性のうち、約45%がJITエンジンに関するものだという。さらに、Mozillaが指摘するところによると、「Chrome」で修正前に悪用された(in the wild)ケースのうち半数以上がJITのバグを悪用している。
JITはWebブラウザーのパフォーマンスを少しでも引き上げるために年々複雑化しているが、修正を必要とするセキュリティ欠陥の半数を生み出している。果たして速度アップに見合う価値があるだろうか――というわけだ。
また、JIT無効化のメリットは攻撃面(つまり、脆弱性)を減らすだけではない。「V8」のJITはその仕組み上、有力なセキュリティ緩和策のいくつかをレンダラーのプロセスで利用できない。たとえばIntelが開発したハードウェアベースの新しいエクスプロイト緩和策「CET」(Controlflow-Enforcement Technology)は、レンダラープロセスで活用できていない。また、RWXメモリページを使用しているため「ACG」(Arbitrary Code Guard)も無効化されている。こうした技術をレンダラープロセスにも適用できれば、セキュリティは飛躍的に向上するだろう。
とはいえ、JITを無効化するとパフォーマンスは大幅に低下してしまうのではないかという懸念は残る。そこでJITの有無でWebブラウザーのパフォーマンスがどれだけ変わるのかをテストしたところ、たしかにいくつかのテストでは改善が見られたものの、ほとんどの場合は性能に大きな変化はないという。
また、変化のあったテスト(ページ読み込み、メモリ使用量、起動時間、消費電力)をさらに詳しく調査したとことろ、消費電力では平均で15%の改善が見られたものの、かえって約11%増加したケースもあった。他のテストでも、改善もあれば悪化もあるのが実際のところのようだ。
これまでJITはパフォーマンスアップの切り札として喧伝されてきた。たとえば「Speedometer 2.0」ベンチマークではJITを無効にすると58%もスコアが低下してしまう。しかし、実際のユースケースでユーザーはJITの無効化を体感できるだろうか。
どちらにしろ、実際に2つのバージョンのWebブラウザーを比べてみないことには答えは得られないだろう。同社は今後数カ月をかけて、「Super Duper Secure Mode」プロジェクトでレンダラープロセスにおけるCET、ACG、CFG(Control Flow Guard、制御フロー ガード)の実装を進めていく計画だ。実際に試してみたい場合は、プレビュー版「Edge」(Beta/Dev/Canary)で試験段階の機能(edge://flags/)で「Super Duper Secure Mode」フラグを有効化してみるとよい。現時点ではJIT(TurboFan/Sparkplug)を無効にし、CETを有効にした状態をテストできる。ただし、WebAssemblyはまだサポートされていないので注意したい。