AIハッキング - ハッカーは人工知能をサイバー攻撃にどう利用するか

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

Gitの脆弱性CVE-2024-32002の分析と対策

By OPSWAT
この記事を共有する
OPSWAT フェローシップ・プログラムに参加したホーチミン工科大学の学生、ミン・ファムとタイ・ドー
OPSWAT フェローシップ・プログラムに参加。

RCE(リモート・コード実行)攻撃を可能にするGitの重大な脆弱性が最近公開され、複数のバージョンのGitとMicrosoft Visual Studio 2017に影響が及んでいる。この脆弱性は、サブモジュールの作業ツリーの外側や.git/ディレクトリにファイルを書き込むことができるGitのバグを悪用し、攻撃者がサブモジュールを使用してGitリポジトリを操作することを可能にします。 このバグにより、リポジトリのクローン作成が実行されている間に悪意のあるフックを実行することが可能になります[1]。 

CVE-2024-32002の脆弱性は、Microsoft Visual Studio 2017バージョン15.9および2.45.1、2.44.1、2.43.4、2.42.2、2.41.1、2.40.2、2.39.4より前のGitバージョンに影響する。大文字小文字を区別しないオペレーティング・システムでシンボリックリンクのサポートが有効になっている環境で悪用される可能性があります。 

GitHub, Inc.が提供するCVSS (Common Vulnerability Scoring System) 3.xの深刻度とベクター情報。基本スコアは9.0で、Criticalとラベル付けされている。

Gitを理解する

Gitはフリーでオープンソースの分散バージョン管理システムであり、ソフトウェア開発者がコードベースを迅速かつ効率的に管理できるように設計されています。ファイルやディレクトリの変更を標準化された構造化された方法で整理し追跡することで、開発チームメンバー間のコラボレーションを強化します。 

Gitはソフトウェア開発で広く使われている。GitHub、GitLab、Bitbucketなどのプラットフォームは、その強力な機能により開発者間のコラボレーションを強化するためにGitの上に構築されている: 

  • コミットと呼ばれる、コードファイルへの追跡可能な変更を記録する。 
  • 必要に応じて、コードの編集を以前のバージョンにロールバックする。 
  • 異なるブランチやコントリビューターからの変更を効率的に組み合わせる。 
  • 誰がどのような変更を行ったか、その日付の履歴を記録しておくこと。
.gitフォルダ構造を視覚的に表したもので、config、HEAD、hooks、objects、refsなどのディレクトリが表示されます。

Gitフック 

git initgit cloneコマンドを使って Git リポジトリを作成したりクローンしたりすると、作業ツリーのルートに.gitディレクトリが作成されます。.gitディレクトリのディレクトリ構造は、最初はこのようになっています: 

Git フックは実行可能なスクリプトで、.git/hooksディレクトリか.git/modules/module_type/module_name/hooksディレクトリにあります。フックは、Git リポジトリ内で特定のイベントが発生したときに自動的に起動します。  

hooksディレクトリにあるファイルの接尾辞が.sampleでない場合、そのファイルに含まれるコマンドは、pre-commit、post-commitpost-checkoutといったファイル名に含まれる特定のGitアクションの前後で実行されます。 

Gitサブモジュール

Git サブモジュールとは、外部リポジトリの特定のコミットを参照する Git リポジトリ内のレコードのことです。サブモジュールをリポジトリに追加すると、.gitmodulesディレクトリに新しいファイルが作成され、サブモジュールの URL とローカルディレクトリの対応関係がメタデータとして記録されます。リポジトリに複数のサブモジュールが含まれている場合、.gitmodulesファイルにはそれぞれのエントリが含まれます。[3] 

リポジトリとサブモジュールの相互作用を示す図(リポジトリA、サブモジュールB、フォルダCの関係を示す図
.gitmodules ファイルの内容例。"Example" という名前のサブモジュールの設定例です。
次の画像は、.gitmodulesファイルがどのように見えるかを示しています: 

シンボリックリンク(シンボリックリンク)

シンボリックリンクは、シンボリックリンクまたはソフトリンクとも呼ばれ、パ スを指定して別のファイルまたはディレクトリ(「ターゲット」と呼ばれる)を指 すファイルである。シンボリックリンクが削除されても、ターゲットは影響を受けません。[4] 

Gitにおけるシンボリックリンクは、別のファイルへの参照やショートカットとして機能させるためのメタデータを持つファイルとして作成されます。シンボリックリンクを使うことで、ファイルの内容を複製することなく複数のファイルへの参照を作ることができます。

あるファイル(ファイルA)に対するシンボリックリンクとハードリンクを示す図。
Gitはシンボリックリンクを、それが参照するファイルやディレクトリへのパスを保存する特殊なファイルとして扱います。 
Git リポジトリ内のシンボリックリンクを視覚化し、ディレクトリとファイルの構造とシンボリックリンクのパスを示す
シンボリックリンクを含むリポジトリやブランチがクローンされたりチェックアウトされたりすると、Git に保存されているシンボリックリンクはローカルのファイルシステム上のシンボリックリンクに変換されます。 

GITセキュリティ脆弱性分析

パッチ分析

セキュリティの脆弱性をより深く理解するために、セキュリティ専門家はしばしばパッチ分析を行う。これは、脆弱な機能や潜在的な攻撃ベクトルを特定するのに役立つ技術である。 OPSWAT フェローは、CVE-2024-32002 の脆弱性に対処するためにパッチが適用されたバージョンで行われた変更を調査し、この CVE に対処するために 2 つのファイルが更新されていることを発見しました。

更新されたファイルのひとつはsubmodule--helper.cファイルで、Git サブモジュールのクローンを処理するコードが含まれています。パッチが適用されたバージョンの新しいコミットには、次の2つが含まれています:  

  1. dir_contains_only_dotgit関数を追加して、submodulesディレクトリに.gitファイルやディレクトリが含まれないようにしました。
Gitインターフェイス内のsubmodule-helper.cというファイルにおけるコードの変更。
  1. clone_submodule()関数に変更が加えられ、サブモジュールディレクトリが存在し、かつ空であるかどうかをチェックする条件が追加された。ディレクトリが空でない場合、クローン処理は中断されます。 
サブモジュールの操作中にディレクトリの内容をチェックする関数をハイライトした、Gitコミットからの詳細なコードスニペット

新しいコミットでの2つ目の更新はt/t7406-submodule-update.shファイルで、セキュリティ脆弱性が解決されたことを確認するためのテストスクリプトが追加された。 

テストファイルT7406-submodule-update.shのコード修正を拡張し、サブモジュールのパスとシンボリックリンクのテスト設定を詳細にした。

分析から利用へ

Gitにおけるシンボリックリンクとサブモジュールのワークフロー分析

パッチの分析と CVE-2024-32002 脆弱性の説明から得られた洞察に加え、OPSWAT フェローは Git におけるシンボリックリンクとサブモジュールのワークフローの調査に取り組んだ。彼らは、ユーザーがリポジトリをクローンするときに起こる一連の出来事を分解した:

  1. Gitは、プライマリリポジトリからファイルとディレクトリをダウンロードすることから始めます。 
  2. これは、シンボリックリンクファイルで指定された定義を利用して、ローカルのファイルシステムに対応するシンボリックリンクを再作成する。  
  3. シンボリックリンクが既存のファイルを指している場合、シンボリックリンクは機能する。そうでない場合、シンボリックリンクはターゲットが復元されるまで機能しないままである。  
  4. recursiveオプションを指定してリポジトリをクローンした場合、Git はサブモジュール (外部リポジトリ) をクローンし、.gitmodules ファイルで指定したディレクトリパスに配置します。  
  5. シンボリックリンクがサブモジュールのパスの一部である場合 (例えばutil/module/test のように、utilsymlink_folder のような別のディレクトリを指すシンボリックリンクです)、Git はシンボリックリンクによって参照される実際のディレクトリ (例えばsymlink_folder/module/test) にサブモジュールの内容を保存します。 
リポジトリのクローン、ファイルとディレクトリのダウンロード、シンボリックリンクの再作成、サブモジュールのクローン、正しいパスへの移動の手順を示す視覚的なフローチャート。

Git のセキュリティ脆弱性 CVE-2024-32002 を理解する 

悪意のあるリポジトリの作成

OPSWAT フェローは、t/t7406-submodule-update.shファイルの更新に基づいて悪意のあるリポジトリが作成されることをさらに調査し、このプロセスを以下のステップに分類した:

  1. ポストチェックアウトフックを含むリポジトリの作成
ディレクトリの作成やスクリプトの追加など、Gitでチェックアウト後のフックをセットアップするコマンドを紹介するターミナルのコード・スニペット。
  1. A/modules/xパスにあるサブモジュールを含む別のリポジトリを作成します。新しく作成されたサブモジュールは、以前に作成されたリポジトリを参照します。
Git コマンドを使ってリポジトリにサブモジュールを追加する手順を示すターミナルのコードスニペット
  1. Gitインデックス内の.gitフォルダを指す、aというシンボリックリンクを作成します。 
ユーティリティとして .git ファイルを作成し、リポジトリにコミットするコマンドを強調したターミナルスクリプトの例
悪意のあるフックリポジトリがメインリポジトリのサブモジュールとして追加され、スクリプトの実行につながる攻撃シナリオの詳細を示すフローチャート。
攻撃者がリポジトリをクローンすることでCVEを悪用する方法を示した図 

セキュリティの欠陥を理解する

ユーザーが--recursiveオプションを使用して、前のステップで作成された悪意のあるリポジトリをクローンすると、ポストチェックアウトフックの悪意のあるスクリプトがトリガーされ、攻撃者はユーザーのデバイスを危険にさらすことができます。 

このリモートコード実行は、メインリポジトリがクローン時に.gitディレクトリを指すaというシンボリックリンクを検出するために発生します。再帰モードを有効にすると、サブモジュールもクローンされたリポジトリに取り込まれます。このリポジトリにはチェックアウト後のフックスクリプトを含む hooks フォルダがあり、そのローカルディレクトリはA/modules/x にあります。  

a は.gitディレクトリを指しており、ファイルシステムでは大文字と小文字が区別されないため、Aa と等価に解釈されます。Git はチェックアウト後のフックスクリプトを.git/modules/query/fast/hooks/ディレクトリに書き込むように惑わされます。チェックアウト後のフックスクリプトが .git/modules/{module_type}/{module_name}/hooksフォルダに見つかると、--recursiveオプションを指定してメインリポジトリをクローンしたときにそのスクリプトが起動します。その結果、攻撃者はリモートコードを実行することで、ユーザーのデバイスを侵害することに成功します。

クローン作成、サブモジュールの引き出し、意図しないスクリプトの実行など、被害者と悪意のあるリポジトリとのやり取りを示す図。
攻撃の流れを示す図

Git脆弱性の悪用シミュレーション

これまでの知見に基づき、OPSWAT フェローはメインリポジトリとフックを作成し、悪意のあるリポジトリを作成するシミュレーションを行った:

  1. 最初は、protocol.fileを常に許可するようにGitを設定し、core.symlinksを有効にし、デフォルトのブランチ名をmainに設定することをお勧めします(警告メッセージを避けるため)。 
シンボリックリンクの処理やデフォルトのブランチの設定など、Git の設定をグローバルに行うためのコマンドを紹介するターミナルのスニペット
  1. 悪意のあるポストチェックアウトフックスクリプトがhooksディレクトリに追加される。チェックアウト後のスクリプトがユーザーのデバイス上で実行できるように、このフックを作成するbashスクリプトにはchmod +x fast/hooks/post-checkoutコマンドが含まれている。 
Gitのポストチェックアウトフックに埋め込まれた、悪意を持ってエンコードされたPythonコマンドを表示するターミナルスクリプト
  1. .gitディレクトリを指すシンボリックリンクがメインリポジトリに作成されます。
インクルードユーティリティとリポジトリの .git ファイルに変更をコミットするプロセスを示すターミナルスクリプトです。
リポジトリのディレクトリ一覧のスクリーンショット。src、libs、.gitmodules などのフォルダが Git インターフェースに表示されている。
脆弱なメインリポジトリ
Git リポジトリのインターフェイスのスクリーンショット。チェックアウト後のフックを持つディレクトリを示す。

チェックアウト後のフックを含む/hooksフォルダ

Gitリポジトリをクローンするためのターミナルコマンドと、ネットワーク接続が確立されたPowerShellセッションを示すスクリーンショット
ユーザーがこの悪意のあるリポジトリをクローンすると、攻撃者は被害者のデバイスを危険にさらすことができる。 

修復

脅威を無効化するために、ユーザはGitをアンインストールするか、最新のセキュリティパッチを適用することができる。あるいは、MetaDefender Endpoint ようなソリューションは、ユーザに迅速に通知し、その直感的なインターフェイスを通じて環境内のすべての既知のCVEを表示することができます。MetaDefender Endpoint 、300万を超えるデータポイントと30,000を超える関連CVEsの深刻度情報を持つ機能を活用することで、最新のCVEsを検出し、緩和することができます。 いずれかの対策を実施することで、CVEを完全に封じ込め、壊滅的なサイバー攻撃のリスクを排除します。

MetaDefender Endpoint サイバーセキュリティ戦略の最前線に据える準備はできていますか?


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

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