微軟Visual Studio團隊服務專案經理Edward ThomsonMay在DevOps部落格提到,近日Git社群發現了Git存在一個可讓駭客執行任意程式碼的漏洞,他呼籲,開發者應盡速更新客戶端應用程式,而微軟也已經採取進一步防護,避免惡意程式碼儲存庫被推送到微軟的程式碼託管服務VSTS(Visual Studio Team Services)中。

這個代碼為CVE 2018-11235的安全漏洞,當用戶在惡意程式碼儲存庫中操作時,便有可能遭受任意程式碼執行攻擊。遠端程式碼儲存庫包含有子模組(Submodule)的定義以及資料,這兩者被綑綁在一起做為資料夾,提交到父程式碼儲存庫中。當這個程式碼儲存庫被遞迴複製時,Git一開始會將父儲存庫放到工作目錄中,接著準備複製子模組。

但Git隨後便會發現,他不需要複製子模組,因為子模組在之前提交到了父儲存庫,所以也已經被寫入到工作目錄中,這個子模組早存在於磁碟上。因此Git可以跳過抓取檔案的步驟,直接使用磁碟中工作目錄裡的子模組。

不過,也並非所有檔案都能被複製,當客戶端複製了一個程式碼儲存庫,其中的重要配置並無法從伺服器上取得,這包括.git或是config檔案的內容,另外,還有在Git工作流中特定時間點會被執行的腳本程式鉤子(Hook),像是Git會在文件寫入工作目錄時,就會執行Post-checkout鉤子。

而設置檔之所以不應從遠端伺服器複製,重要的原因之一便是,遠端伺服器可能會提供惡意程式碼,而這些程式碼是會被Git執行的。

這個CVE 2018-11235漏洞便是犯了這個錯誤,讓Git存在子模組設置漏洞。在子模組儲存庫被提交到父儲存庫,且從未實際複製過,子模組儲存庫中又可能存在已配置的鉤子,這時當使用者進行遞迴複製,精心設計的惡意父儲存庫會先被寫入工作目錄,Git接著讀取子模組,將這些子模組也寫入到工作目錄中,而最後一步,便會執行在子模組儲存庫裡任何的Post-checkout鉤子。

為了解決這個問題,現在Git客戶端會更仔細檢查子模組的資料夾名稱,包含..現在都為不合法的名稱,而且也不能是符號鏈結,所以這些檔案必須實際存在於.git的儲存庫資料夾中,而不能是在工作目錄裡。

Edward ThomsonMay提到,Git、VSTS與多數其他程式碼託管服務,現在皆會拒絕存在這樣子模組配置的儲存庫,以保護還沒更新的Git客戶端。Git 2.17.1還有Windows版的2.17.1客戶端軟體現已釋出,微軟呼籲開發者儘速更新。


Advertisement

更多 iThome相關內容