Fuzzing101-exe5
介绍
本文是 Fuzzing101 训练的第五篇,fuzz 对象是 LibXML2 XML 解析库,目标是找到 CVE-2017-9048 的崩溃。
CVE-2017-9048:堆栈缓冲区溢出漏洞,影响 LibXML2 的 DTD 验证功能。
将会学到的知识
- 使用自定义字典帮助模糊器找到新的执行路径
 - 跨多个核心并行化模糊测试工作
 
环境与搭建
下载并构建目标
为新项目创建一个文件夹:
1  | cd $HOME  | 
下载并解压 libxml2-2.9.4.tar.gz
1  | wget http://xmlsoft.org/download/libxml2-2.9.4.tar.gz  | 
构建并安装 libxml2:
1  | sudo apt-get install python-dev  | 
现在,我们可以测试一切是否正常:
1  | ./xmllint --memory ./test/wml.xml  | 
将会看到:

种子语料库创建
首先,我们需要获取一些 XML 样本。我们将使用此存储库中提供的SampleInput.xml:
1  | mkdir afl_in && cd afl_in  | 
这里要注意的是:SampleInput.xml 文件用指令下载不了,所以我这边直接在虚拟机创建了一个文件,然后将内容复制了进去,然后再改名。
自定义词典
创建一个 XML 字典。或者,可以使用 AFL++ 提供的 XML 字典:
1  | mkdir dictionaries && cd dictionaries  | 
模糊测试
用 --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/

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