[ Fuzzing 101 ] Exercise 1 - Xpdf (CVE-2019-13288)

sangjuns

·

2023. 8. 1. 09:07

Fuzzing 101의 내용을 번역해봤습니다.

목표

XPDF3.02에서 CVE-2019-13288 취약점 발견하기

 

 

환경구축

XPDF3.02빌드하기

1. 타겟 디렉토리 생성
cd $HOME
mkdir fuzzing_xpdf && cd fuzzing_xpdf/

2. make와 gcc 도구 설치
sudo apt install build-essential

3. Xpdf 3.02 다운로드
wget https://dl.xpdfreader.com/old/xpdf-3.02.tar.gz
tar -xvzf xpdf-3.02.tar.gz

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

5. 빌드된 실행파일 테스트하기
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

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

 

 

AFL++ 구축하기

cd ~ 
git clone https://github.com/AFLplusplus/AFLplusplus.git 
cd AFLplusplus 
CC=/path/to/afl-cc CXX=/path/to/afl-c++ 
./configure --disable-shared make clean all

요로코롬 뜨면 잘 빌드 된 것이다.

퍼징 테스트하기

이전 빌드된 xpdf실행파일 삭제 & AFL-clang-fast로 xpdf 빌드하기 & 퍼징해보기

--> AFL-clang-fast 컴파일러로 새롭게 빌드하는 이유는 AFL은 코드 커버리지 기반 퍼저이기 때문에

전체 바이너리 중에 어느 분기문이 실행되고 실행되지 않았는지 측정하기 위함이다.

 

즉, 원본 코드에 AFL이 알아볼 수 있는 코드를 새롭게 추가하여 어느 부분이 실행됐는지 안됐는지 측정하기 위함.

 

취약점이 발견된 바이너리는 pdftotext 바이너리이다.

 

llvm모드와 afl-clang-fast컴파일러를 사용하는데 이것은 성능 및 속도 향상을 위함이다.

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

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


$HOME/AFLplusplus/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
요로코롬 1개 이상의 crash가 있으면 성공!

 

크래시 분석하기

afl-fuzz에서 -o 옵션을 통해 $HOME/fuzzing_xpdf/out에 출력파일을 설정해줬기 때문에

cd $HOME/fuzzing_xpdf/out/default/crashes 해보면 크래시 났을 때 input들이 있다. 

 

 

크래시 났을 때 input을 재현해보자

$HOME/fuzzing_xpdf/install/bin/pdftotext $HOME/fuzzing_xpdf/out/default/crashes/<<크래시 파일>> $HOME/fuzzing_xpdf/output

 

요렇게 나오면 성공

 

AFL 컴파일러가 아닌 원래 컴파일러로 빌드하고 gdb로 확인해보기

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 --args $HOME/fuzzing_xpdf/install/bin/pdftotext $HOME/fuzzing_xpdf/out/default/crashes/<your_filename> $HOME/fuzzing_xpdf/output

r
bt

 

이렇게 Parse:getObj가 재귀적으로 호출되면 성공

 

getObj메소드를 재귀적으로 호출하면 Dos Attack에 이용될 가능성 있다고 봐서 CVE를 주었나보다.