AI 驅動的網路攻擊:如何偵測、預防及抵禦智慧型威脅

立即閱讀
我們利用人工智慧進行網站翻譯,雖然我們力求準確性,但它們可能並不總是 100% 精確。感謝您的理解。

分析和修復 Git 漏洞 CVE-2024-32002

by OPSWAT 發布
分享此文章
Minh Pham 和 Thai Do,胡志明理工大學學生,曾參加OPSWAT 研究員計畫
學生參加了 OPSWAT 獎學金計劃。

近日,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 版本。此漏洞可在不區分大小寫的作業系統上啟用符號連結支援的環境中被攻擊。 

由 GitHub, Inc. 提供的 CVSS (Common Vulnerability Scoring System) 3.x 嚴重性與向量資訊,基本分數為 9.0,標示為嚴重。

瞭解 Git

Git 是一套免費且開放原始碼的分散式版本控制系統,旨在協助軟體開發人員快速且有效率地管理程式碼庫。它以標準化、結構化的方式組織並跟蹤檔案和目錄的變更,從而增強開發團隊成員間的協作。 

Git 廣泛應用於軟體開發。GitHub、GitLab 和 Bitbucket 等平台建立在 Git 之上,因其強大的功能而增強了開發人員之間的協作: 

  • 記錄程式碼檔案的可追蹤變更,稱為提交。 
  • 必要時將程式碼編輯回滾到先前的版本。 
  • 有效結合來自不同分支或貢獻者的變更。 
  • 記錄作出變更的人員及其日期。
.git 資料夾結構的視覺表示,顯示 config、HEAD、hooks、objects 及 refs 等目錄。

Git 鉤子 

使用 gitinitgit clone命令創建或克隆 Git 倉庫時,會在工作樹的根部生成一個.git目錄。.git目錄的目錄結構最初是這樣的 

Git 鉤子是可執行的腳本,位於.git/hooks目錄或.git/modules/module_type/module_name/hooks目錄。當 Git 倉庫中發生特定事件時,鉤子會自動被觸發。  

當 hooks 目錄中的檔案沒有.sample後綴時,該檔案中的指令會在檔案名稱中包含的特定 Git 動作之前或之後執行,例如pre-commit、post-commitpost - checkout。 

Git 子模組

Git 子模組是 Git 倉庫中引用外部倉庫中特定提交的記錄。當一個子模組被添加到一個倉庫時,.gitmodules目錄中會創建一個新檔案,其中包含子模組的 URL 和其本地目錄之間的映射的元資料。當倉庫包含多個子模組時,.gitmodules檔案會包含每個子模組的項目。[3] 

顯示儲存庫和子模組互動的圖表,說明儲存庫 A、子模組 B 和資料夾 C 之間的關係
.gitmodules 檔案內容範例,展示命名為 "Example" 的子模組的設定
下圖顯示了 .gitmodules 檔案的外觀: 

符號連結 (Symlinks)

符號連結也稱為 symlink 或軟連結,是透過指定路徑指向另一個檔案或目錄 (稱為「目標」) 的檔案。如果刪除符號連結,其目標仍不受影響。[4] 

在 Git 中,symlink 被創建為一個帶有元資料的檔案,使其具有作為另一個檔案的引用或快捷方式的功能。Symlink 可以用來對一個檔案創建多個參照,而不會複製其內容。

圖表說明檔案 (檔案 A) 的符號連結和硬連結,顯示這些連結如何存取相同的檔案內容
Git 將符號連結視為專門的檔案,儲存它們所引用的檔案或目錄的路徑。 
Git 倉庫內符號連結的可視化,展示目錄和檔案結構及其符號連結路徑
當包含符號連結的儲存庫或分支被克隆或簽出時,儲存在 Git 中的符號連結會被轉換為本機檔案系統上的符號連結。 

GIT 安全漏洞分析

修補程式分析

為了深入瞭解安全弱點,安全專家通常會執行修補程式分析。這是一種有助於識別脆弱功能和潛在攻擊媒介的技術。 OPSWAT Fellows 檢查了修補版本中針對 CVE-2024-32002 漏洞所做的變更,他們發現有兩個檔案已更新來處理此 CVE。

更新的檔案之一是submodule--helper.c檔案,其中包含處理 Git子模組複製的程式碼。修補版中的新 commit 包括以下兩個:  

  1. 新增dir_contains_only_dotgit函式,以確保 submodules 目錄不包含任何.git檔案或目錄。
Git 介面中名為 submodule-helper.c 檔案的程式碼變更,顯示 83 個新增項目,沒有刪除項目
  1. clone_submodule()函式進行了修改,加入了檢查子模組目錄是否存在且為空的條件。如果目錄不是空的,複製過程將會中止。 
來自 Git 提交的詳細程式碼片段,強調在子模組操作中檢查目錄內容的函式

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

擴充了測試檔案 T7406-submodule-update.sh 中的程式碼修改,詳細說明了子模組路徑和 symlink 的測試配置

從分析到開發

Git 中 Symlinks 與 Submodules 的工作流程分析

除了從修補程式分析與 CVE-2024-32002 漏洞描述中收集到的洞察力之外,OPSWAT 研究員也致力於調查 Git 中 symlink 與子模組的工作流程。他們分解了使用者複製儲存庫時所發生的一連串事件:

  1. Git 開始時會從主存放庫下載檔案和目錄。 
  2. 它利用 symlink 檔案中指定的定義,在本機檔案系統中重新建立相應的 symlink。  
  3. 如果交點連結指向現有檔案,則交點連結將可運作;否則,交點連結將一直無法運作,直到還原目標為止。  
  4. 如果使用--recursive選項克隆了倉庫,Git 會克隆子模組(外部倉庫),並將它們放置在 .gitmodules 檔案中指示的目錄路徑中。  
  5. 如果 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檔案所做的更新來建立惡意套件庫的情況,並將此過程細分為以下步驟:

  1. 建立包含結帳鉤子的儲存庫
終端程式碼片段展示了在 Git 中設定結帳後掛勾的指令,包括建立目錄和新增指令碼。
  1. 建立另一個包含子模組的儲存庫,位於A/modules/x路徑。新的子模組會引用先前建立的儲存庫。
示範使用 Git 指令新增子模組到儲存庫過程的終端程式碼片段
  1. 建立一個名為a 的符號連結,指向 Git 索引中的.git資料夾。 
高亮顯示在套件庫中建立和提交 .git 檔案的命令的終端機腳本範例
詳述惡意鉤子儲存庫被新增為主儲存庫的子模組,導致指令碼執行的攻擊情境流程圖
顯示攻擊者如何透過複製儲存庫來利用 CVE 的圖表 

瞭解安全漏洞

當使用者使用--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 建立了一個主儲存庫及鉤子,以模擬建立惡意儲存庫:

  1. 一開始,建議設定 Git 永遠允許使用protocol.file、啟用core.symlinks,並將預設分支名稱設定為main(避免警告訊息)。 
終端機片段展示了全局設定 Git 的 symlink 處理與預設分支設定的指令
  1. 一個惡意的結帳後掛鉤腳本被加入到hooks目錄中。為了確保結帳後的腳本可以在使用者的裝置上執行,建立這個鉤子的 bash 腳本包含chmod +x fast/hooks/post-checkout 指令。 
在 Git 結帳後鉤子中顯示惡意編碼 Python 指令的終端機腳本
  1. 主套件庫中會建立一個符號連結,指向.git目錄。
示範將變更提交到套件庫中的 include 工具和 .git 檔案的流程的終端機腳本
Git 介面中顯示的儲存庫目錄列表截圖,其中包含 src、libs 和 .gitmodules 等資料夾
易受損害的主要儲存庫
Git 儲存庫介面的擷取畫面,顯示有檢查後鉤子的目錄

/hooks資料夾中的結帳後鉤子

顯示用於複製 Git 儲存庫的終端命令和已建立網路連線的 PowerShell 會話的螢幕截圖
當使用者複製這個惡意儲存庫時,攻擊者就可以入侵受害者的裝置。 

修復

要解除威脅,使用者可以解除安裝 Git 或套用最新的安全修補程式。另外,像MetaDefender Endpoint 這樣的解決方案也能及時通知使用者,並透過直覺式介面顯示環境中所有已知的 CVE。MetaDefender Endpoint 可利用其擁有超過 300 萬個資料點和 30,000 多個相關 CVE(含嚴重性資訊)的功能,偵測並緩解最新的 CVE。 只要實施其中一種對策,CVE 就能完全受到控制,消除毀滅性網路攻擊的風險。

您準備好將MetaDefender Endpoint 置於網路安全策略的前線了嗎?


隨時瞭解OPSWAT 的最新資訊!

立即註冊,即可收到公司的最新消息、 故事、活動資訊等。