Fuzzing 101 – 4
本文是Fuzzing101系列第四篇,fuzz的对象为 LibTIFF 。
1. Basic Info
Target |
CVES to find |
Time estimated |
Main topics |
LibTIFF |
CVE-2016-9297 |
3hous |
measure the code coverage data |
CVE-2017-13028: Out-of-bounds Read vulneratibily.
2. Learning Target
- 什么是 Code Coverage,代码覆盖率
- 使用 LCOV 对代码覆盖率进行测量
- 如何通过代码覆盖率的优化提升Fuzzing性能
3. Fuzzing
1. Workflow
- 开启 ASan 功能,对 LibTiff 库进行fuzz
- 分析 crash ,找到对应漏洞的 PoC
- 测量该 PoC 的代码覆盖率情况
- 修复漏洞
2. Solution
1. Download and build target
首先创建待 fuzz 的 LibTiff 环境,进行编译待用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
cd $HOME/Desktop/Fuzz/training
mkdir fuzzing_tiff && cd fuzzing_tiff/
# download and uncompress the target
wget https://download.osgeo.org/libtiff/tiff-4.0.4.tar.gz
tar -xzvf tiff-4.0.4.tar.gz
# make and install libtiff
cd tiff-4.0.4/
./configure --prefix="$HOME/Desktop/Fuzz/training/fuzzing_tiff/install/" --disable-shared
make
make install
# test the target program
$HOME/Desktop/Fuzz/training/fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w $HOME/Desktop/Fuzz/training/fuzzing_tiff/tiff-4.0.4/test/images/palette-1c-1b.tiff
|
以上安装不报错的话,可以正常调用 LibTiff 库 :
在上面的启动命令中,基本开启了软件的所有参数,这样有利于在进行fuzz时执行更多的代码路径,从而获得更高的代码覆盖率。
2. Seed corpus creation
直接使用 test/images
文件夹下的测试用例作为本次fuzz的语料。
3. Code Coverage
代码覆盖率是一种软件指标,表达了每行代码被触发的次数。通过使用代码覆盖率,我们可以了解 fuzzer 已经到达了代码的哪些部分,并可视化了 fuzzing 过程。
首先,需要安装 lcov
:
然后,我们使用 --coverage
选项来重建libTIFF库:
1
2
3
4
5
6
7
|
rm -r $HOME/Desktop/Fuzz/training/fuzzing_tiff/install
cd $HOME/Desktop/Fuzz/training/fuzzing_tiff/tiff-4.0.4/
make clean
CFLAGS="--coverage" LDFLAGS="--coverage" ./configure --prefix="$HOME/Desktop/Fuzz/training/fuzzing_tiff/install/" --disable-shared
make
make install
|
然后使用下面的指令来进行代码覆盖率收集:
1
2
3
4
5
|
cd $HOME/Desktop/Fuzz/training/fuzzing_tiff/tiff-4.0.4/
lcov --zerocounters --directory ./ # 重置计数器
lcov --capture --initial --directory ./ --output-file app.info
$HOME/Desktop/Fuzz/training/fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w $HOME/Desktop/Fuzz/training/fuzzing_tiff/tiff-4.0.4/test/images/palette-1c-1b.tiff
lcov --no-checksum --directory ./ --capture --output-file app2.info # 返回“基线”覆盖数据文件,其中包含每个检测行的零覆盖
|
最后,生成HTML输出:
1
|
genhtml --highlight --legend -output-directory ./html-coverage/ ./app2.info
|
一切顺利的话,会生成以下文件:
打开生成的 index.html
会看到如下结果:
4. Fuzzing
重新编译:
1
2
3
4
5
6
7
8
9
|
rm -r $HOME/Desktop/Fuzz/training/fuzzing_tiff/install
cd $HOME/Desktop/Fuzz/training/fuzzing_tiff/tiff-4.0.4/
make clean
export LLVM_CONFIG="llvm-config-12"
CC=afl-clang-lto ./configure --prefix="$HOME/Desktop/Fuzz/training/fuzzing_tiff/install/" --disable-shared
# 开启AFL_USE_ASAN
AFL_USE_ASAN=1 make -j4
AFL_USE_ASAN=1 make install
|
执行 afl-fuzz
:
1
|
afl-fuzz -m none -i $HOME/Desktop/Fuzz/training/fuzzing_tiff/tiff-4.0.4/test/images/ -o $HOME/Desktop/Fuzz/training/fuzzing_tiff/out/ -s 123 -- $HOME/Desktop/Fuzz/training/fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w @@
|
3. Crashes
最终跑得的结果如下:
4. Triage
ASan追踪结果如下:
5. Fix
官方的修复地址:
后续将对该漏洞进行深入分析和补丁分析,待完善。
官方的修复地址:
后续将对该漏洞进行深入分析和补丁分析,待完善。