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 | cd $HOME |
下载并解压libtiff 4.0.4
1 | wget https://download.osgeo.org/libtiff/tiff-4.0.4.tar.gz |
构建并安装libtiff
1 | cd tiff-4.0.4/ |
作为目标二进制,可以模糊’ ‘ 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 |
看到如下页面说明正常
在最后一个命令行中,启用了所有这些标志:”-j -c -r -s -w”。这是为了提高代码覆盖率,增加发现bug的机会。
但是我们如何度量给定输入情况的代码覆盖率呢?
2、代码覆盖率
代码覆盖率是一个软件度量,显示每行代码被触发的次数。通过使用代码覆盖率,我们将了解哪些部分的代码已经被模糊器到达,并可视化模糊过程。
安装lcov
1 | sudo apt install lcov |
用“——coverage”标志重新构建libTIFF(编译器和链接器)
1 | rm -r $HOME/fuzzing_tiff/install |
通过输入以下代码来收集代码覆盖率数据
1 | 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
: 将当前覆盖状态保存到app2.info文件中
最后,生成HTML输出
1 | genhtml --highlight --legend -output-directory ./html-coverage/ ./app2.info |
如果一切顺利,代码覆盖率报告将在“html-coverage”文件夹中创建。只要打开./html-coverage/index.html
文件,可以看到如下内容
可以浏览不同的文件夹和文件,并查看每行执行的次数
3、fuzzing
要编译启用了ASAN的libtiff
首先,要清理所有之前编译过的目标文件和可执行文件
1 | rm -r $HOME/fuzzing_tiff/install |
调用make之前设置AFL_USE_ASAN=1
1 | export LLVM_CONFIG="llvm-config-11" |
使用以下命令运行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 @@ |
几分钟后可以看见有多个崩溃
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' |
可以得到一个很好的奔溃摘要,包括执行跟踪
报错信息
AddressSanitizer: heap-buffer-overflow on address 0x602000000071 at pc 0x0000002aafc2 bp 0x7ffd9d5ea570 sp 0x7ffd9d5e9d30
堆溢出
5、代码覆盖度量
尝试度量PoC的代码覆盖率。需要获得一个覆盖率html报告,类似于上面的例子。
6、修复问题
修复bug后重建目标,并检查PoC不再使程序崩溃
五、总结
通过这个实验,我了解了CVE-2016-9297漏洞,学会如何使用LCOV来衡量代码覆盖率,如何使用代码覆盖率数据来提高模糊测试的有效性、