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バージョンに影響する。大文字小文字を区別しないオペレーティング・システムでシンボリックリンクのサポートが有効になっている環境で悪用される可能性があります。
Gitを理解する
Gitはフリーでオープンソースの分散バージョン管理システムであり、ソフトウェア開発者がコードベースを迅速かつ効率的に管理できるように設計されています。ファイルやディレクトリの変更を標準化された構造化された方法で整理し追跡することで、開発チームメンバー間のコラボレーションを強化します。
Gitはソフトウェア開発で広く使われている。GitHub、GitLab、Bitbucketなどのプラットフォームは、その強力な機能により開発者間のコラボレーションを強化するためにGitの上に構築されている:
- コミットと呼ばれる、コードファイルへの追跡可能な変更を記録する。
- 必要に応じて、コードの編集を以前のバージョンにロールバックする。
- 異なるブランチやコントリビューターからの変更を効率的に組み合わせる。
- 誰がどのような変更を行ったか、その日付の履歴を記録しておくこと。

Gitフック
git initやgit cloneコマンドを使って Git リポジトリを作成したりクローンしたりすると、作業ツリーのルートに.gitディレクトリが作成されます。.gitディレクトリのディレクトリ構造は、最初はこのようになっています:
Git フックは実行可能なスクリプトで、.git/hooksディレクトリか.git/modules/module_type/module_name/hooksディレクトリにあります。フックは、Git リポジトリ内で特定のイベントが発生したときに自動的に起動します。
hooksディレクトリにあるファイルの接尾辞が.sampleでない場合、そのファイルに含まれるコマンドは、pre-commit、post-commit、post-checkoutといったファイル名に含まれる特定のGitアクションの前後で実行されます。
Gitサブモジュール
Git サブモジュールとは、外部リポジトリの特定のコミットを参照する Git リポジトリ内のレコードのことです。サブモジュールをリポジトリに追加すると、.gitmodulesディレクトリに新しいファイルが作成され、サブモジュールの URL とローカルディレクトリの対応関係がメタデータとして記録されます。リポジトリに複数のサブモジュールが含まれている場合、.gitmodulesファイルにはそれぞれのエントリが含まれます。[3]
シンボリックリンク(シンボリックリンク)
シンボリックリンクは、シンボリックリンクまたはソフトリンクとも呼ばれ、パ スを指定して別のファイルまたはディレクトリ(「ターゲット」と呼ばれる)を指 すファイルである。シンボリックリンクが削除されても、ターゲットは影響を受けません。[4]
Gitにおけるシンボリックリンクは、別のファイルへの参照やショートカットとして機能させるためのメタデータを持つファイルとして作成されます。シンボリックリンクを使うことで、ファイルの内容を複製することなく複数のファイルへの参照を作ることができます。
GITセキュリティ脆弱性分析
パッチ分析
セキュリティの脆弱性をより深く理解するために、セキュリティ専門家はしばしばパッチ分析を行う。これは、脆弱な機能や潜在的な攻撃ベクトルを特定するのに役立つ技術である。 OPSWAT フェローは、CVE-2024-32002 の脆弱性に対処するためにパッチが適用されたバージョンで行われた変更を調査し、この CVE に対処するために 2 つのファイルが更新されていることを発見しました。
更新されたファイルのひとつはsubmodule--helper.cファイルで、Git サブモジュールのクローンを処理するコードが含まれています。パッチが適用されたバージョンの新しいコミットには、次の2つが含まれています:
- dir_contains_only_dotgit関数を追加して、submodulesディレクトリに.gitファイルやディレクトリが含まれないようにしました。
- clone_submodule()関数に変更が加えられ、サブモジュールディレクトリが存在し、かつ空であるかどうかをチェックする条件が追加された。ディレクトリが空でない場合、クローン処理は中断されます。
新しいコミットでの2つ目の更新はt/t7406-submodule-update.shファイルで、セキュリティ脆弱性が解決されたことを確認するためのテストスクリプトが追加された。
分析から利用へ
パッチの分析と CVE-2024-32002 脆弱性の説明から得られた洞察に加え、OPSWAT フェローは Git におけるシンボリックリンクとサブモジュールのワークフローの調査に取り組んだ。彼らは、ユーザーがリポジトリをクローンするときに起こる一連の出来事を分解した:
- Gitは、プライマリリポジトリからファイルとディレクトリをダウンロードすることから始めます。
- これは、シンボリックリンクファイルで指定された定義を利用して、ローカルのファイルシステムに対応するシンボリックリンクを再作成する。
- シンボリックリンクが既存のファイルを指している場合、シンボリックリンクは機能する。そうでない場合、シンボリックリンクはターゲットが復元されるまで機能しないままである。
- recursiveオプションを指定してリポジトリをクローンした場合、Git はサブモジュール (外部リポジトリ) をクローンし、.gitmodules ファイルで指定したディレクトリパスに配置します。
- シンボリックリンクがサブモジュールのパスの一部である場合 (例えばutil/module/test のように、utilはsymlink_folder のような別のディレクトリを指すシンボリックリンクです)、Git はシンボリックリンクによって参照される実際のディレクトリ (例えばsymlink_folder/module/test) にサブモジュールの内容を保存します。
Git のセキュリティ脆弱性 CVE-2024-32002 を理解する
悪意のあるリポジトリの作成
OPSWAT フェローは、t/t7406-submodule-update.shファイルの更新に基づいて悪意のあるリポジトリが作成されることをさらに調査し、このプロセスを以下のステップに分類した:
- ポストチェックアウトフックを含むリポジトリの作成
- A/modules/xパスにあるサブモジュールを含む別のリポジトリを作成します。新しく作成されたサブモジュールは、以前に作成されたリポジトリを参照します。
- Gitインデックス内の.gitフォルダを指す、aというシンボリックリンクを作成します。
セキュリティの欠陥を理解する
ユーザーが--recursiveオプションを使用して、前のステップで作成された悪意のあるリポジトリをクローンすると、ポストチェックアウトフックの悪意のあるスクリプトがトリガーされ、攻撃者はユーザーのデバイスを危険にさらすことができます。
このリモートコード実行は、メインリポジトリがクローン時に.gitディレクトリを指すaというシンボリックリンクを検出するために発生します。再帰モードを有効にすると、サブモジュールもクローンされたリポジトリに取り込まれます。このリポジトリにはチェックアウト後のフックスクリプトを含む hooks フォルダがあり、そのローカルディレクトリはA/modules/x にあります。
a は.gitディレクトリを指しており、ファイルシステムでは大文字と小文字が区別されないため、Aはa と等価に解釈されます。Git はチェックアウト後のフックスクリプトを.git/modules/query/fast/hooks/ディレクトリに書き込むように惑わされます。チェックアウト後のフックスクリプトが .git/modules/{module_type}/{module_name}/hooksフォルダに見つかると、--recursiveオプションを指定してメインリポジトリをクローンしたときにそのスクリプトが起動します。その結果、攻撃者はリモートコードを実行することで、ユーザーのデバイスを侵害することに成功します。
Git脆弱性の悪用シミュレーション
これまでの知見に基づき、OPSWAT フェローはメインリポジトリとフックを作成し、悪意のあるリポジトリを作成するシミュレーションを行った:
- 最初は、protocol.fileを常に許可するようにGitを設定し、core.symlinksを有効にし、デフォルトのブランチ名をmainに設定することをお勧めします(警告メッセージを避けるため)。
- 悪意のあるポストチェックアウトフックスクリプトがhooksディレクトリに追加される。チェックアウト後のスクリプトがユーザーのデバイス上で実行できるように、このフックを作成するbashスクリプトにはchmod +x fast/hooks/post-checkoutコマンドが含まれている。
- .gitディレクトリを指すシンボリックリンクがメインリポジトリに作成されます。
チェックアウト後のフックを含む/hooksフォルダ
修復
脅威を無効化するために、ユーザはGitをアンインストールするか、最新のセキュリティパッチを適用することができる。あるいは、MetaDefender Endpoint ようなソリューションは、ユーザに迅速に通知し、その直感的なインターフェイスを通じて環境内のすべての既知のCVEを表示することができます。MetaDefender Endpoint 、300万を超えるデータポイントと30,000を超える関連CVEsの深刻度情報を持つ機能を活用することで、最新のCVEsを検出し、緩和することができます。 いずれかの対策を実施することで、CVEを完全に封じ込め、壊滅的なサイバー攻撃のリスクを排除します。
MetaDefender Endpoint サイバーセキュリティ戦略の最前線に据える準備はできていますか?