跳转至

10.fuzz

约 371 个字 18 张图片 预计阅读时间 1 分钟

Testing

image-20230605152853140

测试分成人工测试(单元测试、集成测试、系统测试),模糊测试,符号化具体测试(通过静态分析的方式)。

Fuzzing

模糊测试是随机生成输入来进行测试。我们给程序随机的输入,直到程序crash。

image-20230605152911617

找到bug不一定导致crash(一般memory的bug会导致crash),所以我们需要定义怎样算找到bug。

image-20230605152924306

如何生成输入

  • just generate random binary data. cat /dev/urandom | xml_parser,但是事实上这种方式效果不好,因为随机生成的输入不一定能通过header check,有很多都是无效输入。image-20230606195521045
  • Structured inputs (a.k.a. structure-aware fuzzing). 生成一些有结构信息的输入,对于xml文件先把语法提取出来,我们通过语法来生成合法的xml文件。image-20230606195646820
  • Generating better inputs for programs. 我们要生成的输入要尽可能地覆盖程序的所有basic block。更进一步,我们希望能够覆盖所有的路径(所有分支的排列组合),这比覆盖所有的的branch代价更高。

    • Coverage wall:有些分支非常难以进入,好像一堵墙隔着一样,导致覆盖率无法上升。image-20230606200506116这时我们可以利用符号求解去求解如何进入那些难以进入的分支。
  • How to measure code coverageimage-20230612133411932

如何找到bug

有些bug并不会立即导致系统crash,而还有些bug不会导致系统crash。

image-20230612133815311

image-20230612133837041

image-20230612133847716

image-20230612133857851

如何自动化过程

image-20230612134313796

image-20230612134325365

image-20230612134338959

image-20230612134350694

image-20230612134828015

Summary

image-20230612135402172

image-20230612135408667

本文总阅读量