在本次练习中,我们将对LibTIFF图像库进行模糊测试。目标是在LibTIFF 4.0.4中找到CVE-2016-9297的崩溃/PoC,并测量崩溃/PoC 的代码覆盖率数据。
完成此练习后,您将了解:
所有的练习都在Ubuntu 20.04.2 LTS上进行了测试。强烈建议您使用相同的操作系统版本,以避免不同的模糊结果。
让我们首先得到我们的fuzzing目标。为您想要fuzzing的项目创建一个新的目录
cd $HOME
mkdir fuzzing_tiff && cd fuzzing_tiff/
下载并解压libtiff 4.0.4:
wget https://download.osgeo.org/libtiff/tiff-4.0.4.tar.gz
tar -xzvf tiff-4.0.4.tar.gz
构建并安装Libtiff:
cd tiff-4.0.4/
./configure --prefix="$HOME/fuzzing_tiff/install/" --disable-shared
make
make install
作为目标二进制文件,我们对tiffinfo进行模糊测试。作为种子输入语料库,我们将使用文件夹中的示例图像/test/images/
要测试一切是否正常工作,只需执行以下命令:
$HOME/fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w $HOME/fuzzing_tiff/tiff-4.0.4/test/images/palette-1c-1b.tiff
结果如图所示:
在最后一个命令行中,您可以看到我启用了所有这些标志:“-j -c -r -s -w”。这是为了提高代码覆盖率并增加发现错误的机会。
代码覆盖率是一种软件指标,显示每行代码被触发的次数。通过使用代码覆盖率,我们将了解模糊器已达到代码的哪些部分,并可视化模糊测试过程。
首先,需要安装lcov。我们可以使用以下命令来完成:
sudo apt install lcov
现在,我们需要使用--coverage(编译器和链接器)重建LibTIFF:
rm -r $HOME/fuzzing_tiff/install
cd $HOME/fuzzing_tiff/tiff-4.0.4/
make clean
CFLAGS="--coverage" LDFLAGS="--coverage" ./configure --prefix="$HOME/fuzzing_tiff/install/" --disable-shared
make
make install
然后,我们可以通过输入以下内容来收集代码覆盖率数据:
cd $HOME/fuzzing_tiff/tiff-4.0.4/
lcov --zerocounters --directory ./
lcov --capture --initial --directory ./ --output-file app.info
$HOME/fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w $HOME/fuzzing_tiff/tiff-4.0.4/test/images/palette-1c-1b.tiff
lcov --no-checksum --directory ./ --capture --output-file app2.info
解释每条命令:
lcov --zerocounters --directory ./
:重置之前的计数器lcov --capture --initial --directory ./ --output-file app.info
:返回“基线”覆盖率数据文件,其中包含每个检测线的覆盖率$HOME/fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w $HOME/fuzzing_tiff/tiff-4.0.4/test/images/palette-1c-1b.tiff
:运行您要分析的应用程序。您可以使用不同的输入多次运行它lcov --no-checksum --directory ./ --capture --output-file app2.info
:将当前覆盖状态保存到app2.info文件中
最后,生成HTML输入:
genhtml --highlight --legend -output-directory ./html-coverage/ ./app2.info
如果一切顺利,代码覆盖率报告将在该html-coverage
文件夹中创建。只需打开该./html-coverage/index.html
文件,您应该会看到如下内容:
首先,我们将清理所有先前编译的目标文件和可执行文件:
rm -r $HOME/fuzzing_tiff/install
cd $HOME/fuzzing_tiff/tiff-4.0.4/
make clean
现在,我们在调用make之前设置AFL_USE_ASAN=1:
export LLVM_CONFIG="llvm-config-11"
CC=afl-clang-lto ./configure --prefix="$HOME/fuzzing_tiff/install/" --disable-shared
AFL_USE_ASAN=1 make -j4
AFL_USE_ASAN=1 make install
现在,您可以使用以下命令运行模糊器:
afl-fuzz -m none -i $HOME/fuzzing_tiff/tiff-4.0.4/test/images/ -o $HOME/fuzzing_tiff/out/ -s 123 -- $HOME/fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w @@
经过一段时间,您可以看到运行结果: