
Git 近期被揭露存在一項關鍵漏洞,該漏洞可能導致 RCE(遠端程式碼執行)攻擊,影響多個版本的 Git 以及 Microsoft Visual Studio 2017。 此漏洞使攻擊者能利用子模組(submodules)來操控 Git 儲存庫,其利用了 Git 中的某個錯誤,該錯誤允許將檔案寫入子模組的工作樹之外,並存入.git/目錄中。此錯誤使得在儲存庫複製操作仍在進行時,便能執行惡意鉤子(hook)[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後綴時,該檔案中的指令會在檔案名稱中包含的特定 Git 動作之前或之後執行,例如pre-commit、post-commit 和post - checkout。
Git 子模組
Git 子模組是 Git 倉庫中引用外部倉庫中特定提交的記錄。當一個子模組被添加到一個倉庫時,.gitmodules目錄中會創建一個新檔案,其中包含子模組的 URL 和其本地目錄之間的映射的元資料。當倉庫包含多個子模組時,.gitmodules檔案會包含每個子模組的項目。[3]


符號連結 (Symlinks)
符號連結也稱為 symlink 或軟連結,是透過指定路徑指向另一個檔案或目錄 (稱為「目標」) 的檔案。如果刪除符號連結,其目標仍不受影響。[4]
在 Git 中,symlink 被創建為一個帶有元資料的檔案,使其具有作為另一個檔案的引用或快捷方式的功能。Symlink 可以用來對一個檔案創建多個參照,而不會複製其內容。


GIT 安全漏洞分析
修補程式分析
為了更深入地了解安全漏洞,資安專家通常會進行修補程式分析。這是一種有助於識別存在漏洞的功能及潛在攻擊向量的技術。OPSWAT 研究員檢視了為解決 CVE-2024-32002 漏洞而在修補版本中進行的變更,並發現有兩個檔案經過更新以解決此 CVE 漏洞。
更新的檔案之一是submodule--helper.c檔案,其中包含處理 Git子模組複製的程式碼。修補版中的新 commit 包括以下兩個:
- 新增dir_contains_only_dotgit函式,以確保 submodules 目錄不包含任何.git檔案或目錄。

- 對clone_submodule()函式進行了修改,加入了檢查子模組目錄是否存在且為空的條件。如果目錄不是空的,複製過程將會中止。

新提交中的第二項更新是在 t/t7406-submodule-update.sh 檔案中,新增了一個測試腳本,以驗證安全漏洞是否已被解決。

從分析到開發
Git 中 Symlinks 與 Submodules 的工作流程分析
除了從修補程式分析與 CVE-2024-32002 漏洞描述中收集到的洞察力之外,OPSWAT 研究員也致力於調查 Git 中 symlink 與子模組的工作流程。他們分解了使用者複製儲存庫時所發生的一連串事件:
- Git 開始時會從主存放庫下載檔案和目錄。
- 它利用 symlink 檔案中指定的定義,在本機檔案系統中重新建立相應的 symlink。
- 如果交點連結指向現有檔案,則交點連結將可運作;否則,交點連結將一直無法運作,直到還原目標為止。
- 如果使用--recursive選項克隆了倉庫,Git 會克隆子模組(外部倉庫),並將它們放置在 .gitmodules 檔案中指示的目錄路徑中。
- 如果 symlink 是子模組路徑的一部分(例如util/module/test,其中util是指向另一個目錄的 symlink,例如 symlink_folder),Git 會將子模組的內容存放在 symlink 所引用的實際目錄(例如symlink_folder/module/test)中,同時允許通過原始的 symlink 路徑進行存取。

瞭解 CVE-2024-32002 Git 安全漏洞
建立惡意儲存庫
OPSWAT Fellows 進一步檢視了根據t/t7406-submodule-update.sh檔案所做的更新來建立惡意套件庫的情況,並將此過程細分為以下步驟:
- 建立包含結帳後鉤子的儲存庫

- 建立另一個包含子模組的儲存庫,位於A/modules/x路徑。新的子模組會引用先前建立的儲存庫。

- 建立一個名為a 的符號連結,指向 Git 索引中的.git資料夾。


瞭解安全漏洞
當使用者使用--recursive選項複製上一個步驟中建立的惡意儲存庫時,就會觸發檢查後鉤子中的惡意指令碼,讓攻擊者入侵使用者的裝置。
發生此遠端程式碼執行的原因是主套件庫偵測到一個名為a的符號連結,該符號連結在複製時指向.git目錄。啟用遞迴模式後,子模組也會被拉到複製的資源庫中。此儲存庫包含一個 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 Fellows 建立了一個主儲存庫及鉤子,以模擬建立惡意儲存庫:
- 建議在初期將 Git 設定為始終允許protocol.file,啟用core.symlinks,並將預設分支名稱設為main(以避免出現警告訊息)。

- 一個惡意的結帳後掛鉤腳本被加入到hooks目錄中。為了確保結帳後的腳本可以在使用者的裝置上執行,建立這個鉤子的 bash 腳本包含chmod +x fast/hooks/post-checkout 指令。

- 主套件庫中會建立一個符號連結,指向.git目錄。




修復
為消除此威脅,使用者可卸載 Git 或套用最新的安全性修補程式。 此外,像MetaDefender Endpoint 這樣的解決方案,可透過其直觀的介面即時通知使用者,並顯示環境中所有已知的 CVE。MetaDefender Endpoint 則能運用其超過 300 萬個資料點及 30,000 多個附帶嚴重性資訊的相關 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
