使用DeepState与Eclipser进行模糊测试:单元测试的新突破

86 阅读4分钟

使用DeepState与Eclipser进行模糊测试

若单元测试对您至关重要,那么现在有更多理由使用DeepState——我们基于属性的C/C++测试工具(类似Google Test)。最新推出的Eclipser模糊测试工具已在ICSE 2019论文中发表,我们自豪地宣布其现已完全集成至DeepState。

Eclipser在模糊测试中具备符号执行的多数优势,却无需承担传统符号执行的高计算与内存开销。它通过轻量级插桩结合"白盒与灰盒模糊测试的最佳特性",且关键的是从不调用昂贵的SMT或SAT求解器。Eclipser是我们希望通过一键式前端推广的首个工具(或许需要您的帮助),其应用难度高于AFL或libFuzzer,但能使DeepState更快检测难以发现的漏洞。

Eclipser的独特之处

传统符号执行(DeepState通过Manticore和angr支持)需要追踪路径约束:即程序输入的条件,使得满足约束的输入会触发特定路径。但求解此类条件既困难又昂贵,尤其许多约束实际上不可行。

Eclipser基于KLEE和MAYHEM的思想,用近似路径约束替代精确路径约束。这些条件虽精度较低但更易求解,且无需缓慢的求解器。Eclipser假设约束为简单线性(廉价技术可解决)或至少单调(使用二分搜索而非求解器)。若真实约束既非线性也非单调,Eclipser虽无法生成相关输入,但模糊测试仍可能推进进程。实践中,符号执行常因此类约束失败且浪费算力,而Eclipser能更快产生输入(尽管不一定满足复杂条件)。

为何值得关注?

Eclipser在核心工具集代码覆盖率上优于KLEE,在LAVA-M基准的缺陷检测上超越AFLFast、LAF-intel、VUzzer和Steelix,尤其在真实Debian包中发现的漏洞数量上超过AFLFast和LAF-intel(产生8个新CVE)。基于此优异表现,我们将其集成至DeepState,使您能轻松应用于单元测试。

Eclipser论文示例

DeepState示例目录包含论文主示例的代码实现:

#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 ./FromEclipser --timeout 30 --output_test_dir eclipser-FromEclipser

Eclipser可在30秒内立即生成崩溃输入,而AFL和libFuzzer即便运行四小时仍无法发现漏洞。符号执行工具(angr和Manticore)虽能快速处理此示例,但无法扩展至复杂场景(如测试ext3文件系统、LevelDB或红黑树)。Eclipser的优势在于既能解决符号执行问题,又在文件系统和红黑树测试中超越libFuzzer。

技术实现:为DeepState添加Eclipser支持

原则上,添加Eclipser或多数基于文件的模糊测试器支持并无技术障碍。但需正确配置DeepState参数(如使用no_fork模式)。我们开发的deepstate-eclipser前端仅用57行代码即可处理Eclipser运行设置、参数转换及测试结果解析,希望用户能为其他模糊测试器提交类似前端。

这是最佳模糊测试器吗?

尽管Eclipser表现突出,初步测试显示其在文件系统和红黑树测试中略逊于AFL。不同测试场景中,Eclipser、libFuzzer和AFL各有优势。红黑树中的某些漏洞甚至需要专用符号执行工具才能发现。研究与实践表明,即使某模糊测试器能"击败"其他工具(从而发表论文),也总会存在表现不如"老旧"工具的情况。模糊测试需要多样性才能真正发现所有漏洞。

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

结论

Eclipser是模糊测试工具箱的重要补充,但并非万能。随着新模糊测试器涌现,DeepState支持多后端的能力将愈发重要。若仅需修改变量即可切换模糊测试器(FUZZER=FOO make; deepstate-foo ./myprogram),使用多样化工具将非常简单。我们计划未来支持自动集成模式,使DeepState能无感调用多模糊测试器强化代码测试。