Fuzzing101/Exercise 1 at main · antonio-morales/Fuzzing101
- 任务:在Xpdf这一PDF阅读器中,找到一个crash [CVE-2019-13288]
- 版本:XPDF 3.02
- CVE-2019-13288:是一个可能通过精心制作的文件导致无限递归的漏洞
- 漏洞描述:由于程序中每个被调用的函数在堆栈上分配一个堆栈帧,如果一个函数被递归调用太多次,可能会导致堆栈内存耗尽和程序崩溃。因此,远程攻击者可以利用这一点进行DoS攻击。
- 详细信息:https://www.cvedetails.com/cve/CVE-2019-13288/
- 本地实验环境:虚拟机Ubuntu 20.04.3 LTS
- 关于非受控递归漏洞:https://cwe.mitre.org/data/definitions/674.html
AFL使用非确定性测试算法,因此两个模糊会话永远不会相同。因此作者强烈建议设置一个固定的种子(-s 123)。这样模糊结果将类似于这些显示,更容易跟随练习。
作者建议使用Ubuntu 20.04.2 LTS,因为作者已在该环境下测试过,而且建议使用主机而不是虚拟机,以发挥AFL更好的性能
环境准备
新建目录:
cd $HOME |
安装额外工具(即 make 和 gcc)
apt install build-essential |
下载XPDF 3.02
wget https://dl.xpdfreader.com/old/xpdf-3.02.tar.gz |
构建XPDF
cd xpdf-3.02 |
下载PDF示例
cd $HOME/fuzzing_xpdf |
使用以下命令测试pdfinfo二进制文件
$HOME/fuzzing_xpdf/install/bin/pdfinfo -box -meta $HOME/fuzzing_xpdf/pdf_examples/helloworld.pdf |
得到:
安装AFL++
作者推荐本地安装(也可以使用Docker)
安装依赖:
sudo apt-get update |
构建AFL++
cd $HOME |
安装成功:
为了我们的目标应用程序启用检测,我们需要使用 AFL 的编译器编译代码
首先,我们将清理所有以前编译的目标文件和可执行文件:
rm -r $HOME/fuzzing_xpdf/install |
使用afl-clang-fast编译器构建 xpdf :
export LLVM_CONFIG="llvm-config-11" |
之后可以使用以下命令来运行fuzz
afl-fuzz -i $HOME/fuzzing_xpdf/pdf_examples/ -o $HOME/fuzzing_xpdf/out/ -s 123 -- $HOME/fuzzing_xpdf/install/bin/pdftotext @@ $HOME/fuzzing_xpdf/output |
每个选项的简要说明:
- -i表示我们必须放置输入案例(文件示例)的目录
- -o表示 AFL++ 将存储变异文件的目录
- -s表示要使用的静态随机种子
- *@@*是占位符目标的命令行,AFL 将用每个输入文件名替换它
等待一段时间后,发现crash,之后可以直接ctrl+c
结束fuzz。
分析crash
在$HOME/fuzzing_xpdf/out/
目录中找到crash对应的文件:
将此文件作为输入传递给 pdftotext 二进制文件(如果系统报打不开文件,就改下文件名,例如test.pdf)
$HOME/fuzzing_xpdf/install/bin/pdftotext '$HOME/fuzzing_xpdf/out/default/crashes/<your_filename>' $HOME/fuzzing_xpdf/output |
这里注意两个坑,一是不能直接使用pdftotext XXX,结果是不一样的;二是要把命令中间的引号去掉才能运行,不知道这里作者用的引号是什么意思
最终输出:
开始使用GDB来查找产生crash的原因
首先,需要使用调试信息重建 Xpdf 以获得符号堆栈跟踪:
rm -r $HOME/fuzzing_xpdf/install |
运行GDB:
gdb --args $HOME/fuzzing_xpdf/install/bin/pdftotext $HOME/fuzzing_xpdf/out/default/crashes/<your_filename> $HOME/fuzzing_xpdf/output |
输入run
得到:
之后输入bt
查看调用栈
发现程序一直在调用Parser::getObj
这一函数,这也正匹配了https://www.cvedetails.com/cve/CVE-2019-13288/中描述的该CVE漏洞信息:
In Xpdf 4.01.01, the Parser::getObj() function in Parser.cc may cause infinite recursion via a crafted file. A remote attacker can leverage this for a DoS attack. This is similar to CVE-2018-16646. |
修复bug
这里我们可以下载已修复错误的 Xpdf 4.02,对比下代码:
参考资料:
https://chowdera.com/2021/09/20210912223059406n.html
https://github.com/antonio-morales/Fuzzing101/tree/main/Exercise 1