CVE-2022-30522 - Apache httpd " mod_sed "过滤器中的拒绝服务(DoS)漏洞

今年三月,我们发表分析Apache HTTP服务器中的漏洞mod_sed过滤模块,cve - 2022 - 23943,在这种情况下,由于缓冲区大小的错误计算,可能会触发拒绝服务(DoS)。
在分析Apache httpd漏洞及其补丁时,我们怀疑虽然修复解决了这个问题,但它产生了一个新的不想要的行为.我们的怀疑被证明是正确的:我们发现引入了另一种导致DoS的方法。虽然Apache将此漏洞的严重程度评为“低”,CVSS评分由NVD7.5(高)。我们对这个CVE的严重程度的评级是“中等”-由于一方面高DoS的影响和罕见的mod_sed安装在另一个底座上。
Apache的mod_sedFilter模块提供了操作服务器接收的请求的输入和输出流的能力,以及它的响应,基本上提供了与GNU的流编辑器工具sed.作为输入过滤器,它可以用于HTTP POST请求的主体,作为输出过滤器,它允许在发送到客户端之前修改服务器的响应。
这篇博客文章概述了Apache HTTP Server CVE-2022-30522漏洞,以及如何修复的指导,以及我们在研究此漏洞时发现的缓解选项。
Apache httpd漏洞CVE-2022-30522是什么?
CVE-2022-30522是一个拒绝服务漏洞mod_sed模块的Apache HTTP服务器。该漏洞仅影响Apache httpd 2.4.53(因为该漏洞源于CVE-2022-23943的不完整补丁)mod_sed过滤器用于请求或响应编辑。
此Apache httpd漏洞是由于在处理流缓冲区时试图优化内存分配而导致的。当缓冲区达到一定大小时,将它们相乘,以避免对内存分配函数执行多次调用。当发送大量数据时,Apache的内存限制会超过,这会导致进程中止,有效地导致拒绝服务。
CVE-2022-30522技术概述
Apache httpdmod_sed过滤器模块启用使用正则表达式模式用于输入和输出流修改,就像最初的GNU流编辑器一样。为了使用该模块,必须修改Apache httpd配置文件,将所需的过滤器添加到所需的路由或目录中。
下面的例子说明了如何做mod_sed可以用来编辑html文件的所有请求方法,使用一个模式,将请求正文中的每个字符替换为字母Z:

发布2GB的数据(2147483648字节)或更多mod_sed是否安装并配置了输入过滤器,导致处理程序进程调用ap_abort_on_oom ()在util.c由于OUT_OF_MEMORY.这是由于失败allocator_alloc,其中返回NULL,因为请求的分配大小大于APR_UINT32_MAX.后来abort_on_oom被调用。当从服务器请求2GB(或更多)数据时,也会发生相同的事件链,如下所示。
这将导致DoS错误。处理过程在这种类型的POST请求后终止。尽管看门狗重新启动了单个进程,但发送多个请求会导致所有处理程序进程崩溃,导致完整的DoS,服务器无法处理请求。
这是因为grow_buffer乘以缓冲区的大小,以避免重新分配的数量apr_pcalloc调用请求的缓冲区大小为4GB:
/*避免调用realloc的次数。如果行大小很大,例如2 MB */ if (newsize < *cursize * 2) {newsize = *cursize * 2;} /*对齐到4kb边界*/ newsize = (newsize + ((1 << 12) - 1)) & ~((1 << 12) - 1);Newbuffer = apr_pcalloc(pool, newsize);
实际上有两种崩溃流:
- 当提交2GB的数据时,原始缓冲区的复制是成功的,并且需要在它的末尾添加一个NULL结束符。在本例中,调用
allocator_alloc缓冲区大小为4GB是试图将缓冲区大小增加1以为NULL腾出空间的结果。这发生在sed_finalize_eval:
- 当提交超过2GB的数据时,即2GB + 1byte,当尝试重新分配目标持有缓冲区时,在原始缓冲区可以完整复制之前,同样的事情也会发生。这发生在
sed_eval_buffer:
注意,这个问题也与输出过滤器相关,下面的配置将产生相同的结果请求从服务器获取一个>=2GB的文件:

碰撞流是相同的,除了它起源于sed_response_filter入口点而不是sed_request_filter:

谁会受到CVE-2022-30522的影响?
CVE-2022-30522影响Apache HTTP服务器的2.4.53版本mod_sedFilter模块用于编辑请求或响应。此问题在2.4.54版本中修复。
最严重的影响是时间mod_sed用于编辑请求,因为在这种情况下,攻击者只需向使用sed筛选器的端点发送大量数据就可以远程触发漏洞。
如上所示,这是一个易受攻击的配置示例

中定义的实际sed模式输入没关系,它必须是非空的)
CVE-2022-30522的影响是什么?
利用此漏洞需要在请求正文中发送大量数据(2GB或更多),并且具有mod_sed配置为处理该数据。这将导致一个HTTP服务器进程的DoS和短暂停机。通过长时间向服务器发出多个请求来进行的攻击可能会导致完全的DoS,因为所有服务器的进程都会反复关闭,任何网页都将无法访问。
如何修复CVE-2022-30522?
要修复此Apache httpd漏洞,我们建议将Apache httpd升级到最新版本,目前是2.4.54。如果不可能升级,我们强烈建议应用补丁中修复此漏洞的方法mod_sed过滤模块。
CVE-2022-30522有哪些缓解选项?
如果无法将Apache HTTP服务器升级到最新版本或应用补丁,我们建议限制POST方法的主体大小,这样就不会触发漏洞。要做到这一点,需要使用LimitRequestBody指令在Apache httpd配置文件中。
该指令可用于设置从0到2GB数据的请求大小限制。建议设置一个限制,以防止POST请求体大于1GB的数据,例如:
LimitRequestBody 1073741824
注意,此缓解措施仅提供针对由客户端请求引起的DoS的保护,但仍然使服务器容易受到DoS的攻击mod_sed用于修改web响应,大于2GB的响应发送给客户端。
与JFrog安全研究保持最新
在我们的JFrog安全研究团队中跟踪最新的发现和技术更新安全研究博客文章在推特上@JFrogSecurity.
找到易受攻击的版本与JFrog x射线
除了曝光新安全漏洞威胁来自我们的研究团队,我们的JFrog x光SCA工具通过自动安全扫描,为开发人员和安全团队提供方便地访问其软件的最新相关安全洞察。
