这篇论文是Usenix 2013的一篇文章,主要是一个检测缓冲区溢出漏洞的工作。
复旦白泽战队也对这一文章作过解读:https://www.jianshu.com/p/cf0c71f7d625
简介
Dowser是一个导向的模糊测试工具,其结合了污点追踪、程序分析和符号执行去找到程序逻辑里的缓冲区溢出漏洞。很显然,复杂的指针运算比数组访问更容易触发内存错误。更重要的是,越复杂的漏洞其指针运算也就越复杂。这就导致使用现有的随机模糊测试和静态分析很难找到复杂的bug。
Dowser根据指针的复杂性对指针解引用指令进行排序,然后使用符号执行去定位到最有趣的操作去。定位单独的操作需要Dowser去减少搜索空间。与其去追求代码覆盖率,符号执行模块使用一种新的算法去最大化指针的覆盖率。我们控制在某些很有可能操作指针值的分支上去控制程序的执行。结果,Dowser找到了真实程序里很深的bug。而且,比其他工具要快。
背景
- 缓冲区溢出漏洞很严重,而且一时半会没办法全部弄没。
- 解决这个问题有两个办法,一个是运行时保护,一个是发布软件前检测出漏洞并修复。厂商一般喜欢后者。
- 检测漏洞的方法很多,但都存在一些缺点。黑盒模糊测试很快速很流行,但是会丢失掉一些路径以及许多bug。符号执行太慢又不好扩展。同时,基于代码覆盖率的模糊测试并不能找到可能存在bug的复杂路径,而是更多地去遍历单一的基本块。
方法
- 首先对目标程序进行数据流分析,然后对所有循环内的访问buffer的指令进行排序。排序是基于复杂度来排序,就比如下面这个。
2. 挑选权值高的访问,选择输入来访问buffer。然后使用污点分析去确定哪个输入字节影响了候选指令的解引用。就比如下面的三个输入ABC,只有输入B到达了那个复杂的内存访问操作。
- 用符号执行去触发程序中的溢出。再详细点就是,符号执行包含候选指令的循环,并只将相关的字节设为符号化。
- 最后,检测可能发生的溢出。使用谷歌的AddressSanitizer对程序进行茶庄,来确保内存访问指令不会读或写不应该访问的区域(Red Zones)。
结果
最后的实验结果如下,能检测出已知漏洞,也能发现未知漏洞,并且运行时间很快。
总结
感觉这篇文章基本上把能用的技术都用上了,包括静态分析、符号执行、模糊测试、污点分析等等。