CVE-2019-12527:SQUID缓冲区溢出导致的远程代码执行

1au  1947天前

在趋势科技漏洞研究服务报告中,趋势科技研究团队的Saran Neti和Sivathmican Sivakumaran详细介绍了最近的Squid Web代理缓冲区溢出漏洞。未经身份验证的攻击者可以远程向目标服务器发送精心设计的请求来利用此漏洞,从而导致在Squid进程中执行代码。以下是他们文章的一部分,只有一些小修改。

Squid是一种流行的开源Internet代理和Web缓存应用程序。它可用于减少Web服务器上的带宽使用和需求,过滤网络流量,并通过本地缓存常用资源来加速Web访问。Squid支持各种网络协议,包括HTTP,FTP和Gopher。Squid支持代理转发,内部网络上的客户端通过Squid连接到外部网络上的服务器,反向代理外部网络上的客户端通过Squid连接到内部网络上的服务器。

背景和基础知识

在Squid中,提供了缓存管理器界面,用cachemgr.cgi以显示有关Web上Squid代理进程的统计信息。除了显示统计信息之外,缓存管理器还可用于管理缓存,而无需登录Squid服务器。

HTTP是RFC 7230-7237和许多其他RFC中描述的请求/响应协议。请求从客户端发送到服务器,服务器又将响应发送回客户端。HTTP请求由请求行,各种标题,空行和可选的消息正文组成:

Fig1.jpg

其中CRLF代表新的行序列回车(CR)跟换行(LF)。SP表示空格字符。参数可以在Request-URI或消息体中作为名称 - 值对从客户端传递到服务器,具体取决于使用的Method和Content-Type头。例如,使用GET方法传递名为paramvalue 的参数的简单HTTP请求1可能如下所示:

Fig2.jpg

HTTP支持多种身份验证方案,其中许多涉及使用Authorization标头。它具有以下格式:

Fig3.jpg

<type>的常用值包括“Basic”,“Digest”,“OAuth”和“Negotiate”。

漏洞

Squid存在缓冲区溢出漏洞。当Squid接收到传入的cachemgr请求时,将调用CacheManager::ParseHeaders()函数来解析请求的头部。如果报头包含一个以Basic开头的“授权”报头,则调用易受攻击的函数HttpHeader::getAuth()。

类似地,当Squid用作FTP代理并且请求的uri以“FTP”开头的时候,将调用HttpHeader::getAuth()函数。

getAuth()函数使用一个8192字节的缓冲区(涉及AuthToken的解码),它会使用base64_decode_update()对凭证进行base64解码。如果解码的结果超过8192字节,就会发生缓冲区溢出。

攻击者可以通过远程向目标服务器发送精心设计的HTTP请求来利用此漏洞。成功利用将导致攻击者能够使用服务器进程的权限执行任意代码,而不成功的攻击将导致服务器进程异常终止。

源代码

以下代码块取自Squid 4.7版。趋势科技添加了一些注释。

在src/cache_manager.cc:

Fig4.jpg

在src/clients/FtpGateway.cc:

Fig5.jpg

在src/HttpHeader.cc:

Fig6.jpg

最后,在lib/ba se64.c:

Fig7.jpg

触发漏洞

以下数据包解码说明了从客户端到目标Squid代理的攻击请求的片段:

attackpacket.jpg

如前所述,标准Authorization标头的格式为:

Fig8.jpg

在“Authorization:Basic”之后的一串字符串,只有一部分在以上这个片段中可见。当整个字符串被base64解码时,将溢出8192字节的缓冲区。注意,base64解码过程产生的输出是输入长度的3/4,因此,对于成功的攻击,传输的字符串实际上必须比8192字节长得多。

补丁

通过漏洞的提交,Squid维护人员修复了这个漏洞。在注释中,他们注意到通过用SBuf替换用于解码base64令牌的固定大小的缓冲区,可以避免在输入时出现解码器问题,从而修复了漏洞。他们还将调用更新为SBuf API操作,以便更高效地管理内存。

本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://www.thezdi.com/blog/2019/8/22/cve-2019-12527-code-execution-on-squid-proxy-through-a-heap-buffer-overflow

最新评论

昵称
邮箱
提交评论