近日,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 鉤子
使用 gitinit或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 Fellows 檢查了修補版本中針對 CVE-2024-32002 漏洞所做的變更,他們發現有兩個檔案已更新來處理此 CVE。
更新的檔案之一是submodule--helper.c檔案,其中包含處理 Git子模組複製的程式碼。修補版中的新 commit 包括以下兩個:
- 新增dir_contains_only_dotgit函式,以確保 submodules 目錄不包含任何.git檔案或目錄。
- 對clone_submodule()函式進行了修改,加入了檢查子模組目錄是否存在且為空的條件。如果目錄不是空的,複製過程將會中止。
新提交中的第二項更新是在 t/t7406-submodule-update.sh 檔案中,新增了一個測試腳本,以驗證安全漏洞是否已被解決。
從分析到開發
除了從修補程式分析與 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 會被誤導將檢查後的掛鉤腳本寫入.git/modules/query/fast/hooks/目錄。如果在 .git/modules/{module_type}/{module_name}/hooks資料夾中找到檢查後掛鉤腳本,當使用--recursive選項複製主套件庫時,它就會被觸發。因此,攻擊者可透過執行遠端程式碼,成功控制使用者的裝置。
模擬利用 Git 漏洞
根據之前的發現,OPSWAT Fellows 建立了一個主儲存庫及鉤子,以模擬建立惡意儲存庫:
- 一開始,建議設定 Git 永遠允許使用protocol.file、啟用core.symlinks,並將預設分支名稱設定為main(避免警告訊息)。
- 一個惡意的結帳後掛鉤腳本被加入到hooks目錄中。為了確保結帳後的腳本可以在使用者的裝置上執行,建立這個鉤子的 bash 腳本包含chmod +x fast/hooks/post-checkout 指令。
- 主套件庫中會建立一個符號連結,指向.git目錄。
/hooks資料夾中的結帳後鉤子
修復
要解除威脅,使用者可以解除安裝 Git 或套用最新的安全修補程式。另外,像MetaDefender Endpoint 這樣的解決方案也能及時通知使用者,並透過直覺式介面顯示環境中所有已知的 CVE。MetaDefender Endpoint 可利用其擁有超過 300 萬個資料點和 30,000 多個相關 CVE(含嚴重性資訊)的功能,偵測並緩解最新的 CVE。 只要實施其中一種對策,CVE 就能完全受到控制,消除毀滅性網路攻擊的風險。
您準備好將MetaDefender Endpoint 置於網路安全策略的前線了嗎?