
소프트웨어의 테스트 기법 중 하나이다. fuzzer를 통해 타겟 프로그램에 들어가는 데이터를 무작위로 변조시켜 비정상적인 데이터를 입력하여 예상 밖의 동작 즉 crash를 유발시켜 버그나 취약점을 찾아내는 행위를 말한다. 해당 crash들을 분석하여 취약점을 트리거할 수도 있다.
일반적으로 아래 과정과 같이 수행된다.
1. 타겟 선정
- 어떠한 타겟을 대상으로 퍼징 테스트를 할 지 결정한다.
2. 타겟 정보 수집
- 해당 타겟은 어떤 기능이 있는지, 어떤 input을 받는 지 등에 대한 정보를 수집한다.
3. Fuzzer 선정
- 타겟과 찾고자 하는 취약점에 맞는 퍼저를 선정한다.
4. Fuuzer의 Input 생성
- Fuzzer가 타겟 프로그램에 입력할 데이터를 생성한다.
5. 프로그램 실행
6. 결과 관찰
일반 적으로 Fuzzer는 크게 3가지 부분으로 분류되는데

Test Case Generator
smart fuzzer : 입력 파일이나 데이터를 분석하여 입력 구조를 파악하고 그것에 맞추어 생성
dumb fuzzer : 입력 구조를 파악하지 않고 테스트 케이스를 생성
| 특성 | Smart Fuzzer | Dumb Fuzzer |
|---|---|---|
| 입력 구조 이해 여부 | 입력 구조를 분석하고 인식하여 데이터 생성 | 입력 구조를 전혀 고려하지 않고 무작위로 데이터 생성 |
| 테스트 효율성 | 의미 있는 테스트 케이스를 만들어 더 많은 취약점 탐지 가능 | 무작위성 때문에 테스트 효율이 떨어질 수 있음 |
| 테스트 범위 | 특정 구조를 중심으로 탐색하여 깊이 있는 테스트 | 구조와 무관하게 광범위하게 탐색 |
| 복잡한 입력 처리 | 구조가 복잡할수록 효과적 | 복잡한 구조일수록 비효율적 |
| 속도 | 상대적으로 느릴 수 있음 | 매우 빠름 |
Worker
Logger
커버리지 (Coverage)하네스 (Harness)Harness
대부분의 문서에서 위와같이 하네스를 정의하나, 쉽게 와닿지 않아 따로 정리해보겠다.
Fuzzer를 돌리고 크래시를 분석해 보면, 타겟 프로그램의 모든 부분에서 크래시가 발생하거나 유의미한 결과를 내지 않는다. 어쩌면 크래시가 나거나 유의미한 부분은 정해져 있기도 하다.
그러나 fuzzing은 효율적으로 수행되어야 하며, 모든 코드를 타겟으로 삼을 필요는 없는 것이다.
이때 작성하는게 Harness 프로그램이다. 타겟 프로그램에서 중요한 부분만을 따로 때내어 프로그램을 작성하여 fuzzing하는 것이다.
뮤테이션 (Mutation)시드 (Seed)테스트 케이스 (Test case)크래시 (Crash) 세니타이저 (Sanitizer) 계측 (Instrumentation) 코퍼스 (Corpus)