Search

Fuzzing

1. 퍼징(Fuzzing)의 기본 개념

Bug:
소프트웨어 개발자의 실수로 인한 오류(예: 버퍼 오버플로우 등)
퍼징(Fuzzing):
프로그램에 다양한 입력(input, test case, seed, corpus)을 자동 생성·주입하여 버그/취약점을 찾아내는 동적 분석 방법
핵심 단계:
1.
입력 데이터 생성
2.
프로그램 실행
3.
실행 결과/오류 관찰 및 기록

2. 퍼징 분류

(1) Black Box Fuzzing

프로그램 내부 동작 알지 못함
순수 랜덤 데이터 생성 및 주입

(2) White Box Fuzzing

소스코드 분석 기반
경로 탐색, 커버리지·분기조건 기반 입력 생성

(3) Gray Box Fuzzing

프로그램에 instrumentation(커버리지 측정 코드) 삽입
실제 동작을 일부 관찰하며 효과적으로 입력 생성
현업에서 가장 널리 사용됨

(4) 입력 생성 기준

Generative Fuzzing:
입력 스펙을 바닥부터 정의, 직접 input 생성(예: jsfunfuzz)
Mutational Fuzzing:
정상 sample(파일 등)에서 변형(mutation)하여 입력 생성
→ 현실적으로 버그 유발 확률 높음

3. 퍼징의 기본 구조

Input 생성
Dumb Fuzzing: 무작위 입력
Smart/Hybrid: 랜덤 + 구조적/의미적 정보 활용
실행
빠른 대량 실행(병렬화, in-process 등)
결과 관찰
Crash, 예외, 비정상 동작을 탐지
Address Sanitizer 등 도구로 메모리 버그 자동 탐지
Segfault가 아니어도 instrument로 메모리 접근 오류 탐지 가능

4. Corpus & Corpus Pruning

Corpus:
퍼징에 사용하는 입력 집합(테스트 케이스 모음)
Pruning:
중복/불필요한 입력 제거(커버리지 중복, 테스트 속도 저하 방지)

5. Coverage-Guided Fuzzing

Coverage(커버리지):
프로그램의 실행 흐름을 측정
Function Coverage, Line Coverage, Basic Block Coverage, Edge Coverage 등
일반적으로 Block/Edge Coverage가 주요 지표
유전 알고리즘 기반:
세대별(fuzzing round)로 입력 pool을 갱신하며 점진적으로 커버리지 최대화
대표 도구:
AFL (American Fuzzy Lop):
구글, Coverage-Feedback, 유전자 알고리즘 기반
대량의 버그 발견, fuzzing 혁명 주도
libFuzzer:
구글, LLVM 내장, in-process 방식
함수 단위 퍼징, 크롬 등 메이저 SW 다수 적용
Honggfuzz:
Intel PT(하드웨어 기반 실행흐름 추적) 활용

6. Address Sanitizer (ASan)

구글 개발, 표준 메모리 버그 탐지 도구
모든 메모리 접근을 instrument, RedZone으로 접근 범위 모니터
프로그램이 정상적으로 동작해도 메모리 버그 자동 탐지
Segfault 등 강한 crash 없이도 오류 탐지 가능

7. Structured Input Fuzzing

구조적 입력:
실제 소프트웨어는 다양한 포맷(TXT, BMP, HWP, JPEG, MP4 등)의 파일 입력
언어(문법) 기반 퍼징:
웹브라우저, ActionScript 등 파싱 대상이 복잡한 언어 구조
무작위 변형 시 99% 이상이 문법 오류(coverage bottleneck)
Grammar-Aware Fuzzing:
AST(추상구문트리) 수준에서 mutation
CodeAlchemist, DIE 등 대표적
Syntax Aware, Code Fragment 기반 mutation

8. Hybrid Fuzzing

정의:
퍼징과 정적/동적 분석 결합, 퍼징 효율 극대화
주요 기법:
Taint Analysis:
입력 데이터의 전파 추적(어느 입력이 어떤 변수·분기 조건에 영향 미치는지 분석)
대표 도구: DFSan(LLVM)
Symbolic/Concolic Execution:
분기문 조건식의 수식화, constraint solving을 통한 새로운 input 자동 생성
대표 연구: QSym(USENIX 2018)
효과:
입력 분포·조건이 복잡한 분기문, 수식 기반 분기 등 난해 코드의 경로 탐색률 극대화

9. Anti-Fuzzing

Anti-Fuzzing:
퍼징 탐지를 방해하거나 퍼징 효율을 저하시키는 기술
Coverage 측정 방해
성능 저하, saturating, 중복 입력 유도
Constraint solving 자체를 어렵게 설계
최신 연구:
2019 Usenix Security 발표 등 실전 활용 시도

10. Distributed Fuzzing (분산 퍼징)

병렬 퍼징:
퍼징은 randomness 기반 탐색 문제
대규모 병렬 컴퓨팅(클러스터, 클라우드 등)으로 확장 용이
확률적으로 미탐지 영역 커버리지 증가
구글 OSSFuzz, ClusterFuzz:
수만 코어, 수백 개 오픈소스 프로젝트 동시 퍼징
자동화된 bug 발견/patch
실제 수만 건의 버그 발견, 산업계 표준화

11. 최신 이슈 및 트렌드

AI/딥러닝 기반 퍼징 자동화 연구
Hybrid/Grammar/Semantic/Feedback-Driven Fuzzing 급속 진화
공격자·방어자 모두에게 실전적이고 실용적인 취약점 자동발견 도구로 자리잡음