使用DeepState与Eclipser进行单元测试模糊测试:突破传统符号执行的限制

本文介绍了Eclipser这一新型模糊测试工具如何以低开销实现符号执行的优势,并与DeepState集成提升C/C++单元测试效率。通过实例对比展示了其在漏洞发现和代码覆盖率上的卓越表现,同时探讨了多模糊测试器协同工作的必要性。

使用DeepState与Eclipser进行单元测试模糊测试

动态分析、模糊测试与符号执行的新融合

若单元测试对您至关重要,那么现在有了更多理由使用DeepState——我们基于属性的类Google Test测试工具,支持C和C++。最新推出的Eclipser模糊测试器在ICSE 2019论文中发表,现已完全集成至DeepState。Eclipser在模糊测试中实现了符号执行的多数优势,却避免了传统符号执行的高计算和内存开销。它通过轻量级插桩结合白盒与灰盒模糊测试的优点,且关键的是从不调用昂贵的SMT或SAT求解器。

Eclipser的独特之处

传统符号执行(如DeepState通过Manticore和angr支持)需要跟踪路径约束:即程序输入的条件,使得程序在满足约束的输入下采取特定路径。但求解这些条件困难且昂贵,尤其许多约束不可行。Eclipser基于KLEE和MAYHEM的思想,用近似路径约束替代路径约束。这些条件虽不精确但更易求解,且无需慢速求解器。Eclipser假设约束为简单线性(廉价技术可解)或至少单调(使用二分搜索而非求解器)。若真实约束既非线性也非单调,Eclipser可能无法生成相关输入,但模糊测试仍可在此失败下取得进展。

为何值得关注?

Eclipser在代码覆盖率和漏洞发现上表现卓越:在coreutils上优于KLEE,在LAVA-M基准测试中胜过AFLFast、LAF-intel、VUzzer和Steelix,在真实Debian包中发现的漏洞超过AFLFast和LAF-intel,并产生八个新CVE。基于此,我们将其集成至DeepState,简化了单元测试应用。

Eclipser论文示例

DeepState示例目录包含Eclipser论文主要示例的DeepState化版本代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include <deepstate/DeepState.hpp>
using namespace deepstate;
#include <assert.h>

int vulnfunc(int32_t intInput, char * strInput) {
   if (2 * intInput + 1 == 31337)
      if (strcmp(strInput, "Bad!") == 0)
         assert(0);
   return 0;
}

TEST(FromEclipser, CrashIt) {
   char *buf = (char*)DeepState_Malloc(9);
   buf[8] = 0;
   vulnfunc(*((int32_t*) &buf[0]), &buf[4]);
}

通过Docker构建DeepState镜像后,运行Eclipser可在30秒内立即产生崩溃输入,而AFL和libFuzzer即使四小时也无法找到崩溃输入。Angr和Manticore虽能几秒内找到此输入,但无法扩展至复杂问题(如测试ext3类文件系统或leveldb)。Eclipser在文件系统和红黑树上优于libFuzzer,同时能解决需符号执行的问题。

幕后:添加Eclipser支持至DeepState

添加Eclipser支持原则上简单,但需正确配置DeepState参数(如使用no_fork避免失败)。我们开发了deepstate-eclipser前端简化此过程,仅用57行代码处理Eclipser运行、命令行选项解析和测试文件生成。鼓励用户为其他有前景的模糊测试器提交类似前端。

这是最佳模糊测试器吗?

尽管Eclipser令人兴奋,初步测试显示其在文件系统和红黑树上略逊于AFL。不同测试场景中,Eclipser、libFuzzer和AFL各有优势。研究文献和实践表明,即使某模糊测试器能“击败”其他(从而在ICSE发表论文),也总有表现不如“老旧”测试器的情况。模糊测试中多样性至关重要,无单一测试器适用于所有程序或所有漏洞。

Eclipser作者承认其技术与Angora互补(后者依赖分支距离元启发式和细粒度污点分析)。Eclipser优势在于无需像AFL或libFuzzer那样重编译库。Angora近期发布,是DeepState集成的另一候选。

结论

Eclipser是模糊测试马厩中的强大新成员,但不会赢每场比赛。随着新模糊测试器涌现,DeepState支持多测试器的能力愈发重要。使用多样测试器若仅需修改变量和命令则容易,若需为每个工具重写测试则几乎不可能。未来我们计划支持自动集成模式,用多测试器更积极测试代码,用户仅需决定使用多少核心。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计