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

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