상세 컨텐츠

본문 제목

[Fuzzing 101] Exercise 1 - Xpdf

ANALYSIS/Fuzzing

by koharin 2022. 6. 27. 23:34

본문

728x90
반응형

Environment

  • Ubuntu 20.04.4 LTS

 

Goal

find a crash/PoC for CVE-2019-13288 in XPDF 3.02

 

Vulnerability Info: CVE-2018-13288

  • Parser.cc 내 Parser:getObj() 함수에서 crafted 파일 통해 infinite recursion 발생시켜서 원격 공격자는 이것으로 DoS 공격이 가능함
  • 각 호출된 함수는 스택 내 stack frame을 할당하는데, infinite recursion으로 재귀적으로 호출되면 스택 메모리가 고갈되고 프로그램 crash로 이어질 수 있음

 

Xpdf build

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

 

Xpdf test

제대로 설치되었는지 테스트

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를 이용하여 퍼징을 진행해본다.

 

target(Xpdf) compile

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-clang-fast compiler 이용하여 xpdf build

 

Run fuzzer

$ 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
  • target program: pdftotext
  • -i input 파일들이 있는 directory
  • -o AFL++이 mutated file 저장할 directory
  • -s static random seed 사용
  • @@ AFL이 각 input file 이름 대체할 target의 commandline에 대한 placeholder
  • fuzzer에서는 각 input 파일에 대해 $HOME/fuzzing/fuzzing_xpdf/install/bin/pdftotext <input-file-name> $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 명령어 실행 시 지정했던 경로)에 저장된다.

 

 

Reproduce the crash

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할 수 없어 오류가 발생한 것으로 추측된다.

 

Triage

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을 확인할 수 있다.

728x90
반응형

'ANALYSIS > Fuzzing' 카테고리의 다른 글

[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

관련글 더보기