개요
두 번째 예제는 libexif EXIF 구문 분석 라이브러리 퍼징이다.
목표는 libexif 0.6.14에서 CVE-2009-3895 에 대한 크래시/PoC와
CVE-2012-2836 에 대한 또 다른 크래시을 찾는 것이다.
CVE-2009-3895는 잘못된 EXIF 이미지로 인해 발생할 수 있는 힙 기반 버퍼 오버플로우이다.
원격 공격자는 이 문제를 악용하여 영향을 받는 라이브러리를
사용하는 응용 프로그램의 컨텍스트 내에서 임의의 코드를 실행할 수 있다.
CVE-2012-2836은 조작된 EXIF 태그가 있는 이미지를 통해 트리거될 수 있는 Out-of-bounds Read 취약점이다.
원격 공격자는 DoS를 유발하거나 프로세스 메모리에서 잠재적으로 민감한 정보를 얻을 수 있다.
환경
해당 예제는 ubuntu 20.04 버전을 권장하고 있으며
vmware 파일을 제공하고 있다.
(pw: fuzz)
https://drive.google.com/file/d/1_m1x-SHcm7Muov2mlmbbt8nkrMYp0Q3K/view?usp=sharing
(잘 모르겠어서 스포일러를 보면서 진행했다)
타겟 다운로드 및 빌드
프로젝트 디렉터리 생성
cd $HOME
mkdir fuzzing_libexif && cd fuzzing_libexif/
libexif-0.6.14 다운로드
wget https://github.com/libexif/libexif/archive/refs/tags/libexif-0_6_14-release.tar.gz
tar -xzvf libexif-0_6_14-release.tar.gz
libexif 빌드 및 설치
cd libexif-libexif-0_6_14-release/
sudo apt-get install autopoint libtool gettext libpopt-dev
autoreconf -fvi
./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/"
make
make install
libexif를 사용하는 애플리케이션인 exif command-line 0.6.15 다운로드
cd $HOME/fuzzing_libexif
wget https://github.com/libexif/exif/archive/refs/tags/exif-0_6_15-release.tar.gz
tar -xzvf exif-0_6_15-release.tar.gz
exif command-line 유틸리티 빌드 및 설치
cd exif-exif-0_6_15-release/
autoreconf -fvi
./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/" PKG_CONFIG_PATH=$HOME/fuzzing_libexif/install/lib/pkgconfig
make
make install
동작 테스트
$HOME/fuzzing_libexif/install/bin/exif
Seed corpus
EXIF 샘플 확보
cd $HOME/fuzzing_libexif
wget https://github.com/ianare/exif-samples/archive/refs/heads/master.zip
unzip master.zip
샘플 시드 파일 테스트
$HOME/fuzzing_libexif/install/bin/exif $HOME/fuzzing_libexif/exif-samples-master/jpg/Canon_40D_photoshop_import.jpg
Afl-clang-lto instrumentation
afl-clang-lto로 libexif 빌드
rm -r $HOME/fuzzing_libexif/install
cd $HOME/fuzzing_libexif/libexif-libexif-0_6_14-release/
make clean
export LLVM_CONFIG="llvm-config-11"
CC=afl-clang-lto ./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/"
make
make install
cd $HOME/fuzzing_libexif/exif-exif-0_6_15-release
make clean
export LLVM_CONFIG="llvm-config-11"
CC=afl-clang-lto ./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/" PKG_CONFIG_PATH=$HOME/fuzzing_libexif/install/lib/pkgconfig
make
make install
afl- clang-fast 대신 afl-clang-lto를 사용했는데
일반적으로 afl-clang-lto는 충돌이 없고 afl-clang-fast 보다 빠르기 때문에 가장 좋은 옵션이라고 한다.
여기서 트러블 슈팅이 있었는데
llvm-11로는 아무리 AFL++를 make해도 lto 컴파일이 되지 않는다.
(12부터 지원하기 때문에..)
따라서 llvm 12를 설치해줘야 한다.
다행인 점은 이전 예제에서 exercise 1 때 사용했던 llvm 설치 명령에서 버전 숫자만 바꿔주면 됐다.
sudo apt-get install -y lld-12 llvm-12 llvm-12-dev clang-12 || sudo apt-get install -y lld llvm llvm-dev clang
cd $HOME/AFLplusplus
export LLVM_CONFIG="llvm-config-12"
make source-only
sudo make install
잘 되었다면 다음과 같이 명령어가 보일 것 이다.
다시 퍼징 준비로 돌아가면 된다.
퍼징
afl-fuzz -i $HOME/fuzzing_libexif/exif-samples-master/jpg/ -o $HOME/fuzzing_libexif/out/ -s 123 -- $HOME/fuzzing_libexif/install/bin/exif @@
좀 더 좋은 퍼징을 위해
-D 옵션을 추가해서 뮤테이션 전략을 사용해주자.
크래시 분류
저번엔 gdb를 사용했는데
이번엔 이클립스를 사용해서 크래시를 살펴본다.
먼저 아래 경로에서 이클립스를 다운 받는다.
(대충 wget 같은 거 쓰면 될 듯)
https://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/2021-03/R/eclipse-cpp-2021-03-R-linux-gtk-x86_64.tar.gz
jdk 설치
sudo apt install default-jdk
받은 파일 압축 해제 및 이클립스 실행
tar -xzvf eclipse-cpp-2021-03-R-linux-gtk-x86_64.tar.gz
cd eclipse
./eclipse
Eclipse-CDT를 시작한 후에는 소스 코드를 프로젝트 탐색기로 가져와야 한다.
File -> Import로 이동한 뒤 C/C++ -> "Existing code as makefile project"를 선택한다.
그런 다음 "Linux GCC"를 선택하고 Exif 소스 코드 폴더를 찾아야 한다.
이상이 없다면 Project explorer 탭에 exif가 있을 것이다.
이제 디버깅을 준비한다.
Run -> Debug Configurations으로 이동한다.
Main은 대충 이런식으로 설정해주고
Arguments에는 크래시 파일 경로를 넣어준 뒤 Debug 버튼을 누른다.
그러면 main에서 멈춰 있을텐데
resume(F8)을 눌러주면 크래시 지점에서 실행 중단된다.
공식 수정 사항:
https://github.com/libexif/libexif/commit/8ce72b7f81e61ef69b7ad5bdfeff1516c90fa361
https://github.com/libexif/libexif/commit/00986f6fa979fe810b46e376a462c581f9746e06
(글이 길어져서 크래시 분석은 다음 글로~)
https://github.com/antonio-morales/Fuzzing101/tree/main/Exercise%202
'background > fuzzing' 카테고리의 다른 글
[fuzzing101] Exercise 3 - TCPdump (CVE-2017-13028) (2) (0) | 2024.04.05 |
---|---|
[fuzzing101] Exercise 3 - TCPdump (CVE-2017-13028) (1) (0) | 2024.04.04 |
[fuzzing101] Exercise 2 - libexif (CVE-2009-3895 & CVE-2012-2836) (2) (1) | 2024.04.01 |
[fuzzing101] Exercise 1 - Xpdf (CVE-2019-13288) (0) | 2024.03.27 |