3.6. MongoDB’s JavaScript Fuzzer

这篇文章是由MongoDB开发者为这个项目写的fuzzer的一个总结。

许多fuzzer都依赖明确的语法来生成测试,这种语法使得这些测试变得更加智能。但是在这个fuzzer中,作者并没有直接构建语法库,而是从JavaScript集成测试语料库中借鉴了MongoDB命令语法的知识,随机地突变它们以创建新的测试用例。

当fuzzer运行时,它使用JS测试的随机子集作为种子。Fuzzer将它们转换为JavaScript解释器可以理解的形式的AST。 然后,通过有选择地替换节点,对其进行随机化并替换它们的值,在树上造成受控制的破坏。这样就可以测试正常测试中不会遇到的参数生成命令,但是保留了有效的JavaScript对象的整体结构。

这个fuzzer在变异的时候的优点有

  • 使用基于AST替换而不是正则

  • 使用启发式的替换而不是完全随机
    • 在要替换时,更多的替换容易产生的问题的值或者类型

但是这样的fuzzer会有一个盲点,因为语料库全部来自于人工的测试样例,所以难免有所遗漏,所以作者也加入了一些随机的字符串样本来盲测作为这个缺点的弥补