CVE-2024-0517について
CVE-2024-0517 は、バージョン 120.0.6099.224 より前の Google Chrome の V8 JavaScript エンジンに存在する境界外書き込みの脆弱性で、リモートの攻撃者が細工した HTML ページを介してヒープ破壊を悪用する可能性があります。この脆弱性は、QriousSecure社のToan (Suto) Pham氏によって最初に報告されました。
この脆弱性は、アプリケーションがポインタやオブジェクト、変数などのリソースを、ある型を使って割り当てたり初期化したりしたが、後で元の型と互換性のない型を使ってそのリソースにアクセスした場合に発生する型の混同に起因する(CWE-843)。このCVEでは、V8 JavaScriptエンジンの最適化コンパイラであるMaglevがメモリ最適化のために採用しているfolded allocationと呼ばれるメモリ割り当て処理中に型の混乱が引き起こされます。
型の混乱を悪用し、WebAssemblyによって任意のシェルコードを記述することで、攻撃者は被害者のマシン上でコマンドを実行することができる。
攻撃フェイズ
攻撃者は、細工したHTMLページを含むウェブサイトをホストし、フィッシングメールやソーシャルネットワークを通じてユーザーを騙してアクセスさせることができる。ユーザーが脆弱なバージョンのGoogle Chromeを使ってサイトにアクセスすると、埋め込まれた悪意のあるコードが任意のコマンドを実行します。
V8 JavaScriptエンジン
攻撃者は、細工したHTMLページを含むウェブサイトをホストし、フィッシングメールやソーシャルネットワークを通じてユーザーを騙してアクセスさせることができる。ユーザーが脆弱なバージョンのGoogle Chromeを使ってサイトにアクセスすると、埋め込まれた悪意のあるコードが任意のコマンドを実行します。
磁気浮上と折りたたみ式アロケーション
V8の最適化コンパイラであるMaglevは、コードの実行とメモリ割り当てを強化する。Maglevは、コードが頻繁に実行され、"hot "とマークされた場合にのみ実行される。これは、より遅い行ごとの解釈ではなく、コンパイルによる高速実行の必要性を示している。
一般的に、メモリ確保は連続しないメモリ領域で行われるため、メモリ使用量がまばらになり、非効率になります。これに対処するため、V8は複数の変数を連続的かつ同時に割り当てるフォールデッド・アロケーションと呼ばれる手法を採用している。Maglevもまた、フォールデッド・アロケーションを使用することで、アロケーションを最適化している。
世代別ガベージコレクション
未使用のメモリ領域をクリーンアップするために、V8は世代ガベージコレクション(GC)技術を採用し、メモリを若い世代と古い世代の2つのスペースに分割する。さらに、2つのガベージコレクタがあります:若い領域のクリーンアップを担当するマイナーガベージコレクタと、古い領域のクリーンアップを担当するメジャーガベージコレクタです。若い世代は、新しく作成されたオブジェクトが最初に割り当てられるメモリの領域であり、古い世代は、長寿命のオブジェクトが格納されるメモリの領域である。若い世代で複数のマイナーGCサイクルを生き残ったオブジェクトは、最終的に古い世代に昇格する。
脆弱性分析
概要
この脆弱性は、明示的に定義されたコンストラクタ(ベース・デフォルト・コンストラクタ)を持たないベース・クラスから継承されたクラスからオブジェクトが生成され、その後に別のオブジェクトが生成された場合に発生する。フォールデッド・アロケーションにより、最初のオブジェクトのアロケーションに続いて2番目のオブジェクトがアロケーションされる可能性がある。この2つの割り当ての間にガベージコレクションなどのイベントが発生すると、型混同の脆弱性が発生する可能性がある。
根本原因分析
OPSWAT グラジュエート・フェローは、割り当てプロセスにおけるV8のワークフローを詳細に分析し、このプロセスにおいて以下の機能が呼び出されることを突き止めた:
このプロセスの中で、TryBuildFindNonDefaultConstructorOrConstruct 関数の問題が特定されました:BuildAllocateFastObject 関数は current_raw_allocation_ (複数の変数に同時に割り当てられるメモリ領域へのポインタ) を拡張して子クラス・インスタンスを構築しますが、null に設定することでこれをクリアできません。
その結果、次に生成されるオブジェクトは、current_raw_allocation_が指すメモリーの直後に、2回目の割り当て前のイベントに関係なく、常に割り当てられる。
GCが起動されると、current_raw_allocation_に隣接するメモリ領域が他のオブジェクトに割り当てられる可能性がある。このため、GCが発動して別のオブジェクトが生成された後、2つのポインタが同じメモリ領域を参照するがデータ型が異なるという状況が発生し、型混同の脆弱性が生じる可能性がある。
開発
この脆弱性を悪用するために、OPSWAT 大学院生は、シェルコードを含むWebAssemblyインスタンスを作成し、GCによる型の混乱を引き起こしてメモリを制御し、シェルコードを実行しようとしました:
トリガータイプの混乱
初期化では、まず空のオブジェクトを含む配列(_arrayObject)を定義する。次に、子クラスのインスタンスとトリガー・ガベージ・コレクタを構築する。最後に、_arrayDoubleという浮動小数点数の配列を定義する。
これらのコンストラクタを繰り返し実行することで、コードが複数回実行され、V8に "ホット "とマークされ、マグレブ・コンパイラが起動する。そのためには、次のようにループ内で子クラスのコンストラクタを呼び出します:
ループの中でこれらのオブジェクトを繰り返し初期化すると、タイプ混乱が引き起こされる。
読み書きプリミティブの作成
型の混同をうまくトリガーした後、シェルコードを実行するには、メモリを読み取り、制御されたアドレスでメモリを上書きする必要がある。これを行うために、私たちは読み取りと書き込みのプリミティブを作成した。エクスプロイテーション・プリミティブは、オブジェクト内のメタデータを利用して、任意の読み取り/書き込みメモリ領域を与え、それを使って任意のコードを実行する。
このステップでの読み書きプリミティブによって、次のステップでWebAssemblyインスタンスのジャンプ・テーブル・ポインタを制御できるようになります。
WebAssemblyインスタンスを作成する
次に、2 つの WebAssembly インスタンスを作成しました。1 つはシェルコードを格納するため、もう 1 つはそれをトリガーするためです。WebAssembly インスタンスのメモリにシェルコードを直接読み書きすることを避けるため、WebAssembly インスタンス内に浮動小数点定数値を定義します。
WebAssembly インスタンスの制御ジャンプテーブルポインタ
読み取りと書き込みのプリミティブを使用して、2番目のWebAssemblyインスタンスのジャンプ・テーブル・ポインタを調整し、最初のWebAssemblyインスタンスの定数のコンパイル・コードのいくつかのバイトをスキップして、浮動小数点定数が意図したシェルコードとして解釈されるようにします:
WebAssemblyインスタンスを実行してシェルコードを実行する
最後に、型の混乱を引き起こし、読み取り/書き込みプリミティブを使用してWebAssemblyインスタンスのジャンプ・テーブル・ポインタを制御した後、2番目のWebAssemblyインスタンスのエクスポートされた関数を呼び出し、1番目のWebAssemblyインスタンスのシェルコードを実行させる。
今回使用するシェルコードは、以下のコマンドのように、Linuxマシン上のすべてのプロセスを終了させるように設計されている:
このコマンドを実行するためのアセンブリ・コードは、浮動小数点数から変換すると以下のようになる:
セキュリティ脆弱性のシミュレーション
この悪用を実際のシナリオでシミュレートするために、OPSWAT 大学院生は悪意を持って細工したHTMLページを作成した。
この細工されたHTMLページをホストしているドメインへのリンクが埋め込まれたフィッシング・メールが被害者に送信される。
被害者が脆弱なバージョンのGoogle Chromeを使用してリンクにアクセスすると、シェルコードが実行され、すべてのプロセスが終了する。その結果、ユーザーは以下のようにログアウトされる:
修復
MetaDefender Endpoint™は、その「脆弱なアプリケーション」機能を活用することで、このCVEをプロアクティブに緩和するために採用されました。このソリューションは、エンドポイント環境内のGoogle Chromeアプリケーションに関連するすべてのCVEをピンポイントで効果的に表示します。脅威を無効化するために、ユーザーは速やかに Chrome をアンインストールするか、最新のセキュリティパッチを適用することができます。いずれかの対策を実施することで、CVEは完全に封じ込められ、エンドポイントへのサイバー攻撃が成功するリスクを大幅に低減します。
次世代Endpoint
世界中の組織、機関、団体が重要なエンドポイントの保護にMetaDefender Endpoint 信頼している理由をご覧ください。今すぐエキスパートにご相談いただき、無料デモで詳細をご確認ください。
参考文献
https://nvd.nist.gov/vuln/detail/CVE-2024-0517
https://cwe.mitre.org/data/definitions/843.html
https://blog.exodusintel.com/2024/01/19/google-chrome-v8-cve-2024-0517-out-of-bounds-write-code-execution/
https://jhalon.github.io/chrome-browser-exploitation-1/
https://whenderson.dev/blog/webgl-garbage-collection/
https://v8.dev/
https://github.com/Uniguri/CVE-nday/tree/master/Chrome/V8/CVE-2024-0517