Fuzzing에 대하여

156·2025년 3월 13일

Fuzzing101

목록 보기
1/3
post-thumbnail

1. Fuzzing이란?

소프트웨어의 테스트 기법 중 하나이다. fuzzer를 통해 타겟 프로그램에 들어가는 데이터를 무작위로 변조시켜 비정상적인 데이터를 입력하여 예상 밖의 동작 즉 crash를 유발시켜 버그나 취약점을 찾아내는 행위를 말한다. 해당 crash들을 분석하여 취약점을 트리거할 수도 있다.

일반적으로 아래 과정과 같이 수행된다.

1. 타겟 선정
    - 어떠한 타겟을 대상으로 퍼징 테스트를 할 지 결정한다.
2. 타겟 정보 수집
    - 해당 타겟은 어떤 기능이 있는지, 어떤 input을 받는 지 등에 대한 정보를 수집한다.
3. Fuzzer 선정
    - 타겟과 찾고자 하는 취약점에 맞는 퍼저를 선정한다.
4. Fuuzer의 Input 생성
    - Fuzzer가 타겟 프로그램에 입력할 데이터를 생성한다.
5. 프로그램 실행
6. 결과 관찰

2. Fuzzer Architecture

일반 적으로 Fuzzer는 크게 3가지 부분으로 분류되는데

Test Case Generator

  • 타겟 프로그램의 이상 행위를 탐지하기 위해서는 여러 테스트 케이스를 생성하여 넣어야하는데, 이 때 테스트 케이스를 만드는 역할을 한다.
  • 사용자로 부터 받은 seed를 통해서 Test Case를 제작하는데, 이 때 두가지 방식이 존재한다.
    • smart fuzzer : 입력 파일이나 데이터를 분석하여 입력 구조를 파악하고 그것에 맞추어 생성

    • dumb fuzzer : 입력 구조를 파악하지 않고 테스트 케이스를 생성

      특성Smart FuzzerDumb Fuzzer
      입력 구조 이해 여부입력 구조를 분석하고 인식하여 데이터 생성입력 구조를 전혀 고려하지 않고 무작위로 데이터 생성
      테스트 효율성의미 있는 테스트 케이스를 만들어 더 많은 취약점 탐지 가능무작위성 때문에 테스트 효율이 떨어질 수 있음
      테스트 범위특정 구조를 중심으로 탐색하여 깊이 있는 테스트구조와 무관하게 광범위하게 탐색
      복잡한 입력 처리구조가 복잡할수록 효과적복잡한 구조일수록 비효율적
      속도상대적으로 느릴 수 있음매우 빠름

Worker

  • 테스트 케이스 생성기가 제공하는 테스트 케이스를 타겟 프로그램에 넣어 실행하고, 예상치 못한 동작을 인식

Logger

  • 타겟 프로그램이 일으킨 crash를 저장하고 기록

3. Fuzzzing 관련 용어 정리

커버리지 (Coverage)

  • 테스트 케이스가 프로그램의 코드 어느 부분까지 실행되었는지를 나타내는 지표
  • 더 많은 커버리지를 달성할 수록, 코드의 깊은 부분까지 테스트 할 수 있다.
  • 항상 코드의 더 많은 분기를 탐색하게, 더 높은 Coverage를 어떻게 달성 할 수 있는지 생각해야한다.

하네스 (Harness)

  • fuzzer와 실제로 테스트할 프로그램을 연결하는 인터페이스 역할을 하는 프로그램

    Harness
    대부분의 문서에서 위와같이 하네스를 정의하나, 쉽게 와닿지 않아 따로 정리해보겠다.
    Fuzzer를 돌리고 크래시를 분석해 보면, 타겟 프로그램의 모든 부분에서 크래시가 발생하거나 유의미한 결과를 내지 않는다. 어쩌면 크래시가 나거나 유의미한 부분은 정해져 있기도 하다.
    그러나 fuzzing은 효율적으로 수행되어야 하며, 모든 코드를 타겟으로 삼을 필요는 없는 것이다.
    이때 작성하는게 Harness 프로그램이다. 타겟 프로그램에서 중요한 부분만을 따로 때내어 프로그램을 작성하여 fuzzing하는 것이다.


뮤테이션 (Mutation)

  • 기존 입력 데이터를 변형하여 새로운 입력을 생성하는 과정

시드 (Seed)

  • 퍼징을 시작할 때 사용하는 기본 입력 데이터

테스트 케이스 (Test case)

  • 퍼저가 타겟 프로그램에 넣는 입력 데이터

크래시 (Crash)

  • 프로그램이 예상치 못한 오류로 중단되는 현상

세니타이저 (Sanitizer)

  • 프로그램의 메모리 오류나 예상치 못한 동작을 탐지하는 도구
  • 발생하는 취약점에 대해 정보를 기록하거나 보여주는 기능

계측 (Instrumentation)

  • 프로그램 코드에 추가 정보를 기록하는 코드를 삽입하는 과정
  • 예를 들어, 프로그램 코드에 커버리지 측정 코드를 삽입하여 어떤 경로를 탐색했는지 확인할 수 있다.

코퍼스 (Corpus)

  • 퍼징에 효율적이고 유의미한 테스트 케이스들의 집합
  • 퍼징의 효율성을 높이기 위해서는 유용한 케이스들이 많이 필요하다.
  • 예를 들어, 파일 편집 프로그램에는 다양한 파일 샘플이 필요하다.

0개의 댓글