SYSTEM

[Fuzzer] Fuzzing 기본 개념

cucu0417 2026. 1. 30. 10:52

본 게시물은 아래 영상의 내용을 정리한 글이다

출처) https://www.youtube.com/watch?v=2D9gi20jXHw&t=2s

 

 

Fuzzing이란

대상 소트프웨어의 input을 자동으로 생성하여 테스트하고 버그를 유발하는 데이터를 찾는 것

 

 

Code Coverage란

많은 분기(로직)가 있을텐데 이것을 퍼징으로 얼마나 도달했는지를 나타냄

즉, code coverage가 높을수록 퍼징으로 다양한/많은 로직을 테스트

→ 높을수록 다양한 케이스를 테스트하므로 버그를 찾을 확률도 높아짐

Statement/Line

코드가 한번 이상 실행되면 충족

void test(int x)
{
    printf("test start!\\n");   //case1
    if (x>0)    //case2
        printf("X > 0\\n");   //case3
    printf("test end\\n");  //case4
}

위 코드에서 test(0)를 입력했을 경우 case1, case2, case4는 실행

하지만 case3는 실행 안됨

이런 경우 4개의 case에서 3개만 실행됐으므로 coverage=75%

 

Condition

각 분기문들에 대한 Coverage

(분기문 : 특정 조건에 따라 실행 흐름을 바꾸는 제어문 ex. 조건문, 반복문…)

void test (int x, int y)
{
    printf("test start\\n");
    if (x>0 && y<0)
        printf("X > 0\\n");
    printf("test end\\n")
}

Condition Coverage를 만족하는 입력 값은 test(1, 1), test(-1, -1) 존재

이것은 두 조건식 x>0과 y<0 모두 true/false를 만족

하지만 조건식은 무조건 false 반환

:::note

그니까 각 분기문이 true/false를 최소 한 번씩 가지면 coverage = 100%

만약 test(1,-1)만 입력하면 x>0 → True , y<0 → True가 되어

x>0 → False와y<0 → False인 경우는 확인하지 못해 도달하지 못한다

coverage = 50%

:::

 

Desision/Branch

모든 조건식이 true/false을 가지면 충족

void test (int x, int y)
{
	printf("test start\\n");
	if ((x>0) && (y<0))
		printf("X > 0\\n");
	printf("test end\\n")
}

위 조건식 ((x>0) && (y<0)) 이 true/false를 모두 가지면 됨

즉, test(1,1) 이면 조건식은 true , 다음으로는 test(-1,0) 으로서 조건식이 false

둘 다 가졌으므로 Desision 혹은 Branch Coverage = 100%

 

 

 

상황별 Fuzzing

White-Box Testing(부분 퍼징, 부분 패치하여 진행 가능)

소스 코드를 가지고 있는 상태에서 할 수 있는 테스팅

  • Control-Flow Test
  • Data Flow Test
  • Branch Test
  • Prime Path Test
  • Path Test

Gray-Box Testing(데이터 구조체, 알고리즘에 대한 문서 등을 통해)

내부 프로그램의 구조를 부분적으로 알고 테스팅

  • Matrix Test
  • Regression Test
  • Pattern Test
  • Orthogonal Array Test

Black-Box Testing

바이너리만을 이용하여 테스팅

  • Dumb Based Test
  • Desision Table Test
  • All-pairs Test
  • Syntax Test
  • Use Case Test
  • User Story Test

 

 

Fuzzer란

자동 Fuzzing 도구

다음의 구조를 가짐

  • Test Case Generator
  • Logger
  • Worker

Test Case Generator

target program에 입력할 데이터 생성

  • Smart Fuzzer : 프로그램의 입력 데이터 구조 파악 → 해당 구조에 맞게 Mutation
  • Dumb Fuzzer : 랜덤한 데이터 생성하여 Mutation

(Mutation : 데이터를 랜덤 혹은 정해진 규칙에 맞게 테스트)

Logger

Fuzzing을 돌리는 중 버그 혹은 이상행위 분석에 필요한 정보 저장

  • Crash와 Test Case 저장
  • Code Coverage-Based Fuzzer의 경우, 새롭게 발견한 Code Coverage도 저장

이러한 Log를 확인하여 Crash에 대한 분석 진행

Worker

Generator에서 생성한 입력 데이터를 받아 실행 → 이상행위 탐지

TestCase Generator에서 생성한 Test Case 실행 → 이상행위 탐지

 

 

 

Fuzzing Case

Dumb Fuzzing

랜덤한 데이터 생성 및 전달

프로그램에 대한 이해도 없이 진행 가능

Guided Fuzzing

실행 결과를 바탕으로 효과적인 데이터를 변이하여 test case 생성

Smart Fuzzing

입력에 대한 구조 미리 파악 → Test Case 생성