Fuzz入门与理解

2022/08/15 Tools Fuzzing 共 1303 字,约 4 分钟

Why Fuzzing?

介绍

  • Mutation based fuzzing - 基于突变的模糊测试
  • Generation based fuzzing - 基于生成的模糊测试

引导型模糊测试(Guided fuzzing)是基于突变的模糊测试的重要拓展. 引导模糊测试在测试新的突变数据时部署了一个反馈回路; 如果输入的结果产生了一个新的信号, 该信号可以是任何可量化的指标(如代码覆盖率), 则该样本会被永久加入到测试语料库中.

Fuzzing 可以用来发现程序中, 与项目需求无关的编成型错误, 如内存泄漏缓存区溢出等. Fuzzing 使得开发人员能够尽早发现这类存错.

需要注意的是, Fuzzing不能够代替明确的功能性测试.

Fuzzing 能够发现的漏洞

  • 针对 C/C++ , 需要使用 Sanitizers 进行捕获
    • UAF(Use-After-Free), 缓存区溢出(Buffer Overflows)
    • 使用未初始化内存
    • 内存泄漏
  • 运算漏洞
    • 除0错误, 整数/浮点溢出, 非法位移运算
  • 普通崩溃
    • 空引用, 未捕获异常
  • 并发错误
    • 数据竞争(Data Races), 死锁(Deadlocks)
  • 资源使用错误
    • 内存耗尽, 挂起或无限循环, 无限递归(堆栈溢出)
  • 逻辑漏洞
    • 寻找同一协议的不同实现差异
    • 往返一致性错误(例如先压缩文件, 再解压文件)
    • 断言错误

潜在的模糊测试目标

任何可以接受不信任数据输入的目标程序, 系统内核.

模糊测试成功案例

简单介绍

Sanitizers

Fuzzing 的目标是找到漏洞, Fuzzer 通常会通过检测程序崩溃来确定它找到了漏洞. 但是很多潜在的目标漏洞并不会使程序立即崩溃, 此时使用 Sanitizers 就十分重要:

  • AddressSanitizer, 检测内存安全问题, 如 UAF 以及缓存区溢出; 推荐使用!!!
  • UndefinedBehaviorSanitizer, 检测未定义行为, 如有符号整数溢出等;
  • MemorySanitizer , 检测未初始化内存读取;

Fuzzer

libFuzzer

Honggfuzz

[AFL]

  • AFL 维护的不好并不推荐, 推荐使用如 AFL++ 等其他维护良好的分支 [AFL]: https://github.com/google/AFL

关于 Fuzz 目标

基本要素

  1. Fuzzer 会在一个进程中使用不同的输入执行同一个可执行程序多次;
  2. 目标程序必须容忍各种类型的输入(空输入, 超大输入, 畸形输入等)
  3. 目标程序不会对特定输入响应exit()abort(), 如果响应了则这样的输入也是一个 bug;
  4. 目标程序允许使用线程, 但是理想情况下线程需要在函数末尾;
  5. 目标程序的执行需要是可确定的, 非确定性(如与输入无关的随机决策)会使得 Fuzzing 的效率低下;
  6. 目标程序执行速度需要很快, 避免过多的记录以及内存消耗;
  7. 理想状态下, 目标程序不应该修改任何的系统状态;
  8. 通常情况下, 目标越窄越好(如目标可以解析多种目标数据格式, 则将其分为多种目标, 每个数据格式对应一个)

##

文档信息

搜索

    Table of Contents