Xpdf PDF 뷰어를 퍼징하고 cve-2019-13288 에 대한 크래시와 POC을 찾는 것이 목표입니다.
CVE-2019-13288
xpdf 4.01.01에서 parser.cc의 parset::getObj() 함수가 조작된 파일을 통해서 무한 재귀를 유발한다고 합니다.
https://nvd.nist.gov/vuln/detail/CVE-2019-13288
딱 봐도 스택 오버플로우 같습니다.
이 문제를 해결하게 되면 배우는 것이
- 계측을 통한 대상 애플리케이션 컴파일
- 퍼저(afl-fuzz) 실행
- 디버거를 사용해 충돌 분류
환경
Ubuntu 20.04.02 LTS에서 테스트 되었고, 퍼징 결과의 차이를 피하기 위해 동일한 OS 버전을 추천합니다.
xpdf 3.0.2 다운
wget https://dl.xpdfreader.com/old/xpdf-3.02.tar.gz
tar -xvzf xpdf-3.02.tar.gz
이후에 빌드
cd xpdf-3.02
sudo apt update && sudo apt install -y build-essential gcc
./configure --prefix="$HOME/fuzzing_xpdf/install/"
make
make install
지금 xpdf 3.0.2 소스 코드를 받고 빌드를 한 후에, 빌드가 정상적으로 되었는지 확인하는 과정이다.
샘플 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
AFL++ 퍼저의 최신 버전을 설치한다.
그냥 설치해서 사용하면 된다.
AFL은 커버리지 기반 퍼저이다. 변형된 각 입력에 대한 커버리지 정보를 수집하여 새로운 실행 경로와 잠재적 버그를 발견한다.
소스 코드가 사용 가능해지면 AFL은 계측을 사용하여 각 기본 블록(함수, 루프 등)의 시작 부분에 함수 호출을 삽입할 수 있다.
대상 애플리케이션에 대한 계측 기능을 활성화 하려면 AFL 컴파일러로 코드를 컴파일 해야한다.
-> AFL이 소스코드를 다시 빌드할 때, 프로그램의 각 분기/ 블록 시작 부분에 "여기 왔다"라고 표시하는 코드를 자동으로 삽입
계측
AFL 같은 퍼저는 단순히 입력을 바꿔서는 새 코드가 실행됐는지를
알 수 없다.
그래서 프로그램 빌드할 때 자동으로 계측 코드를 삽입한다.
지금 프로그램이 어느 블록을 실행 중인지 공유 메모리에 기록
계측이 없으면 -> 단순히 크래시만 감지
계측이 있으면 -> 새 블록/경로가 실행될 때마다 새로운 길 찾았다라고 기록
AFL은 코드 커버리지 기반 퍼저
coverage-guided fuzzer
소스 코드를 다시 컴파일 할 수 있을 때, AFL은 프로그램 안의 여러
실행 경로를 구분하기 위해 각 분기/루프 앞에 추적용 코드를 자동으로 넣는다.
afl-clang-fast 컴파일러를 사용해 xpdf 를 빌드
버전 때문에 clang-fast 할때 오류가 날 수 있는데 삽질해서 해결하면 된다.
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이 각 입력 파일 이름으로 대체할 플레이스 홀더 대상의 명령줄
나머지는 직접 삽질 해가면서 해보면 된다. 소스코드 있으니깐 심볼 살리고 하면 될듯
gdb로 백트레이스를 확인하면 다음과 같습니다.
https://github.com/antonio-morales/Fuzzing101/tree/main/Exercise%201
Fuzzing101/Exercise 1 at main · antonio-morales/Fuzzing101
An step by step fuzzing tutorial. A GitHub Security Lab initiative - antonio-morales/Fuzzing101
github.com
몰랐던 것 : 딱히 없음
다시 복습한다는 느낌의 글이다