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 급속 진화
•
공격자·방어자 모두에게 실전적이고 실용적인 취약점 자동발견 도구로 자리잡음