LibFuzzer 学习
本文章来自于开源软件供应链点亮计划的Openeuler社区项目
项目名称:No.112 qemu设备fuzz测试完善
前言
LibFuzzer是一个in-process
,coverage-based
,evolutionary
的模糊测试引擎,是LLVM项目的一部分。它与被测库链接,通过特定的入口点将模糊测试的输入提供给被测函数。在测试过程中不断变异输入,并统计代码覆盖率和崩溃情况。
LibFuzzer 使用方法
实验环境
采用了鹏程实验室的云主机,操作系统为OpenEuler
[root@host-10-0-0-94 libFuzzer]# lscpu
Architecture: aarch64
CPU op-mode(s): 64-bit
Byte Order: Little Endian
CPU(s): 4
[root@host-10-0-0-94 libFuzzer]# cat /etc/os-release
NAME="openEuler"
VERSION="20.03 (LTS-SP1)"
简单使用
-
安装llvm和clang
- 源码编译:对于机器性能尤其是内存(8GB)和硬盘(15-20GB)的要求比较高,需要对编译命令进行一些优化。需要额外安装LibFuzzer依赖的
compile-rt
。
git clone https://gitee.com/mirrors/LLVM.git cd LLVM ; mkdir build ; cd build cmake -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;compiler-rt" -DCMAKE_BUILD_TYPE="Release" -DLLVM_TARGETS_TO_BUILD="host" -G "Unix Makefiles" ../llvm make -j4
# sudo apt/dnf search xxx 可以查看包管理器中包含的软件以及对应版本 sudo apt/dnf install clang llvm compiler-rt
- 源码编译:对于机器性能尤其是内存(8GB)和硬盘(15-20GB)的要求比较高,需要对编译命令进行一些优化。需要额外安装LibFuzzer依赖的
-
编译被测二进制文件,加入LibFuzzer的编译选项
// LibFuzzer提供的函数接口,在被测源代码fuzz_me.cc中实现 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { DoSomethingInterestingWithMyAPI(Data, Size); return 0; // Non-zero return values are reserved for future use. }
# clang会去寻找libclang_rt.xxx.a的静态链接库,即sanitizers # 除了ASAN,还可以添加UBSAN,TSAN等其他sanitizers clang -fsantize=address,fu