Fuzzing101 Exercise 1 - Xpdf - CVE-2019-13288

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
mkdir fuzzing_xpdf && cd fuzzing_xpdf/

安装额外工具(即 make 和 gcc)

apt install build-essential

下载XPDF 3.02

wget https://dl.xpdfreader.com/old/xpdf-3.02.tar.gz
tar -xvzf xpdf-3.02.tar.gz

构建XPDF

cd xpdf-3.02
sudo apt update && sudo apt install -y build-essential gcc
./configure --prefix="$HOME/fuzzing_xpdf/install/"
make
make install

下载PDF示例

cd $HOME/fuzzing_xpdf
mkdir pdf_examples && cd pdf_examples
wget https://github.com/mozilla/pdf.js-sample-files/raw/master/helloworld.pdf
wget http://www.africau.edu/images/default/sample.pdf
wget https://www.melbpc.org.au/wp-content/uploads/2017/10/small-example-pdf-file.pdf

使用以下命令测试pdfinfo二进制文件

$HOME/fuzzing_xpdf/install/bin/pdfinfo -box -meta $HOME/fuzzing_xpdf/pdf_examples/helloworld.pdf

得到:

安装AFL++


作者推荐本地安装(也可以使用Docker)

安装依赖:

sudo apt-get update
sudo apt-get install -y build-essential python3-dev automake git flex bison libglib2.0-dev libpixman-1-dev python3-setuptools
sudo apt-get install -y lld-11 llvm-11 llvm-11-dev clang-11 || sudo apt-get install -y lld llvm llvm-dev clang
sudo apt-get install -y gcc-$(gcc --version|head -n1|sed 's/.* //'|sed 's/\..*//')-plugin-dev libstdc++-$(gcc --version|head -n1|sed 's/.* //'|sed 's/\..*//')-dev

构建AFL++

cd $HOME
git clone https://github.com/AFLplusplus/AFLplusplus && cd AFLplusplus
export LLVM_CONFIG="llvm-config-11"
make distrib
make install

安装成功:

为了我们的目标应用程序启用检测,我们需要使用 AFL 的编译器编译代码

首先,我们将清理所有以前编译的目标文件和可执行文件:

rm -r $HOME/fuzzing_xpdf/install
cd $HOME/fuzzing_xpdf/xpdf-3.02/
make clean

使用afl-clang-fast编译器构建 xpdf :

export LLVM_CONFIG="llvm-config-11"
CC=$HOME/AFLplusplus/afl-clang-fast CXX=$HOME/AFLplusplus/afl-clang-fast++ ./configure --prefix="$HOME/fuzzing_xpdf/install/"
make
make install

之后可以使用以下命令来运行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
cd $HOME/fuzzing_xpdf/xpdf-3.02/
make clean
CFLAGS="-g -O0" CXXFLAGS="-g -O0" ./configure --prefix="$HOME/fuzzing_xpdf/install/"
make
make 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.
Publish Date : 2019-07-04 Last Update Date : 2020-08-24

在 Xpdf 4.01.01 中,Parser.cc 中的 Parser::getObj() 函数可能会通过精心制作的文件导致无限递归。远程攻击者可以利用它进行 DoS 攻击。这类似于 CVE-2018-16646。
发布日期:2019-07-04 最后更新日期:2020-08-24

修复bug


这里我们可以下载已修复错误的 Xpdf 4.02,对比下代码:

参考资料:

https://chowdera.com/2021/09/20210912223059406n.html

https://github.com/antonio-morales/Fuzzing101/tree/main/Exercise 1

文章作者: HotSpurzzZ
文章链接: http://example.com/2021/11/29/Fuzzing101 Exercise 1 - Xpdf - CVE-2019-13288/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HotSpurzzZ