【简介】
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对缓存实现了Vary机制,Vary机制是http1.1 协议的新特性,可使server端可以根据用户请求返回给用户不同的内容。Squid的vary机制大致是先对vary http头内容进行逐个压缩缓存,再通过缓存进行索引。漏洞触发的代码就发送在缓存vary头内容,利用assert对缓存内容限制在64KB。
当攻击者发送带有超过64KB大小的Vary头的HTTP请求时,触发assert函数错误,打印错误信息,程序崩溃。
【尾言】
assert一般用于程序开发初期或调试阶段,程序一般分为Debug版本和Release版本,Debug版本用于内部调试,Release版本发行给用户使用。assert是仅在Debug版本起作用的宏,当在Release编译时并不起作用。笔者粗略的扫描了下Squid的源码,assert的使用极为常见,也是个奇葩。
另,漏洞并不能造成溢出等风险,仅仅是一个DoS。