본 게시물은 아래 영상의 내용을 정리한 글이다
출처) 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 생성