Exercise 4 - LibTIFF

Exercise 4 - LibTIFF

一、实验背景

CVE-2016-9297是一个越界读取漏洞,可以通过制作TIFF_SETGET_C16ASCII或TIFF_SETGET_C32_ASCII标签值触发。越界读取是当程序读取数据超过预期缓冲区的末尾或开始之前时发生的漏洞。因此,它允许远程攻击者导致拒绝服务或可能从进程内存中获取潜在的敏感信息。

越界读取漏洞(https://cwe.mitre.org/data/definitions/125.html)

二、实验目的

模糊LibTIFF图像库,在libtiff 4.0.4中找到CVE-2016-9297漏洞/PoC,以测量崩溃/PoC的代码覆盖数据

三、实验环境:

win10,VMware,Ubuntu 20.04.2 LTS(虚拟机用户名密码均为fuzz)

四、实验步骤

1、下载并构建目标

得到模糊目标,为要模糊化的项目创建一个新目录

1
2
cd $HOME
mkdir fuzzing_tiff && cd fuzzing_tiff/

下载并解压libtiff 4.0.4

1
2
wget https://download.osgeo.org/libtiff/tiff-4.0.4.tar.gz
tar -xzvf tiff-4.0.4.tar.gz

image

构建并安装libtiff

1
2
3
4
cd tiff-4.0.4/
./configure --prefix="$HOME/fuzzing_tiff/install/" --disable-shared
make
make install

image

image

image

作为目标二进制,可以模糊’ ‘ tiffinfo ‘ ‘二进制位于’ ‘ /bin ‘ ‘文件夹,使用’ ‘ /test/images/ ‘ ‘文件夹中的示例图像作为种子输入语料库。

测试工作是否正常

1
$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

看到如下页面说明正常

image

在最后一个命令行中,启用了所有这些标志:”-j -c -r -s -w”。这是为了提高代码覆盖率,增加发现bug的机会。

但是我们如何度量给定输入情况的代码覆盖率呢?

2、代码覆盖率

代码覆盖率是一个软件度量,显示每行代码被触发的次数。通过使用代码覆盖率,我们将了解哪些部分的代码已经被模糊器到达,并可视化模糊过程。

安装lcov

1
sudo apt install lcov

image

用“——coverage”标志重新构建libTIFF(编译器和链接器)

1
2
3
4
5
6
7
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

image

image

image

image

通过输入以下代码来收集代码覆盖率数据

1
2
3
4
5
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

image

image

每一个命令的解释:

  • 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输出

1
genhtml --highlight --legend -output-directory ./html-coverage/ ./app2.info

image

如果一切顺利,代码覆盖率报告将在“html-coverage”文件夹中创建。只要打开./html-coverage/index.html文件,可以看到如下内容

image

可以浏览不同的文件夹和文件,并查看每行执行的次数

3、fuzzing

要编译启用了ASAN的libtiff

首先,要清理所有之前编译过的目标文件和可执行文件

1
2
3
rm -r $HOME/fuzzing_tiff/install
cd $HOME/fuzzing_tiff/tiff-4.0.4/
make clean

image

调用make之前设置AFL_USE_ASAN=1

1
2
3
4
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

image

image

image

使用以下命令运行fuzzer

1
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 @@

几分钟后可以看见有多个崩溃

image

image

4、Triage

ASan跟踪可能看起来如下图所示

1
$HOME/fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w '/home/fuzz/fuzzing_tiff/out/default/crashes/id:000000,sig:06,src:000000,time:1806,execs:1009,op:havoc,rep:1'

可以得到一个很好的奔溃摘要,包括执行跟踪

image

image

报错信息

AddressSanitizer: heap-buffer-overflow on address 0x602000000071 at pc 0x0000002aafc2 bp 0x7ffd9d5ea570 sp 0x7ffd9d5e9d30

堆溢出

5、代码覆盖度量

尝试度量PoC的代码覆盖率。需要获得一个覆盖率html报告,类似于上面的例子。

6、修复问题

修复bug后重建目标,并检查PoC不再使程序崩溃

五、总结

通过这个实验,我了解了CVE-2016-9297漏洞,学会如何使用LCOV来衡量代码覆盖率,如何使用代码覆盖率数据来提高模糊测试的有效性、