使用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化版本代码:
|
|
通过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支持多测试器的能力愈发重要。使用多样测试器若仅需修改变量和命令则容易,若需为每个工具重写测试则几乎不可能。未来我们计划支持自动集成模式,用多测试器更积极测试代码,用户仅需决定使用多少核心。