高朗

Google工程师本月修复了Go语言(Golang)中严重的远程代码执行(RCE)漏洞。

go get

来自不受信任目录中PATH查找的RCE

最近,总部位于日本的安全研究员 RyotaK在Golang项目中发现了一个命令注入漏洞。

漏洞跟踪为CVE-2021-3115,其原因是当用户运行“ go get”命令来获取存储库时,编译过程的工作方式。

通常,在Windows系统上,用户运行的OS Shell命令或程序使外壳程序首先在当前目录内搜索与该命令关联的二进制/可执行文件,然后在系统PATH变量中指定目录列表。

netstat
测试Windows PATH查找
 在Windows命令提示符下键入netstat,而不在PowerShell中键入,将运行本地存在的netstat.bat 而不是系统实用程序
来源:BleepingComputer

如果 当前文件夹中不 存在netstat,则只有Windows Shell才会查找 netstat 系统实用程序,该实用程序的位置位于Windows  %PATH%变量中。 

由于与此行为相关的安全风险,Unix Shell和Windows PowerShell在执行命令时都早先放弃了此默认行为,并开始将%PATH%变量位置优先于不受信任的当前目录。

这意味着, 在PowerShell中运行netstat将启动netstat系统实用程序,而不是本地存在的netstat.bat,因为PoweShell会优先在%PATH%目录中按该名称查找二进制文件。

但是,为了保持一致性,Golang二进制文件在Unix系统上模仿了Unix规则,而在Windows上模仿了Windows规则。

这意味着,运行以下Go命令将在Unix和Windows系统上产生稍微不同的行为。

out, err := exec.Command("go", "version").CombinedOutput()
go version

在Windows上,本地存在的 go 二进制文件将具有优先权,而Unix系统将首先搜索其$ PATH变量以查看go 二进制文件是否 在受信任位置之一中。

通过PATH中包含的帮助程序库和编译器(例如cgo, 一种旨在生成用于调用C代码的Go程序包的实用程序),也可以实现这种对PATH位置上的本地不受信任目录进行优先级排序的模型 。 

cgo 在Windows上编译C代码时,最终,Golang可执行文件首先在(不可信)本地目录中搜索GCC编译器。

“当go get下载并构建包含导入“ C”的软件包时,它将运行名为cgo的程序以准备与相关C代码等效的Go。

Google工程师Russ Cox解释说:“ go命令在包含软件包源的目录中运行cgo。”

尽管大多数此类调用均以安全的方式进行,但Go的exec.Command 函数会调用GCC编译器,该 函数在Windows上使Go能够启动 攻击者在其应用程序源中包含的恶意 gcc.exe,而不是在其应用程序源中合法的GCC编译器。

看来这种不幸可能已经被调用的多个中间编译器和库(例如cgogcc)捕获并阻止了,但是Golang项目对错误负责,并发布了修复程序。 

“但是,今天的错误完全是我们的错,而不是gccgit的错误或晦涩的功能。”

Cox说: “该错误涉及Go和其他程序如何查找其他可执行文件,因此我们需要花一点时间来仔细研究一下。”

研究人员受到早期关键漏洞的启发

BleepingComputer与 RyotaK接触, 以了解有关他如何发现此漏洞的更多信息。

事实证明,读到Git LFS中的一个关键命令注入漏洞CVE-2020-27955,是促使研究人员寻找Golang本身类似漏洞的原因。

“我发现此漏洞的原因是CVE-2020-27955。这是Git LFS中的远程代码执行,这是由不安全的文件执行引起的。”

“在检查[bug]的技术细节时,我想像’此漏洞会受到官方Go项目的影响吗?’”

“然后,我开始阅读属于golang组织的存储库。此后不久,我发现了此漏洞以及其他一些具有相同根本原因的漏洞。”

“由于此漏洞可能允许执行任意代码,同时建立在Windows的恶意代码,它可能会影响预期不会去在构建时执行任意代码系统,”  RyotaK 告诉BleepingComputer在一封电子邮件采访。

但是,为了使远程攻击者能够利用此漏洞,用户需要对恶意存储库运行go get 命令。

研究人员进一步对BleepingComputer表示:这需要受害者进行一些互动;他们需要对恶意存储库进行“获取”操作

Google的Golang团队已修复了该漏洞,建议用户升级实例。

用户可以升级到最近发布的Go版本 1.14.14  (适用于1.14.x和更早版本)和1.15.7(适用于1.15.x的用户)以缓解此漏洞。

此外,Google开发人员还发布了针对加密漏洞的补丁CVE-2021-3114,该漏洞由Catena cyber的Philippe Antoine在同一版本中报道。

预计即将发布的Go 1.16rc1版本还将包含针对CVE-2021-3114和CVE-2021-3115的修复程序。

*编译:Domino

*来自:bleepingcomputer