퍼즈 테스트로 예외 경로의 취약점 찾기
무작위·변이 입력을 반복 주입하는 퍼즈 테스트의 오라클, Blackbox·Whitebox 전략, 트리아지와 회귀 퍼징 운영 방식을 정리합니다.
2026-08-14 · 최초 발행 2025-12-16
실패를 신호로 삼는 테스트
퍼즈 테스트(Fuzz Testing)는 무작위 입력이나 변이된 입력을 대상 프로그램에 대량으로 주입하고, 비정상 동작을 관찰하는 보안 테스트 기법이다. 예외 처리의 한계를 의도적으로 자극해 크래시(Crash), 행(Hang)처럼 조직적인 실패를 드러낸다.
판정 기준은 의도적으로 단순하다. 크래시, 무한루프·타임아웃에 해당하는 행, 메모리 오류가 탐지되면 실패로 보고, 그 밖의 경우는 통과로 처리한다. 이 단순한 오라클 덕분에 많은 입력을 반복 실행하고 결과를 비교할 수 있다.
지속적인 테스트 프레임워크에서는 실행 횟수, 커버리지(%), 유니크 크래시 수, 재현율을 지표로 삼는다. CI/CD와 연결하면 자동 트리아지, 리포팅, 회귀 테스트 파이프라인으로 확장할 수 있다.
입력을 만들고 실패를 판정하는 방식
입력은 완전히 새로 생성하거나, 시드 입력을 변이해 만든다. 변이에는 삽입, 삭제, 비트플립, 스플라이스가 사용된다. 프로토콜이나 파일 포맷을 인지하는지에 따라 Dumb 전략과 Smart 전략을 선택한다.
실행 결과에서는 크래시와 행뿐 아니라 ASan, UBSan, MSan 등이 포착하는 메모리 오류도 실패 신호가 된다. 단순한 통과·실패 기준은 대량 실행을 최적화하지만, 필요한 경우 도메인 검증 로직을 더해야 오검과 미검 가능성을 줄일 수 있다.
코드 정보가 없는 환경과 있는 환경
Blackbox 퍼징
Blackbox Fuzz Test는 대상의 내부 코드를 보지 못하는 상황에서 입력 난수와 변이에 의존한다. 크래시나 행이 아닌 결과는 통과로 처리하는 단순 오라클을 사용하며, 빠른 탐색과 대규모 병렬화에 유리하다.
Whitebox 퍼징
Whitebox Fuzz Test는 소스코드에 접근할 수 있을 때 경로 제약 해결(SMT), 심볼릭 실행 같은 기법을 활용한다. 경로를 지향해 탐색할 수 있지만, 복잡도와 도입 비용이 높고 대형 프로그램이나 시스템 전반에 적용하기는 어렵다.
| 구분 | 성능(실행속도) | 확장성(병렬/분산) | 일관성(재현율/노이즈) | 안정성(시스템 영향) | 운영 편의(도입/유지) |
|---|---|---|---|---|---|
| Blackbox | 매우 높음, 초당 실행 수 극대화 | 높음, 에이전트 수평 확장 용이 | 중간, 비결정성 영향 가능 | 높음, 격리로 보호 용이 | 매우 높음, 하니스 단순 |
| Whitebox | 중간~낮음, 심볼릭/제약해결 비용 | 중간, 스케일링 한계 존재 | 높음, 경로 지향 탐색 | 중간, 분석 툴 체인 의존 | 낮음, 환경/도구 복잡 |
유효한 상태를 유지하며 탐색하기
Valid Case Fuzz Testing은 정상 시나리오를 먼저 성립시키는 방식이다. Device Under Test(DUT)와의 연결, 핸드셰이크, 초기화가 성공한 뒤 변이 입력을 주입한다. 상태기계의 유효 범위 안에서 발생하는 결함에 집중할 수 있다.
반대로 명백한 비정상 입력 때문에 DUT가 테스트 자체를 진행할 수 없다면 Invalid Case Skip Testing으로 처리한다. 대량 탐색의 효율을 유지하고 신호 대 잡음비를 높이며, 파이프라인이 불필요하게 멈추는 일을 막기 위한 운영 원칙이다.
시드부터 회귀 퍼징까지 이어지는 흐름
시작점은 시드 데이터 수집과 사전화다. 변이 전략을 정한 뒤 하니스를 구성해 대상 프로그램을 실행하고, 모니터링과 오라클로 결과를 판정한다. 실패가 발견되면 크래시 리프로듀서, 콜스택, 커버리지 변화와 함께 버그 티켓으로 넘긴다.
타임아웃, OOM, 비결정적(nondeterministic) 크래시는 구분하고 재현율을 검사해야 한다. 중복 크래시는 해시로 디듀플리케이션하며, 분석하기 쉬운 최소화 테스트케이스를 만든다. 이후 트리아지, 분석, 패치, 회귀 퍼징을 순환시켜 결함 제거 사이클을 유지한다.
자주 적용하는 대상
파일 파서와 멀티미디어 코덱에서는 포맷 시드를 수집하고 변이한 뒤 ASan과 연동해 크래시를 트리아지한다. 버퍼 오버플로, OOB, Use-after-free를 찾는 데 효과적인 영역이다.
네트워크 프로토콜과 IPC는 세션을 수립한 다음 Valid 퍼징을 수행하고 상태기계 전이를 검사한다. Invalid 케이스는 Skip 전략을 병행하며, 타임아웃과 세션 누수를 모니터링해 행 상태를 조기에 찾는다.
API와 마이크로서비스에서는 Swagger/OpenAPI를 인지한 Smart 변이를 적용할 수 있다. CI의 야간 배치에서 대량 실행하고, 리그레션 퍼징을 자동화하는 방식으로 운영한다.
자동화가 가져오는 변화와 고려할 점
유니크 크래시 발견률은 초기 2주 내 고위험 결함 3060% 표면화 가능성이 있으며, 평균 결함 검출 시간(MTTD)과 패치 리드타임은 2040% 단축 가능성이 있다. 예외 경로의 품질을 개선하고 복원력과 방어적 코딩 문화를 정착시키는 효과도 기대할 수 있다. 표준화한 지표를 쓰면 벤더와 서비스 간 품질 거버넌스도 강화된다.
Sanitizer와 Coverage 계측을 연결하면 탐지 민감도와 경로 다양성을 높일 수 있다. 크래시 디듀플리케이션, 최소화 리프로듀서 자동 생성, 재현 스크립트 유지 관리는 운영 단계에서 빠질 수 없다.
단순 오라클에는 오검과 미검 가능성이 남는다. Whitebox는 심층 취약점을 탐지할 여지가 크지만 비용과 복잡도가 높다. 대상 자산의 특성과 운영 여건에 따라 Blackbox와 Whitebox를 조합하고, Valid·Invalid 케이스의 처리 원칙을 명확히 두는 것이 퍼징 운영의 핵심이다.