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

几天前,据报道,新的Go版本1.18.1和1.17.9包含了对堆栈溢出漏洞的修复编码/ pem内置包,在解码函数。鉴于Go在我们的客户和整个行业中非常受欢迎,这次更新使我们调查了以前版本中的漏洞。
我们发现这个新修复的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版本。
的递归调用解码函数通过decodeError在解码PEM数据时检测到错误导致堆栈耗尽后,启用该功能。输入必须足够大(如前所述大于5MB)在最初的问题中),并且必须包含错误。
这里我们可以看到decodeError中检测到错误后调用的函数编码/ pem.go:
func decodeError(data, rest []byte) (*Block, []byte) {p, rest:= Decode(rest)如果p == nil {rest = data}返回p, rest}
CVE-2022-24675的影响是什么?
根据提交细节,该漏洞被描述为堆栈溢出,这可能是一个模棱两可的术语。堆栈缓冲区溢出漏洞可能导致非常危险的影响,例如远程代码执行(RCE)。然而,在这种情况下,漏洞“仅仅”是堆栈耗尽,最多可能导致拒绝服务。实际上,该补丁修复了对Decode的递归函数调用,该函数通过消除递归的使用来导致堆栈溢出/耗尽。
谁受到CVE-2022-24675的影响?
CVE-2022-24675影响1.18.0或1.17.8以下的所有Go版本,但只影响调用解码函数,其中包含一个大型缓冲区,其中包含错误的PEM数据-从该CVE的测试用例中可以看到此类错误数据的示例。
function TestCVE202224675(t *testing.T){//在CVE-2022-24675之前,这个输入会导致堆栈溢出。输入:= []byte(字符串)。Repeat("-----BEGIN \n", 10000000)) result, rest:= Decode(input) if result != nil || !reflect。DeepEqual(rest, input) {t.r error (" encoding of %#v解码为%#v", input, rest)}}
此CVE的测试用例-在CVE-2022-24675之前,输入将导致堆栈溢出/耗尽
JFrog平台是否易受CVE-2022-24675攻击?
经过内部调查,我们可以确认2022世界杯32强赛程表时间 不受CVE-2022-24675攻击
如何修复CVE-2022-24675?
为了修复这个Go DoS漏洞,我们建议将Go升级到1.18.1或1.17.9版本。如果不可能,我们强烈建议使用补丁的漏洞修复解码通过移除电源包的DecodeError函数,其中调用递归函数。
与JFrog安全研究保持同步
关注JFrog安全研究团队的最新发现和技术更新安全研究博客文章并在推特上@JFrogSecurity.
使用JFrog Xray查找易受攻击的版本
除了暴露新安全漏洞通过自动安全扫描,JFrog为开发人员和安全团队提供了轻松访问其软件最新相关信息的方法JFrog Xray SCA工具.
