AIを駆使したサイバー攻撃:インテリジェントな脅威を検知、予防、防御する方法

今すぐ読む
サイト翻訳には人工知能を利用しており、正確性を追求しておりますが、必ずしも100%正確とは限りません。ご了承ください。

Google Chromeの脆弱性CVE-2024-0517の修正について

MetaDefender Endpoint搭載
By OPSWAT
この記事を共有する
OPSWAT フェローシップ・プログラム参加者のホアイ・ナム・ドーとミン・クアン・レーの写真
OPSWAT フェローシップ・プログラム参加者

CVE-2024-0517について

CVE-2024-0517 は、バージョン 120.0.6099.224 より前の Google Chrome の V8 JavaScript エンジンに存在する境界外書き込みの脆弱性で、リモートの攻撃者が細工した HTML ページを介してヒープ破壊を悪用する可能性があります。この脆弱性は、QriousSecure社のToan (Suto) Pham氏によって最初に報告されました。 

CVSS 3.xの深刻度ベーススコア8.8(高)を示すスクリーンショットと、NVDによる詳細なベクターの説明。
国家脆弱性データベース(NVD)のCVE-2024-0517

この脆弱性は、アプリケーションがポインタやオブジェクト、変数などのリソースを、ある型を使って割り当てたり初期化したりしたが、後で元の型と互換性のない型を使ってそのリソースにアクセスした場合に発生する型の混同に起因する(CWE-843)。このCVEでは、V8 JavaScriptエンジンの最適化コンパイラであるMaglevがメモリ最適化のために採用しているfolded allocationと呼ばれるメモリ割り当て処理中に型の混乱が引き起こされます。 

型の混乱を悪用し、WebAssemblyによって任意のシェルコードを記述することで、攻撃者は被害者のマシン上でコマンドを実行することができる。 

攻撃フェイズ

攻撃者は、細工したHTMLページを含むウェブサイトをホストし、フィッシングメールやソーシャルネットワークを通じてユーザーを騙してアクセスさせることができる。ユーザーが脆弱なバージョンのGoogle Chromeを使ってサイトにアクセスすると、埋め込まれた悪意のあるコードが任意のコマンドを実行します。 

リモート・コードの実行につながる悪意のあるHTMLファイルを含むフィッシング・メールを使用して脆弱性を悪用する4つのステップを示した図
段階的な攻撃キャンペーン 

V8 JavaScriptエンジン 

攻撃者は、細工したHTMLページを含むウェブサイトをホストし、フィッシングメールやソーシャルネットワークを通じてユーザーを騙してアクセスさせることができる。ユーザーが脆弱なバージョンのGoogle Chromeを使ってサイトにアクセスすると、埋め込まれた悪意のあるコードが任意のコマンドを実行します。 

磁気浮上と折りたたみ式アロケーション

V8の最適化コンパイラであるMaglevは、コードの実行とメモリ割り当てを強化する。Maglevは、コードが頻繁に実行され、"hot "とマークされた場合にのみ実行される。これは、より遅い行ごとの解釈ではなく、コンパイルによる高速実行の必要性を示している。 

一般的に、メモリ確保は連続しないメモリ領域で行われるため、メモリ使用量がまばらになり、非効率になります。これに対処するため、V8は複数の変数を連続的かつ同時に割り当てるフォールデッド・アロケーションと呼ばれる手法を採用している。Maglevもまた、フォールデッド・アロケーションを使用することで、アロケーションを最適化している。 

フォルダが割り当てられている場合といない場合のフォルダ割り当てを色分けした図
マレブ&フォルダ割り当て

世代別ガベージコレクション 

未使用のメモリ領域をクリーンアップするために、V8は世代ガベージコレクション(GC)技術を採用し、メモリを若い世代と古い世代の2つのスペースに分割する。さらに、2つのガベージコレクタがあります:若い領域のクリーンアップを担当するマイナーガベージコレクタと、古い領域のクリーンアップを担当するメジャーガベージコレクタです。若い世代は、新しく作成されたオブジェクトが最初に割り当てられるメモリの領域であり、古い世代は、長寿命のオブジェクトが格納されるメモリの領域である。若い世代で複数のマイナーGCサイクルを生き残ったオブジェクトは、最終的に古い世代に昇格する。 

ガベージ・コレクション(GC)中の、若いメモリー世代、中間メモリー世代、古いメモリー世代におけるオブジェクトの割り当てプロセスを示す図
記憶空間:若い世代と古い世代

脆弱性分析

概要

この脆弱性は、明示的に定義されたコンストラクタ(ベース・デフォルト・コンストラクタ)を持たないベース・クラスから継承されたクラスからオブジェクトが生成され、その後に別のオブジェクトが生成された場合に発生する。フォールデッド・アロケーションにより、最初のオブジェクトのアロケーションに続いて2番目のオブジェクトがアロケーションされる可能性がある。この2つの割り当ての間にガベージコレクションなどのイベントが発生すると、型混同の脆弱性が発生する可能性がある。

根本原因分析 

OPSWAT グラジュエート・フェローは、割り当てプロセスにおけるV8のワークフローを詳細に分析し、このプロセスにおいて以下の機能が呼び出されることを突き止めた: 

オブジェクト割り当てプロセスにおけるV8のワークフローを示す図(コンストラクターの検索から生の割り当て拡張まで
割り当てプロセスにおけるV8ワークフロー 

このプロセスの中で、TryBuildFindNonDefaultConstructorOrConstruct 関数の問題が特定されました:BuildAllocateFastObject 関数は current_raw_allocation_ (複数の変数に同時に割り当てられるメモリ領域へのポインタ) を拡張して子クラス・インスタンスを構築しますが、null に設定することでこれをクリアできません。 

その結果、次に生成されるオブジェクトは、current_raw_allocation_が指すメモリーの直後に、2回目の割り当て前のイベントに関係なく、常に割り当てられる。 

現在の未割り当てのオブジェクト」から「次のオブジェクト」へと移動し、メモリ内に新しいオブジェクトを作成する様子を示す図
メモリ領域内の'current_raw_allocation'と'Next object'

GCが起動されると、current_raw_allocation_に隣接するメモリ領域が他のオブジェクトに割り当てられる可能性がある。このため、GCが発動して別のオブジェクトが生成された後、2つのポインタが同じメモリ領域を参照するがデータ型が異なるという状況が発生し、型混同の脆弱性が生じる可能性がある。

潜在的な問題につながるガベージコレクションのトリガーとオブジェクトの割り当てを示す、タイプ混乱の脆弱性プロセスを示す図
タイプ混同の脆弱性 

開発

この脆弱性を悪用するために、OPSWAT 大学院生は、シェルコードを含むWebAssemblyインスタンスを作成し、GCによる型の混乱を引き起こしてメモリを制御し、シェルコードを実行しようとしました: 

V8エンジンの型混乱によるリモートコード実行のトリガーからシェルコードの実行までのステップバイステップのフローチャート。
V8エンジンでリモートコード実行を引き起こす手順 

トリガータイプの混乱

初期化では、まず空のオブジェクトを含む配列(_arrayObject)を定義する。次に、子クラスのインスタンスとトリガー・ガベージ・コレクタを構築する。最後に、_arrayDoubleという浮動小数点数の配列を定義する。 

JavaScriptでガベージコレクションをトリガーし、配列バッファを作成する関数を示すコード・スニペット。

これらのコンストラクタを繰り返し実行することで、コードが複数回実行され、V8に "ホット "とマークされ、マグレブ・コンパイラが起動する。そのためには、次のようにループ内で子クラスのコンストラクタを呼び出します: 

子クラスの複数のインスタンスを作成するループを示すJavaScriptの短いコード・スニペット

ループの中でこれらのオブジェクトを繰り返し初期化すると、タイプ混乱が引き起こされる。

読み書きプリミティブの作成

型の混同をうまくトリガーした後、シェルコードを実行するには、メモリを読み取り、制御されたアドレスでメモリを上書きする必要がある。これを行うために、私たちは読み取りと書き込みのプリミティブを作成した。エクスプロイテーション・プリミティブは、オブジェクト内のメタデータを利用して、任意の読み取り/書き込みメモリ領域を与え、それを使って任意のコードを実行する。 

読み取りと書き込みのプリミティブを視覚的に表現したもので、メモリ領域と上書きされる値を示す。
読み書きプリミティブ 

このステップでの読み書きプリミティブによって、次のステップでWebAssemblyインスタンスのジャンプ・テーブル・ポインタを制御できるようになります。 

WebAssemblyインスタンスを作成する

次に、2 つの WebAssembly インスタンスを作成しました。1 つはシェルコードを格納するため、もう 1 つはそれをトリガーするためです。WebAssembly インスタンスのメモリにシェルコードを直接読み書きすることを避けるため、WebAssembly インスタンス内に浮動小数点定数値を定義します。 

WebAssemblyで書かれたコード・スニペットで、メモリ・アクセスと保存関数を説明する。

WebAssembly インスタンスの制御ジャンプテーブルポインタ

読み取りと書き込みのプリミティブを使用して、2番目のWebAssemblyインスタンスのジャンプ・テーブル・ポインタを調整し、最初のWebAssemblyインスタンスの定数のコンパイル・コードのいくつかのバイトをスキップして、浮動小数点定数が意図したシェルコードとして解釈されるようにします:

データをレジスタに移動する命令を示すアセンブリ・コードのスニペット

WebAssemblyインスタンスを実行してシェルコードを実行する 

最後に、型の混乱を引き起こし、読み取り/書き込みプリミティブを使用してWebAssemblyインスタンスのジャンプ・テーブル・ポインタを制御した後、2番目のWebAssemblyインスタンスのエクスポートされた関数を呼び出し、1番目のWebAssemblyインスタンスのシェルコードを実行させる。 

今回使用するシェルコードは、以下のコマンドのように、Linuxマシン上のすべてのプロセスを終了させるように設計されている: 

プロセスを終了させる'kill'コマンドを使った簡単なターミナル・コマンドのスニペット

このコマンドを実行するためのアセンブリ・コードは、浮動小数点数から変換すると以下のようになる: 

kill」コマンドを使ってプロセスを終了させるシステムコールのアセンブリーコードのスニペット。

セキュリティ脆弱性のシミュレーション 

この悪用を実際のシナリオでシミュレートするために、OPSWAT 大学院生は悪意を持って細工したHTMLページを作成した。 

メモリにアクセスし、データを操作してシェルコードを実行するように設計されたWebAssemblyのコード・スニペット。

この細工されたHTMLページをホストしているドメインへのリンクが埋め込まれたフィッシング・メールが被害者に送信される。 

フィッシングメールとシステム監視ツールを並べたスクリーンショット。

被害者が脆弱なバージョンのGoogle Chromeを使用してリンクにアクセスすると、シェルコードが実行され、すべてのプロセスが終了する。その結果、ユーザーは以下のようにログアウトされる: 

Kali Linuxのログイン画面のスクリーンショット

修復

MetaDefender Endpoint™は、その「脆弱なアプリケーション」機能を活用することで、このCVEをプロアクティブに緩和するために採用されました。このソリューションは、エンドポイント環境内のGoogle Chromeアプリケーションに関連するすべてのCVEをピンポイントで効果的に表示します。脅威を無効化するために、ユーザーは速やかに Chrome をアンインストールするか、最新のセキュリティパッチを適用することができます。いずれかの対策を実施することで、CVEは完全に封じ込められ、エンドポイントへのサイバー攻撃が成功するリスクを大幅に低減します。

MetaDefender Endpoint インターフェースに、CVEの詳細を含むGoogle Chromeの脆弱性が表示されます。

次世代Endpoint 

世界中の組織、機関、団体が重要なエンドポイントの保護にMetaDefender Endpoint 信頼している理由をご覧ください。今すぐエキスパートにご相談いただき、無料デモで詳細をご確認ください。  


OPSWATで最新情報をお届けします!

今すぐご登録ください、 ストーリー、イベント情報などをお届けします。