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)
- 资源使用错误
- 内存耗尽, 挂起或无限循环, 无限递归(堆栈溢出)
- 逻辑漏洞
- 寻找同一协议的不同实现差异
- 往返一致性错误(例如先压缩文件, 再解压文件)
- 断言错误
潜在的模糊测试目标
任何可以接受不信任数据输入的目标程序, 系统内核.
模糊测试成功案例
- AFL bugs
- libFuzzer bugs
- syzkaller bugs
- go-fuzz bugs
- Honggfuzz bugs
- ClusterFuzz bugs in Chrome
- OSS-Fuzz bugs
- Facebook’s Sapienz (UI fuzzing)
简单介绍
Sanitizers
Fuzzing 的目标是找到漏洞, Fuzzer 通常会通过检测程序崩溃来确定它找到了漏洞. 但是很多潜在的目标漏洞并不会使程序立即崩溃, 此时使用 Sanitizers
就十分重要:
AddressSanitizer
, 检测内存安全问题, 如 UAF 以及缓存区溢出; 推荐使用!!!UndefinedBehaviorSanitizer
, 检测未定义行为, 如有符号整数溢出等;MemorySanitizer
, 检测未初始化内存读取;
Fuzzer
libFuzzer
Honggfuzz
[AFL]
- AFL 维护的不好并不推荐, 推荐使用如
AFL++
等其他维护良好的分支 [AFL]: https://github.com/google/AFL
关于 Fuzz 目标
基本要素
- Fuzzer 会在一个进程中使用不同的输入执行同一个可执行程序多次;
- 目标程序必须容忍各种类型的输入(空输入, 超大输入, 畸形输入等)
- 目标程序不会对特定输入响应
exit()
或abort()
, 如果响应了则这样的输入也是一个 bug; - 目标程序允许使用线程, 但是理想情况下线程需要在函数末尾;
- 目标程序的执行需要是可确定的, 非确定性(如与输入无关的随机决策)会使得 Fuzzing 的效率低下;
- 目标程序执行速度需要很快, 避免过多的记录以及内存消耗;
- 理想状态下, 目标程序不应该修改任何的系统状态;
- 通常情况下, 目标越窄越好(如目标可以解析多种目标数据格式, 则将其分为多种目标, 每个数据格式对应一个)
##
文档信息
- 本文作者:Birkhoff
- 本文链接:https://blogs.maikebuke.com/2022/08/15/Fuzzing/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)