CVE-2021-38297 - Go Web程序集漏洞分析

cve - 2021 - 38297

JFrog安全研究团队持续监测开源软件(OSS)中报告的漏洞,以帮助我们的客户和更广泛的社区了解潜在的软件供应链安全威胁及其影响。在这样做的过程中,我们经常注意到值得强调的重要趋势和关键知识。下面分析一脆弱性发现于Golang(“Go”)编程语言的目的是强调在评估企业系统面临的风险时,拥有适当的CVE评级和适当的上下文的重要性。

虽然这个Go漏洞并不是新的,但JFrog安全研究团队确定有许多新的Docker容器仍然容易受到这个漏洞的攻击。此外,虽然此漏洞从双方获得了严重程度评分NVD9.8 CVSS),GitHub在美国,随后没有针对该问题的公开利用或技术文章发表,这导致我们猜测此漏洞的现实影响。

在这篇博客文章中,我们将详细阐述利用Go漏洞的先决条件,该漏洞允许攻击者用自己的恶意代码覆盖整个Wasm (WebAssembly)模块并实现WebAssembly代码执行,并为无法将Go实例升级到其中一个的开发人员探索缓解策略固定的版本(1.16.9, 1.17.2或更高版本)。

什么是WebAssembly?

WebAssembly(缩写为Wasm)为可执行程序定义了一种可移植的二进制代码格式,以简化可执行程序与其宿主环境之间的交互。

WebAssembly使得在网页上运行高性能应用成为可能。

用C/ c++或其他编程语言编写的常规程序可以编译为Wasm,然后可以加载到web浏览器中。这代替了在浏览器中执行代码的“常规方式”——JavaScript。Wasm程序运行在沙箱中,因此它不能访问主机文件系统,也不能在web浏览器之外执行代码。

CVE-2021-38297如何被利用?

此CVE仅影响1.16.9或1.17.2之前版本的Go编程语言的用户。任何这些版本的用户都必须专门加载由Go编译的Wasm模块,并接受来自外部源的命令行参数或环境变量。

具体来说,Go编译器支持构建用Go编写的Wasm模块,这可以通过运行编译器轻松完成,如下所示-

GOARCH=wasm go build -o main.wasm

在编译Wasm模块之后,JavaScript引擎可以在两种不同的场景中执行它——

1.通过web浏览器执行Wasm

下面的JS客户端代码演示了如何加载Go Wasm模块,同时向模块发送命令行参数(argv)。此代码容易受到CVE-2021-38297的攻击,因为发送给Go模块的命令行参数(go.argv)会受到外部输入(即External_argument查询参数) - - -