CVE-2021-3115——Golang Windows版本 RCE漏洞
1月,谷歌工程師修復了Go語言(Golang)中的一個遠程代碼執行漏洞。該漏洞CVE編號為CVE-2021-3115,漏洞主要影響使用go get命令的Windows Go用戶。
非可信目錄路徑查找RCE
該漏洞是由日本安全研究人員RyotaK發現的,屬于命令注入漏洞。漏洞產生的根本原因是用戶運行go get命令來提取庫時編譯過程的工作原理造成的。
在Windows 系統中,用戶或程序運行的操作系統shell命令會引發shell 在當前目錄中搜索與該命令有關的二進制文件或可執行文件,然后在系統PATH變量中指定一個目錄列表。
比如,如果在Windows 命令窗口輸入netstat,Windows就會在當前目錄中搜索netstat.exe、netstat.bat或其他netstat.*可執行文件,這些搜索到的文件會優先執行。

測試Windows PATH查找
如果當前目錄中不存在netstat 相關的可執行文件,那么Windows shell就會查找netstat 系統工具,該系統工具位于 Windows %PATH% 變量中。
由于與該行為相關的安全風險,Windows PowerShell和Unix shell在執行命令時都已經放棄了該默認行為,開始優先處理非可信當前目錄上的%PATH% 變量位置。
也就是說,在PowerShell 中運行netstat 會啟動netstat系統工具,而不是本地的netstat.bat,因為PoweShell 會優先在%PATH% 目錄中搜索包含該名字的二進制文件。
為了保持一致性,Golang 二進制文件在Unix 系統中效仿了Unix 規則,在Windows 系統中效仿了Windows 規則。也就是說,運行下面的命令在Unix系統和Windows 系統中會產生不同的行為:
- out, err := exec.Command("go", "version").CombinedOutput()
在Windows 系統中,本地的Go二進制文件優先級高,而Unix 系統中會首先搜索$PATH 變量來確認其可信位置中是否存在go 二進制文件。
這種優先本地、非可信目錄的方法也在Go helper和編譯器中實現了,比如為調用C語言代碼生成Go包的工具——cgo。
Cgo在Windows系統中編譯C代碼時,Golang可執行文件首先會在非可信的本地目錄中搜索GCC編譯器。Cgo運行的go命令會包含包資源。因此,攻擊者可以利用cgo來啟動惡意的gcc.exe程序。
雖然該行為可能是由多個編譯器、庫等造成的,但是Golang Project決定修復該漏洞,并已經發布了補丁。
總結
研究人員RyotaK 稱該漏洞的發現是受CVE-2020-27955漏洞啟發,CVE-2020-27955是Git LFS中的命令注入漏洞,該漏洞是由于不安全的文件執行引發的Git LFS遠程代碼執行漏洞。
研究人員建議用戶升級到最新的Go v1.14.14版本來避免該漏洞的利用。
本文翻譯自:https://www.bleepingcomputer.com/news/security/google-fixes-severe-golang-windows-rce-vulnerability/如若轉載,請注明原文地址。