CVE-2022-24675 -栈溢出(耗尽)在Go的PEM解码器

Go栈溢出漏洞- CVE-2022-24675

几天前有报道称,新的Go版本1.18.1和1.17.9包含了对堆栈溢出漏洞的修复编码/ pem内置包,在解码函数。考虑到围棋在我们的客户和整个行业中的高人气,这次更新导致我们调查了之前版本中的漏洞。

我们发现新修复的bug——CVE-2022-24675——是在一个非常早期的版本中引入的(它存在于1.4版本中,可能在之前的一个小版本中引入),并且已经存在了至少8年。我们还发现CVE-2022-24675的公告没有任何细节,除了补丁、提交细节和一个测试用例。

CVE-2022-24675可以通过调用解码函数使用一个大缓冲区,其中包含了畸形的PEM数据。尽管攻击者需要对每个目标执行研究,以确定他们是否以及如何利用漏洞,但利用漏洞本身是微不足道的,而且可能会在目标应用程序上导致拒绝服务。

在这篇博文中,我们提供了漏洞的细节,谁会受到影响以及如何补救。

cve - 2022 - 24675是什么?

CVE-2022-24675是Go的PEM编码内置模块中的拒绝服务(DoS)漏洞。该漏洞影响1.18.0或1.17.8以下的所有Go版本。

的递归调用导致此Go漏洞解码函数通过decodeError在解码PEM数据时检测到错误,导致堆栈耗尽。输入必须足够大(如上所述,大于5MB)在最初的一期中),并且必须包含错误。

这里我们可以看到decodeError中检测到错误后调用的函数编码/ pem.go

func decodeError(data, rest []byte) (*Block, []byte) {p, rest:= Decode(rest) if p == nil {rest = data}返回p, rest}

CVE-2022-24675的影响是什么?

根据提交细节,该漏洞被描述为Stack Overflow,这可能是一个模糊的术语。堆栈缓冲区溢出漏洞可能导致非常危险的影响,如远程代码执行(RCE)。然而,在这种情况下,漏洞“仅仅”是堆栈耗尽,这最多可能导致拒绝服务。实际上,该补丁通过消除使用递归修复了对Decode的递归函数调用,该函数调用会导致堆栈溢出/耗尽。

谁会受到CVE-2022-24675的影响?

CVE-2022-24675影响1.18.0或1.17.8以下版本的Go,但只影响调用解码函数的一个大缓冲区包含了畸形的PEM数据-这种畸形数据的一个例子可以从这个CVE的测试用例中看到。

func TestCVE202224675(t *testing.T){//在CVE-2022-24675之前,此输入将导致堆栈溢出。输入:=[]字节(字符串。重复("-----BEGIN \n", 10000000))结果,休息:= Decode(input) if result != nil || !DeepEqual(rest, input) {t.Errorf(" %#v的编码解码为%#v", input, rest)}}

此CVE的测试用例-在CVE-2022-24675之前,输入将导致堆栈溢出/耗尽

JFrog平台易受CVE-2022-24675攻击吗?

经过内部调查,我们可以确认JFrog DevOps平台不容易受到CVE-2022-24675的攻击

如何补救CVE-2022-24675?

为了弥补这个Go DoS漏洞,我们建议将Go升级到1.18.1或1.17.9版本。如果不可能,我们强烈建议使用补丁哪个修复了漏洞解码功能的PEM的包装,通过删除DecodeError调用递归函数的函数。

保持最新的JFrog安全研究

在我们的JFrog安全研究团队中跟踪最新的发现和技术更新安全研究博客文章在推特上@JFrogSecurity

用JFrog Xray查找脆弱版本

除了暴露新安全漏洞和威胁,JFrog为开发人员和安全团队提供了方便的访问他们的软件的最新相关信息的自动安全扫描JFrog Xray SCA工具