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