转载

Squid远程拒绝服务漏洞分析

【简介】

Squid Cache是HTTP代理服务器软件。Squid用途广泛的,可以作为缓存服务器,可以过滤流量帮助网络安全,也可以作为代理服务器链中的一环,向上级代理转发数据或直接连接互联网。 

2016年2月23日。Squid官方发布了安全公告,指出修复多个远程拒绝服务漏洞( http://www.squid-cache.org/Advisories/SQUID-2016_2.txt ),这几个漏洞危害较大,只需要一个HTTP请求即可远程DoS squid cache server。 

【分析】

笔者对其中一个漏洞补丁进行了分析,发现漏洞的缘由主要由assert函数引起的( http://www.squid-cache.org/Versions/v3/3.5/changesets/squid-3.5-13991.patch ) 。

Assert函数在C程序中称为断言(assertion),用来提示一些可能存在的错误。主要用于程序调试。 

函数用法:

#include  void assert( int exp );

功能:

assert用于错误检测,如果表达式exp的结果为零(假),则向STDERR打印错误信息并退出程序(崩溃),为1(真),则程序继续运行。

Squid 程序在禁止http header 字符串大小为64KB的判断时使用的assert函数 。

Squid远程拒绝服务漏洞分析

另外,Squid对缓存实现了Vary机制,Vary机制是http1.1 协议的新特性,可使server端可以根据用户请求返回给用户不同的内容。Squid的vary机制大致是先对vary http头内容进行逐个压缩缓存,再通过缓存进行索引。漏洞触发的代码就发送在缓存vary头内容,利用assert对缓存内容限制在64KB。

当攻击者发送带有超过64KB大小的Vary头的HTTP请求时,触发assert函数错误,打印错误信息,程序崩溃。

Squid远程拒绝服务漏洞分析  

【尾言】

assert一般用于程序开发初期或调试阶段,程序一般分为Debug版本和Release版本,Debug版本用于内部调试,Release版本发行给用户使用。assert是仅在Debug版本起作用的宏,当在Release编译时并不起作用。笔者粗略的扫描了下Squid的源码,assert的使用极为常见,也是个奇葩。 

另,漏洞并不能造成溢出等风险,仅仅是一个DoS。  

原文  https://security.tencent.com/index.php/blog/msg/102
正文到此结束
Loading...