Fuzzing101/Exercise 2 at main · antonio-morales/Fuzzing101
- 任务:在libexif中,找到两个crash CVE-2009-3895&****CVE-2012-2836
- 版本:libexif 0.6.14
- CVE-2009-3895:一种基于堆的缓冲区溢出,可以用无效的 EXIF 图像触发。
- 漏洞描述:基于堆的缓冲区溢出是一种发生在堆数据区的缓冲区溢出,它通常与显式动态内存管理(使用 malloc() 和 free() 函数进行分配/释放)有关。因此,远程攻击者可以利用此问题在使用受影响库的应用程序上下文中执行任意代码。
- CVE-2012-2836:一个越界读取漏洞,可以通过带有精心制作的 EXIF 标签的图像触发。
- 漏洞描述:越界读取是当程序读取数据超过预期缓冲区的末尾或开头之前发生的漏洞。因此,它允许远程攻击者导致拒绝服务或可能从进程内存中获取潜在的敏感信息。
- 本地实验环境:虚拟机Ubuntu 20.04.3 LTS
AFL使用非确定性测试算法,因此两个模糊会话永远不会相同。因此作者强烈建议设置一个固定的种子(-s 123)。这样模糊结果将类似于这些显示,更容易跟随练习。
作者建议使用Ubuntu 20.04.2 LTS,因为作者已在该环境下测试过,而且建议使用主机而不是虚拟机,以发挥AFL更好的性能
环境准备
- 下载安装libexif-0.6.14
新建目录
cd $HOME |
wget https://github.com/libexif/libexif/archive/refs/tags/libexif-0_6_14-release.tar.gz |
- 选择libexif调用接口—exif
由于 libexif 是一个库,因此我们需要另一个使用该库的应用程序,并将对其进行模糊测试。对于此任务,我们将使用exif 命令行。
cd $HOME/fuzzing_libexif |
测试是否安装成功:
$HOME/fuzzing_libexif/install/bin/exif |
- 建立种子语料库(Seed corpus)
我们需要获取一些 exif 样本。我们将使用以下 repo 中的示例图像:https : //github.com/ianare/exif-samples
cd $HOME/fuzzing_libexif |
之后,我们可以这样使用(举例)
$HOME/fuzzing_libexif/install/bin/exif $HOME/fuzzing_libexif/exif-samples-master/jpg/Canon_40D_photoshop_import.jpg |
- Afl-clang-lto
使用afl-clang-lto作为编译器来构建 libexif
rm -r $HOME/fuzzing_libexif/install |
cd $HOME/fuzzing_libexif/exif-exif-0_6_15-release |
一般来说,afl-clang-lto是最好的选择,因为它是一种无碰撞的仪器(instrumentation),而且比afl-clang-fast 更快。
如果您不确定何时使用afl-clang-lto或afl-clang-fast,您可以查看从AFLplusplus提取的下图来选择
+--------------------------------+ |
开始模糊测试
运行fuzz
afl-fuzz -i $HOME/fuzzing_libexif/exif-samples-master/jpg/ -o $HOME/fuzzing_libexif/out/ -s 123 -- $HOME/fuzzing_libexif/install/bin/exif @@ |
可以发现许多crash
使用Eclipse-CDT调试
安装JAVA-SDK
apt install default-jdk |
tar -xzvf eclipse-cpp-2021-03-R-linux-gtk-x86_64.tar.gz |
完成这两步后,打开Eclipse — File — Import — C/C++ — “Existing code as makefile project”
之后选择Linux GCC 并选择exif源码文件夹
之后可以在项目资源管理器中看到exif文件夹。
现在要配置调试的参数。Run — Debug Configurations,选择我们的exif项目及exif二进制文件
之后要设置Arguments,我们找到刚才AFL产生的crash路径,选一条复制进去
【至于选择哪一条,这里确实不太明白】
点击Debug后,程序会停在main函数开头
Run — Resume 检测到分段错误时会自动停止运行
实验总结与心得
- 每次fuzz,不管时间是多少,产生crash数量与类型都是不同的。
- 多个crash,可能指向的代码点是同一处。
- 作者指出的这两处CVE的溢出点,我在fuzz产生的crash调试时,都没有发现(即使第二次fuzz了3个小时,产生了30个crash,也没有发现)