Fuzzing101-exe5

介绍

本文是 Fuzzing101 训练的第五篇,fuzz 对象是 LibXML2 XML 解析库,目标是找到 CVE-2017-9048 的崩溃。

CVE-2017-9048:堆栈缓冲区溢出漏洞,影响 LibXML2 的 DTD 验证功能。

将会学到的知识

  • 使用自定义字典帮助模糊器找到新的执行路径
  • 跨多个核心并行化模糊测试工作

环境与搭建

下载并构建目标

为新项目创建一个文件夹:

1
2
cd $HOME
mkdir Fuzzing_libxml2 && cd Fuzzing_libxml2

下载并解压 libxml2-2.9.4.tar.gz

1
2
wget http://xmlsoft.org/download/libxml2-2.9.4.tar.gz
tar xvf libxml2-2.9.4.tar.gz && cd libxml2-2.9.4/

构建并安装 libxml2:

1
2
3
4
sudo apt-get install python-dev
CC=afl-clang-lto CXX=afl-clang-lto++ CFLAGS="-fsanitize=address" CXXFLAGS="-fsanitize=address" LDFLAGS="-fsanitize=address" ./configure --prefix="$HOME/Fuzzing_libxml2/libxml2-2.9.4/install" --disable-shared --without-debug --without-ftp --without-http --without-legacy --without-python LIBS='-ldl'
make -j$(nproc)
make install

现在,我们可以测试一切是否正常:

1
./xmllint --memory ./test/wml.xml

将会看到:

image-20220420112158186

种子语料库创建

首先,我们需要获取一些 XML 样本。我们将使用此存储库中提供的SampleInput.xml

1
2
3
mkdir afl_in && cd afl_in
wget https://raw.githubusercontent.com/antonio-morales/Fuzzing101/main/Exercise%205/SampleInput.xml
cd ..

这里要注意的是:SampleInput.xml 文件用指令下载不了,所以我这边直接在虚拟机创建了一个文件,然后将内容复制了进去,然后再改名。

自定义词典

创建一个 XML 字典。或者,可以使用 AFL++ 提供的 XML 字典:

1
2
3
mkdir dictionaries && cd dictionaries
wget https://github.com/AFLplusplus/AFLplusplus/blob/stable/dictionaries/xml.dict
cd ..

模糊测试

--valid 参数来捕捉错误,用 -x 设置字典路径,用 -D 启用确定性突变(仅适用于主模糊器):

例如,我使用以下命令运行了 fuzzer

1
afl-fuzz -m none -i ./afl_in -o afl_out -s 123 -x ./dictionaries/xml.dict -D -M master -- ./xmllint --memory --noenc --nocdata --dtdattr --loaddtd --valid --xinclude @@

可以使用以下命令运行另一个从属实例:

1
afl-fuzz -m none -i ./afl_in -o afl_out -s 234 -S slave1 -- ./xmllint --memory --noenc --nocdata --dtdattr --loaddtd --valid --xinclude @@

命令行各参数意义:https://securitylab.github.com/research/fuzzing-challenges-solutions-1/

image-20220420113826267

因为本文要了解的字典和多核并行模糊测试都演示了,而且结果要跑很久才有,这里就不展示结果了。