Fuzzing-101
구조
-
연습 1: Xpdf, CVE-2019-13288, 120분, Afl-clang-fast, Afl-fuzz, GDB
-
연습 2: libexif, CVE-2009-3895, CVE-2012-2836, 6시간, Afl-clang-lto, Fuzz 라이브러리, Eclipse IDE
-
연습 3: TCPdump, CVE-2017-13028, 4시간, ASan, Sanitizers
-
연습 4: LibTIFF, CVE-2016-9297, 3시간, 코드 커버리지, LCOV
-
연습 5: Libxml2, CVE-2017-9048, 3시간, 사전, 기본 병렬화, 커맨드라인 인자 퍼징
-
연습 6: GIMP, CVE-2016-4994, 보너스 버그, 7시간, 지속적 퍼징, 상호작용 애플리케이션 퍼징
-
연습 7: VLC 미디어 플레이어, CVE-2019-14776, 6시간, 부분 계측, 퍼징 하네스
-
연습 8: Adobe Reader, 8시간, 폐쇄형 소스 애플리케이션 퍼징, QEMU 계측
-
연습 9: 7-Zip, CVE-2016-2334, 8시간, WinAFL, 윈도우 애플리케이션 퍼징
-
연습 10 (최종 도전): Google Chrome / V8, CVE-2019-5847, 8시간, Fuzzilli, 자바스크립트 엔진 퍼징
변경 로그
- 2022년 2월 14일: 연습 5의 'wget' 오타 수정
- 2021년 11월 25일: 연습 3 업데이트 및 수정
이 과정은 누구를 위한 것인가?
- 퍼징 기본기를 배우고자 하는 사람
- 실제 소프트웨어 프로젝트에서 취약점을 찾고자 하는 사람
요구 사항
- 리눅스 시스템과 인터넷 연결 필요
- 기본적인 리눅스 기술 권장
- 모든 연습은 Ubuntu 20.04.2 LTS에서 테스트됨
- 이 과정에서는 Michał "lcamtuf" Zalewski의 AFL의 새로운 포크인 AFL++ 사용
퍼징이란?
-
퍼즈 테스트(또는 퍼징): 프로그램에 무작위/변형된 입력값을 제공하고 예외/충돌을 모니터링하는 자동화된 소프트웨어 테스트 기법
- AFL, libFuzzer, HonggFuzz는 실제 응용 프로그램에서 성공적인 퍼저의 예시
-
커버리지 기반 진화적 퍼저: 코드 커버리지 데이터를 수집하고 비교하여 새로운 실행 경로를 찾는 입력값을 선택
커버리지 기반 진화적 퍼저
-
진화적: 진화 알고리듬에서 영감을 받은 메타휴리스틱 접근법으로, 초기 하위 집합(시드)의 진화와 변형을 통해 새로운 충돌을 찾음
-
커버리지 기반: 코드 커버리지 데이터를 수집하고 비교하여 새로운 실행 경로를 찾는 입력값을 선택
감사
- 도움을 준 사람들: Xavier RENE-CORAIL, Alan Vivona, Jason White, Octavio Gianatiempo, van Hauser, Marc Poulhiès, Xu Hanyu, tclan126, epi052, Jeremias Gomes
연락처
- 도움이 필요하거나 제안 사항이 있는 경우 GitHub Security Lab Slack의 #fuzzing 채널에 참여
GN⁺의 정리
- 이 과정은 퍼징의 기본 개념을 배우고 실제 소프트웨어에서 취약점을 찾는 데 유용함
- AFL++와 같은 도구를 사용하여 다양한 실제 사례를 통해 퍼징 기술을 익힐 수 있음
- 퍼징은 소프트웨어의 안정성과 보안을 강화하는 데 중요한 역할을 하며, 이 과정은 이를 위한 실용적인 접근법을 제공함
- 유사한 기능을 가진 도구로는 libFuzzer와 HonggFuzz가 있음