Fuzzing101 Exercise 2 - libexif - CVE-2009-3895&CVE-2012-2836

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
mkdir fuzzing_libexif && cd fuzzing_libexif/
wget https://github.com/libexif/libexif/archive/refs/tags/libexif-0_6_14-release.tar.gz
tar -xzvf libexif-0_6_14-release.tar.gz

cd libexif-libexif-0_6_14-release/
sudo apt-get install autopoint libtool gettext libpopt-dev
autoreconf -fvi
./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/"
make
make install
  • 选择libexif调用接口—exif

由于 libexif 是一个库,因此我们需要另一个使用该库的应用程序,并将对其进行模糊测试。对于此任务,我们将使用exif 命令行。

cd $HOME/fuzzing_libexif
wget https://github.com/libexif/exif/archive/refs/tags/exif-0_6_15-release.tar.gz
tar -xzvf exif-0_6_15-release.tar.gz

cd exif-exif-0_6_15-release/
autoreconf -fvi
./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/" PKG_CONFIG_PATH=$HOME/fuzzing_libexif/install/lib/pkgconfig
make
make install

测试是否安装成功:

$HOME/fuzzing_libexif/install/bin/exif

  • 建立种子语料库(Seed corpus

我们需要获取一些 exif 样本。我们将使用以下 repo 中的示例图像:https : //github.com/ianare/exif-samples

cd $HOME/fuzzing_libexif
wget https://github.com/ianare/exif-samples/archive/refs/heads/master.zip
unzip master.zip

之后,我们可以这样使用(举例)

$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/libexif-libexif-0_6_14-release/
make clean
export LLVM_CONFIG="llvm-config-11"
CC=afl-clang-lto ./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/"
make
make install
cd $HOME/fuzzing_libexif/exif-exif-0_6_15-release
make clean
export LLVM_CONFIG="llvm-config-11"
CC=afl-clang-lto ./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/" PKG_CONFIG_PATH=$HOME/fuzzing_libexif/install/lib/pkgconfig
make
make install

一般来说,afl-clang-lto是最好的选择,因为它是一种无碰撞的仪器(instrumentation),而且比afl-clang-fast 更快

如果您不确定何时使用afl-clang-ltoafl-clang-fast,您可以查看从AFLplusplus提取的下图来选择

+--------------------------------+
| clang/clang++ 11+ is available | --> use LTO mode (afl-clang-lto/afl-clang-lto++)
+--------------------------------+ see [instrumentation/README.lto.md](instrumentation/README.lto.md)
|
| if not, or if the target fails with LTO afl-clang-lto/++
|
v
+---------------------------------+
| clang/clang++ 6.0+ is available | --> use LLVM mode (afl-clang-fast/afl-clang-fast++)
+---------------------------------+ see [instrumentation/README.llvm.md](instrumentation/README.llvm.md)
|
| if not, or if the target fails with LLVM afl-clang-fast/++
|
v
+--------------------------------+
| gcc 5+ is available | -> use GCC_PLUGIN mode (afl-gcc-fast/afl-g++-fast)
+--------------------------------+ see [instrumentation/README.gcc_plugin.md](instrumentation/README.gcc_plugin.md) and
[instrumentation/README.instrument_list.md](instrumentation/README.instrument_list.md)
|
| if not, or if you do not have a gcc with plugin support
|
v
use GCC mode (afl-gcc/afl-g++) (or afl-clang/afl-clang++ for clang)

开始模糊测试


运行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

下载Eclipse:https://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/2021-12/R/eclipse-cpp-2021-12-R-linux-gtk-x86_64.tar.gz

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 检测到分段错误时会自动停止运行

实验总结与心得


  1. 每次fuzz,不管时间是多少,产生crash数量与类型都是不同的。
  2. 多个crash,可能指向的代码点是同一处。
  3. 作者指出的这两处CVE的溢出点,我在fuzz产生的crash调试时,都没有发现(即使第二次fuzz了3个小时,产生了30个crash,也没有发现)
文章作者: HotSpurzzZ
文章链接: http://example.com/2022/01/10/Exercise 2/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HotSpurzzZ