
教育用プレゼンテーション:CVE-2021-21220(V8 JITコンパイラの型混乱バグ)の悪用により、範囲外アクセス、任意メモリ読み取り/書き込み、WebAssembly経由のリモートコード実行が可能になることを詳述。
このプレゼンテーションでは、最適化中の誤ったJITコンパイラの仮定によって引き起こされたGoogle ChromeのV8 JavaScriptエンジンの脆弱性CVE-2021-21220の悪用について説明します。
プレゼンテーションでは次の項目を順に説明します:
このプレゼンテーションの目標は、現代のJavaScriptエンジン内の微妙な最適化ミスがどのように次のような状態に発展するかを示すことです:
エクスプロイトチェーンは、JITエンジンがパフォーマンスとセキュリティのバランスをどのように取るか、そして誤った最適化の仮定がどのように悪用可能になるかを強調します。
プレゼンテーションでは、主要なV8コンポーネントを紹介します:
プレゼンテーションのアーキテクチャ図は、JavaScriptが次のように移行する様子を示しています:
Parsing → Bytecode → Optimization → Execution
JavaScriptが高性能実行にとって難しい理由は次のとおりです:
+のような演算子は複数の意味を持つV8はランタイム動作を推測することで、一般的な実行パターンを最適化するためにJITコンパイルを使用します。
この脆弱性は、JIT最適化中の符号付きと符号なし整数の不一致に起因します。
示される主要な概念:
Uint32ArrayWord32XorChangeInt32ToInt64エクスプロイトは次の値を悪用します:
0x80000000
脆弱性は、TurboFanが次の処理を最適化するために発生します:
x ^ 0
を完全に除去することです。
この最適化中に:
これにより、誤ったマシンコードの生成と攻撃者制御可能な値が生じます。
エクスプロイトは、誤ったJIT結果を配列動作の制御に変換します。
プレゼンテーションでは次のことを実演します:
iへの変換Array.shift()の長さアンダーフロー示される重要なエクスプロイト概念:
配列長が-1になると、攻撃者は以下を獲得します:
エクスプロイトは次に以下を実演します:
プレゼンテーションでは、攻撃者がどのように以下のものを標的にできるかを説明します:
攻撃フロー:
これは、JavaScriptエンジンのバグがプロセスレベルのコード実行に移行する方法を示しています。
最終セクションでは、最新のブラウザ防御をカバーします:
直接的なポインタ露出とヒープの予測可能性を低減します。
生のメモリアドレスへの直接アクセスを防ぎます。
メモリ領域を分離し、エクスプロイトの影響を低減します。
ページが同時に書き込み可能かつ実行可能になるのを防ぎます。
プレゼンテーションには、符号拡張問題の修正を示す実際のV8パッチ差分も含まれています。
この資料は厳密に次の目的で使用されます:
この情報を、所有していない、またはテスト許可がないシステムに対して使用しないでください。