CVE-2022-30522 - Apache httpd“mod_sed”过滤器中的拒绝服务漏洞

今年三月,我们发布分析Apache HTTP服务器存在漏洞mod_sed过滤模块,cve - 2022 - 23943,在这种情况下,由于缓冲区大小的错误计算,可能会触发拒绝服务(DoS)。
在分析Apache httpd漏洞及其补丁时,我们怀疑虽然修复解决了这个问题,但它创建了一个新的不想要的行为.我们的怀疑被证明是正确的:我们发现另一种导致DoS的方式被引入。虽然Apache将这个漏洞的严重性评为“低”,由NVD高7.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 httpd 2.4.53(因为该漏洞源于CVE-2022-23943的不完整补丁)mod_sed过滤器用于请求或响应编辑。
这个Apache httpd漏洞是由于在处理流缓冲区时试图优化内存分配而导致的。当缓冲区达到一定大小时,将它们相乘以避免对内存分配函数执行多次调用。当发送大量数据时,Apache的内存限制将被超过,这将导致进程中止,从而有效地导致拒绝服务。
CVE-2022-30522技术总结
Apache httpdmod_sedFilter模块使正则表达式模式的使用用于输入和输出流修改,就像最初的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:
请注意,这个问题也与Output Filters相关,下面的配置会产生相同的结果请求a >=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 Xray查找易受攻击的版本
除了暴露新安全漏洞威胁来自我们的研究团队,我们的JFrog x光SCA工具通过自动安全扫描,使开发人员和安全团队可以轻松访问其软件的最新相关安全见解。

