来源链接:https://security.tencent.com/index.php/blog/msg/102
### 分析
笔者对其中一个漏洞补丁进行了分析,发现漏洞的缘由主要由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。
暂无评论