[Fuzzing] Fuzzing study 1weeks - Xpdf(CVE-2019-13288)
어쩌다 보니 퍼징 스터디를 하게 되었습니다. 아직 시스템 해킹도 정복하지 못한 저에게 감사하게도 이런 기회가 왔네요
https://github.com/antonio-morales/Fuzzing101?tab=readme-ov-file
GitHub - antonio-morales/Fuzzing101: An step by step fuzzing tutorial. A GitHub Security Lab initiative
An step by step fuzzing tutorial. A GitHub Security Lab initiative - GitHub - antonio-morales/Fuzzing101: An step by step fuzzing tutorial. A GitHub Security Lab initiative
github.com
해당 사이트를 통해 퍼징을 공부할 계획입니다. 자료가 전부다 영어인데... 이 기회에 영어 공부 한다고 생각하죠.
아무래도 영어를 번역해서 공부 기록을 남기다 보니 번역에 오류가 있을 수 있습니다. 애초에 번역이 처음
퍼징이란?
Fuzz Testing. 자동화된 소프트웨어 검사 기술이라고 합니다. 프로그램에 랜덤한 값, 혹은 변형된 값을 넣어서 예외 / 크래시가 있는지 확인한다고 하네요
대표적인 도구로 AFL, libFuzzer, HonggFuzz가 있다고 합니다. 여기선 AFL++를 사용할 예정입니다.
퍼징의 두 가지 종류
Coverage-guided evolutionary fuzzer. 커버리지 기반 퍼징과 진화적 퍼징이 있다고 합니다.
-진화적 퍼징(Evolutionary Fuzzing) - 진화 알고리즘에서 영감을 얻은 메타휴리스틱(인공지능과 관련이 있나봐요) 기법. 초기 입력 집합(seeds)을 생성하고, 시간이 지나면서 선택 기준 (ex. Code Coverage)에 따라 입력을 변형(Mutation)하고 발전시킴. 이 기법의 목표는 점진적인 변화를 통해 더욱 의미있는 입력을 만들어내는 것
-커버리지 기반 퍼징(Coverage Guided Fuzzing) - 새로운 크래시(Crash) 또는 취약점을 발견할 확률을 높이기 위해, *코드 커버리지 데이터를 수집 및 비교*하는 기법. 일반적으로 코드 계측(Instrumentation)을 활용해 입력값들이 실행 경로에 미치는 영향을 분석한다. 새로운 코드 실행 경로를 유도하는 입력을 선택하여 퍼징을 진행함.
정리
진화적 퍼징 - 입력을 점진적으로 발전.
커버리지 기반 퍼징 - 실행 경로를 확장하는데 초점을 맞춘 방식
우선 기본적인 정리는 끝난 것 같습니다.
이제 본격적으로 퍼징 스터디를 시작해볼텐데, 1주차에는 Xpdf 라는 pdf 뷰어를 퍼징 해보겠습니다.
Xpdf 3.02 버전에서 발생한 취약점이고요, CVE-2019-13288이라고 합니다.
CVE-2019-13288 요약
만들어진 파일(crafted file)을 통해 무한 반복을 일으킬 수 있는 취약점입니다.
스택에서 프로그램이 스택 프레임을 할당하는 함수를 각각 호출합니다. 만약 함수가 반복적으로 여러번 호출 된다면, 메모리 고갈과 프로그램 크래시가 날 수 있으며, 결과적으로 공격자는 DoS 공격을 할 수 있다고 합니다.
자세한 정보는 아래 링크를 참고해주세요.
https://www.cvedetails.com/cve/CVE-2019-13288/
CVE-2019-13288 : In Xpdf 4.01.01, the Parser::getObj() function in Parser.cc may cause infinite r
CVE-2019-13288 : In Xpdf 4.01.01, the Parser::getObj() function in Parser.cc may cause infinite recursion via a crafted file. A remote attacker can leverage this for a
www.cvedetails.com
위 깃헙 커맨드에 따라 빌드 및 환경 구축을 완료했습니다.
2시간 동안 퍼징을 돌려봤지만, 블로그처럼 고유 크래시는 뜨지 않았습니다.
더 많은 시간동안 돌려보거나, 블로그에서 준 예제 파일로 분석을 해야할 것 같습니다