CVE-2019-12527: SQUID PROXY缓冲区溢出漏洞
2019-08-27 11:49:50 Author: www.secpulse.com(查看原文) 阅读量:213 收藏

Trend Micro研究人员在Squid web代理中发现一个缓冲区溢出漏洞,远程、未认证的攻击者可以通过发送伪造的请求到目标服务器,导致Squid进程环境代码执行。


本文是CVE-2019-12527漏洞的writeup。


Squid是一个非常受欢迎的开源互联网代理和web缓存应用,可以用来减小web服务器上的带宽使用和需求,过滤网络流量,通过本地缓存常用的资源来加速web访问。Squid支持多种不同的网络协议,包括HTTP, FTP和Gopher。Squid支持转发代理,即内网上的客户端通过Squid连接到外部网络上,逆向代理,即外部网络上的客户端通过Squid连接到内部网络上的服务器,拦截或透明代理,即Squid透明地解决客户端和服务器之间的连接。

背景

Squid中的缓存管理器接口cachemgr.cgi用来显示Squid代理进程上的数据。除了展示数据外,缓存管理器可以在不登入Squid服务器的情况下管理缓存。

HTTP是RFCs 7230-7237中描述的请求/响应协议。请求是从客户端发送给服务器的,然后服务器发送响应到客户端。HTTP请求中含有请求行、不同的首部、空行以及可选消息主体:

image.png

CRLF 表示Line Feed (LF)之后的新行序列Carriage Return (CR)。SR表示空字符。从客户端发送给服务器的参数可以name-value对的形式传递,根据Method和Content-Type header来确定name-value对的形式是Request-URI还是在消息主体中。比如,传递参数名param和值1的HTTP请求,使用GET方法如下所示:

image.png

HTTP支持多种认证方案,许多都使用Authorization header。格式如下所示:

image.png

<type>的值包括Basic、Digest、OAuth和Negotiate。

漏洞

缓冲区溢出漏洞存在于Squid中。当Squid接收到来自cachemgr的请求后,就会调用CacheManager::ParseHeaders()函数来分析请求的首部。比如,REQUEST-URI的HTTP请求就是以cache_object开始的。如果header中含有值Basic开始的Authorization header,就会调用有漏洞的HttpHeader::getAuth()函数。

HttpHeader::getAuth()函数使用8192字节缓存、decodedAuthToken,还使用base64_decode_update()对 <credentials>进行base64解码。如果解码得到的版本超过8192字节,就会发生缓冲区溢出。

远程攻击者可以通过发送伪造的HTTP请求到目标服务器来利用该漏洞。成功利用该漏洞可以让攻击者以服务器进程权限来执行任意代码,成功利用漏洞可以让服务器进程异常终止。

源代码检查

下面是Trend Micro对Squid version 4.7部分代码段做到注释:
src/cache_manager.cc:

image.png

src/clients/FtpGateway.cc:

image.png

src/HttpHeader.cc:

image.png

lib/base64.c:

image.png

漏洞触发

下面的包解码说明客户端到目标Squid代理的攻击请求分组:

image.png

标准Authorization header的格式如下:

image.png

在"Authorization: Basic"之后有一些字符串,只有一部分在该代码段中可见。整个字符串在base64解码后,结果会溢出8192字节缓存。

注:base64解码过程的输出是输入长度的3/4,所以攻击成功后传输的字符串长度长于8192字节。

补丁

Squid维护者已经发布了该漏洞的修复补丁。修复方式为将解码base64 token的固定大小的缓冲区用SBuf来替换以编码解码器问题。调用SBuf API操作可以使内存管理更加高效。

https://www.thezdi.com/blog/2019/8/22/cve-2019-12527-code-execution-on-squid-proxy-through-a-heap-buffer-overflow


文章来源: https://www.secpulse.com/archives/111345.html
如有侵权请联系:admin#unsafe.sh