find a crash/PoC for CVE-2019-13288 in XPDF 3.02
sudo apt install -y build-essential gcc # dependency
wget <https://dl.xpdfreader.com/old/xpdf-3.02.tar.gz>
tar -xvzf xpdf-3.02.tar.gz
cd xpdf-3.02
./configure --prefix="$HOME/fuzzing/fuzzing_xpdf/install/"
make
make install
제대로 설치되었는지 테스트
cd $HOME/fuzzing/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>
다운로드한 pdf 파일들을 입력 파일로 afl-fuzz를 이용하여 퍼징을 진행해본다.
rm -r $HOME/fuzzing/fuzzing_xpdf/install
cd $HOME/fuzzing/fuzzing_xpdf/xpdf-3.02/
make clean
target에 대해 instrumentation을 가능하게 하려면, AFL compiler로 코드를 컴파일해야 한다.
따라서 이전에 컴파일한 오브적트 파일, 실행 파일을 제거한다.
export LLVM_CONFIG="llvm-config-11"
CC=$HOME/AFLplusplus/afl-clang-fast CXX=$HOME/AFLplusplus/afl-clang-fast++ ./configure --prefix="$HOME/fuzzing/fuzzing_xpdf/install/"
make
make install
$ afl-fuzz -i $HOME/fuzzing/fuzzing_xpdf/pdf_example -o $HOME/fuzzing/fuzzing_xpdf/out/ -s 123 -- $HOME/fuzzing/fuzzing_xpdf/install/bin/pdftotext @@ $HOME/fuzzing/fuzzing_xpdf/output
위와 같은 오류 발생하는 경우 다음 과정으로 해결
sudo su
echo core >/proc/sys/kernel/core_pattern
exit
target 프로그램 대상으로 unique crash 1개를 발견했다.
crash는 $HOME/fuzzing/fuzzing_xpdf/out/default/out/ directory(afl-fuzz 명령어 실행 시 지정했던 경로)에 저장된다.
Xpdf의 pdftotext 명령어는 PDF 파일을 plain text 파일로 변환하는 명령어이다.
pdftotext [option] pdf-file text-file 과 같이 사용한다.
$HOME/fuzzing/fuzzing_xpdf/out/default/crashes 경로에는 crash를 낸 input file이 저장되어있다.
이 입력 파일로 crash를 재연해보자.
crash가 재연된 것을 확인할 수 있다.
SUMMARY: UndefinedBehaviorSanitizer: stack-overflow /build/glibc-SzIz7B/glibc-2.31/malloc/malloc.c:3716:19 in _int_malloc 으로 stack overflow가 발생한 것을 알 수 있다.
XRef::fetch, Object::dictLookup, Parser:getobj가 반복적으로 호출되는 것으로 무한 루프에 빠진걸 알 수 있고, 반복적인 함수 호출로 stack frame이 반복적으로 할당되는데 stack이 꽉 차게 되면서 더이상 malloc할 수 없어 오류가 발생한 것으로 추측된다.
10210 rm -r install
10211 cd xpdf-3.02
10212 make clean
10213 CFLAGS="-g -O0" CXXFLAGS="-g -O0" ./configure --prefix="$HOME/fuzzing/fuzzing_xpdf/install/"
10214 make
10215 make install
Xpdf를 debug info와 함께 rebuild 한다.
gdb --args $HOME/fuzzing/fuzzing_xpdf/install/bin/pdftotext $HOME/fuzzing/fuzzing_xpdf/out/default/crashes/id:000000,sig:11,src:000000,time:32320,execs:18534,op:havoc,rep:16 $HOME/fuzzing/fuzzing_xpdf/output
GDB 실행
run을 하면 segmentation fault가 발생한다.
bt 으로 Parser:getObj 메소드가 반복적으로 호출되면서 infinite recursion을 확인할 수 있다.
[Fuzzing] WinAFL fuzzing HncAppShield (0) | 2022.07.08 |
---|---|
[Fuzzing] WinAFL 환경구축 및 사용법 (0) | 2022.07.08 |
[Fuzzing] AFL fuzzing dact (0) | 2022.06.28 |
[Fuzzing] AFL++ 설치 (0) | 2022.06.28 |
[Fuzzing] AFL 설치 (0) | 2022.06.28 |