CVA_4주차_활동
CVE-2019-13288
1. CVE-2019-13288이란?
- 조작된 파일을 통해 무한 재귀를 일으킬 수 있는 취약점
- Xpdf* 4.01.01에서 Parser.cc의 Paser::getObj() 함수는 무한 반복되어 호출되는 recursion 오류가 있으며, 이로 인해 스택 메모리가 고갈되고 프로그램이 중단될 수 있다. 이 취약점은 DoS 공격에 활용 가능하다.
- CVSS3: 5.5(Medium)
- 영향받는 버전: Xpdf 4.01.01
*Xpdf: pdf 뷰어 및 pdf 관련 명령행 도구들을 개발하는 오픈소스 프로젝트
2. 실습
실습환경
- Ubuntu 20.04
- 타겟 프로그램: Xpdf 3.02
- 퍼저: AFL++
- pdf 샘플: https://github.com/mozilla/pdf.js-sample-files/raw/master/helloworld.pdf, https://www.melbpc.org.au/wp-content/uploads/2017/10/small-example-pdf-file.pdf
- Fuzzing: 소프트웨어 테스트 기법으로서 컴퓨터 프로그램에 유효한, 예상치 않은 또는 무작위 데이터를 입력하는 것.
- AFL: coverage-guided fuzzer로 각 입력에 대한 커버리지 정보를 수집하여 새로운 실행 경로와 잠재적 버그를 발견.
- 코드 커버리지: 특정 테스트 모음을 실행할 때 프로그램의 소스 코드가 실행되는 정도를 측정하는 백분율.
퍼징
- 퍼저 실행 명령어: 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. -i: 입력 파일이 있는 디렉터리 경로
2. -o: AFL++ 퍼저가 실행되면서 발생한 결과를 저장하는 경로
3. -s: 정적 난수 시드
4. @@: 입력 파일 이름을 대체
: 변형된 Pdf 파일을 Xpdf의 pdftotext에 입력하고 pdftotext가 실행되는 동안 충돌이나 오류가 발생하는지 확인하는 명령어이다.
- 퍼저 실행 화면
- 퍼저 실행 결과
: 퍼저 실행 결과로 6개의 crash가 발생하였다.
- Crash reproduction
: crash 파일을 pdftotext 바이너리에 인자로 전달하면 crash가 발생하는 것을 확인할 수 있다.
- gdb
: gdb로 crash 파일을 분석하면 Segmentation fault를 확인할 수 있다.
- bt
: bt를 입력하여 프로그램 스택을 살펴보면 위와 같이 함수가 반복해서 실행되는 것을 볼 수 있다.
gdb 분석 결과에 따라 Xpdf 소스 코드를 살펴보면 아래와 같다.
#19
Parser::getObj 함수에서 makeSream 함수가 호출된다.
#18
Parser::makeStream 함수에서 dictLookup 함수가 호출된다.
#17
Object::dickLookup에서 lookup 함수를 호출한다.
#16
Dict::lookup에서 fectch 함수가 호출된다.
#15
Object::fetch에서 fetch 함수가 호출된다.
#14
XRef::fetch에서 getObj 함수가 호출된다.
#13
다시 makeStream 함수가 호출된다. 이렇게 재귀 호출되면서 crash가 발생한다.
패치 (Xpdf 3.02, Xpdf 4.02)
재귀 횟수를 제한하여 무한 재귀를 방지하도록 패치하였다.
Xpdf: https://wikidocs.net/154110
Fuzzing101: