• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

整数溢出RCE漏洞分析(CVE-2021-44790)


Recommended Posts

在趋势科技漏洞研究服务的漏洞报告中,趋势科技研究小组的盖伊莱德费恩和杜桑斯蒂凡诺维奇详细介绍了Apache web服务器中最近出现的一个代码执行漏洞。该漏洞最初是由一位名叫Chamal的研究人员发现并报告的。精心设计的请求体可能会导致mod_lua多部分解析器中的缓冲区溢出,从而导致在安全进程的上下文中执行代码。Apache httpd的mod_lua模块中存在整数溢出漏洞。该漏洞是由于在模块的多方解析器中不正确验证请求正文造成的,该解析器由Lua脚本中的r:parsebody()函数调用。未经验证的远程攻击者可以通过向目标服务器发送精心编制的请求来利用此漏洞。成功利用该漏洞可能导致在服务器进程的安全上下文中远程执行代码,而不成功的攻击可能导致拒绝服务情况。

漏洞介绍

Apache服务器是互联网上最流行的web服务器。它可以使用许多不同的选项和配置,并可以使用各种运行时可加载的插件模块来扩展其功能。

官方插件模块之一是mod_lua模块。像所有其他模块一样,它可以编译成一个单独的共享库。所以“扩展。这个模块的目的是允许使用Lua编程语言编写的脚本来扩展HTTP服务器。如果模块加载在HTTP服务器配置文件中,您可以为以“.”结尾的文件设置lua-script处理程序。lua”。以下是一个配置示例:

是HTTP RFC 7230-7237和其他RFC中描述的请求/响应协议。向客户机发送请求,服务器向客户机发回响应。HTTP请求由请求行、各种标题、空行和可选的消息体组成:

其中CRLF代表回车(CR),后跟换行符(LF),SP代表空格字符。根据使用的方法和内容类型头,参数可以在请求URI或消息体中作为名称=值对从客户端传递到服务器。例如,一个简单的HTTP请求使用GET方法传递一个名为“param”的值为“1”的参数,可能如下所示:

使用POST方法的类似请求可能如下所示:

如果有多个参数/值对,它们将被编码为单独的名称=值对:

1=值1var2=值2var3=值3.HTTP POST请求主体中的数据可以使用各种标准化或专有的方法进行编码。一种标准化方法是RFC 2388中定义的多部分/形式数据。Multipart/form-data由几个部分组成,每个部分都包含一个Content-Disposition头。每个部分由一串字符分隔。分隔各部分的字符串由Content-Type标题行上的boundary关键字定义。Content-Type还必须设置为multipart/form-data。Content-Disposition头包含一个描述返回的表单元素的name参数。附加标题行可能出现在每个部分中,并且每行由新的行序列分隔。标题以两个连续的新行结束。下面是表单元素的数据。如果主体被分离并存储在单独的文件中,filename参数将提供一个建议的文件名。

mod_lua模块支持的内置函数之一是r:parsebody()。这个函数允许Lua脚本解析发送到服务器的HTTP POST请求的主体。该函数返回两个Lua表,其中包含从主体解析的参数的名称和值。该函数还支持用多部分/表单数据内容类型编码的HTTP POST请求。

Apache服务器中存在整数溢出漏洞。启用mod_Lua模块,在服务器解析的Lua脚本中调用r:parsebody()函数时,调用函数req_parsebody()。此函数检查服务器收到的HTTP POST请求是否包含字符串“multipart/form-data;boundary="开头的Content-Type标头指示请求正文是用multipart/form-data内容类型编码的。如果找到,该函数将搜索ContentType头中定义的边界字符串,并将其保存到multipart变量中。在多部分字符串的每一次匹配之后,该函数搜索两个连续的CRLF序列的第一次出现,并将它们存储在CRLF变量中。如果找到这个匹配项,该函数将在以下内容中搜索多部分变量的另一个匹配项,这些内容存储在end变量中,表示表单元素数据的结尾。

接下来,表单元素数据的大小是取结束变量,减去CRLF变量,然后减去8(表示元素数据前的两个CRLF序列,以及元素数据末尾的CRLF和“3354”字符)。但是,如果表单元素的格式不正确,以至于结束边界字符串出现在两个CRLF序列开始之后不到8个字符的范围内,这种减法将导致负数。减法的结果存储在名为vlen的size_t类型中。

的变量中。因此,如果减法结果为负数,会先转换成较大的正数再存入 vlen 变量,导致整数溢出。具体来说,如果减法结果为 -1,则 vlen 变量将包含 size_t 的最大大小。之后,在堆上分配了一个名为 buffer 的缓冲区,大小为 vlen+1。在上述情况下,这将导致整数溢出,导致分配大小为0的缓冲区。稍后,调用memcpy()函数将元素的数据复制到大小为vlen的缓冲区变量中,从而导致缓冲区溢出。

未经身份验证的远程攻击者可以通过向目标服务器发送带有精心设计的主体(使用 multipart/form-data 内容类型编码)的 HTTP POST 请求来利用此漏洞。成功利用可能导致在服务器进程的安全上下文下远程执行代码,而不成功的攻击可能导致拒绝服务条件。

攻击检测

检测设备必须检查对解析为 Apache 服务器上托管的 Lua 脚本的 URL 的所有 HTTP POST 请求。然后检测设备必须检查 Content-Type 标头并检查它是否设置为“multipart/formdata”。如果找到,检测设备必须检查来自 HTTP 主体中 Content-Type 标头的边界字符串的所有实例。对于找到的边界字符串的每个实例,检测设备必须在找到的边界之后搜索两个连续 CRLF 序列的第一个实例。如果找到,检测设备必须搜索边界字符串的下一个实例。如果找到,检测设备必须计算两个连续 CRLF 序列的开头和后面的边界字符串之间的字符数。如果字符数少于8个,则认为流量是恶意的;利用此漏洞的攻击可能正在进行中。

一个恶意请求示例是在两个连续 CRLF 序列的开头和结束边界字符串之间有 7 个字符。

请注意,字符串匹配必须以区分大小写的方式执行

总结

Apache 已使用 HTTP Server 2.4.52 修补了此漏洞。

Link to comment
Share on other sites