gaeunzero 2025. 5. 23. 20:37

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. 실습

실습환경

- 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: