Fuzzing 101 기초

3 weeks ago 8

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가 있음

Read Entire Article