
Git に、RCE(リモートコード実行)攻撃を可能にする重大な脆弱性が最近公表され、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ファイルで、セキュリティ脆弱性が解決されたことを確認するためのテストスクリプトが追加された。

分析から利用へ
Gitにおけるシンボリックリンクとサブモジュールのワークフロー分析
パッチの分析と 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 はpost-checkoutフックスクリプトを.git/modules/query/fast/hooks/ディレクトリに書き込むよう誤って誘導されてしまいます。.git/modules/{module_type}/{module_name}/hooksフォルダ内にpost-checkoutフックスクリプトが見つかった場合、メインリポジトリが--recursiveオプション付きでクローンされると、そのスクリプトがトリガーされます。その結果、攻撃者はリモートコードを実行することで、ユーザーのデバイスを乗っ取ることが可能になります。

Git脆弱性の悪用シミュレーション
これまでの知見に基づき、OPSWAT フェローはメインリポジトリとフックを作成し、悪意のあるリポジトリを作成するシミュレーションを行った:
- まず、Git を設定して、protocol.file を常に許可し、core.symlinks を有効にし、デフォルトのブランチ名をmainに設定することをお勧めします(警告メッセージが表示されないようにするため)。

- 悪意のあるポストチェックアウトフックスクリプトがhooksディレクトリに追加される。チェックアウト後のスクリプトがユーザーのデバイス上で実行できるように、このフックを作成するbashスクリプトにはchmod +x fast/hooks/post-checkoutコマンドが含まれている。

- .gitディレクトリを指すシンボリックリンクがメインリポジトリに作成されます。




修復
この脅威を無効化するには、Git をアンインストールするか、最新のセキュリティパッチを適用してください。 あるいは、MetaDefender (Endpoint )のようなソリューションを利用すれば、直感的なインターフェースを通じて、環境内の既知のすべてのCVEをユーザーに迅速に通知・表示することができます。MetaDefender (Endpoint )は、300万件以上のデータポイントと、深刻度情報を伴う3万件以上の関連CVEを活用することで、最新のCVEを検知し、その影響を軽減します。いずれかの対策を講じることで、CVEは完全に封じ込められ、壊滅的なサイバー攻撃のリスクを排除することができます。
MetaDefender Endpoint サイバーセキュリティ戦略の最前線に据える準備はできていますか?
参考文献
(1) https://nvd.nist.gov/vuln/detail/CVE-2024-32002
(3) https://www.atlassian.com/git/
(5) https://www.vicarius.io/vsociety/posts/exploiting-git-rce-cve-2024-32002
