퍼즈 테스팅 (Fuzz Testing)

컴퓨터과학·AI
한 줄 정의: 무작위 또는 변형된 입력값을 대량으로 프로그램에 주입해 예상치 못한 오류나 보안 취약점을 찾아내는 자동화된 테스트 기법.

쉽게 풀면

퍼즈 테스팅은 프로그램에 일부러 이상하거나 무작위로 만든 입력값을 계속 집어넣어 보면서, 프로그램이 예상치 못하게 멈추거나 오작동하는 지점을 찾아내는 방법이다. 사람이 모든 경우의 수를 상상해서 테스트를 짜기는 어렵지만, 퍼저(fuzzer)라는 도구는 수백만 개의 변형된 입력을 자동으로 시도해 볼 수 있어서 사람이 놓치기 쉬운 예외 상황이나 보안 취약점을 효과적으로 찾아낸다.

왜 중요한가

소프트웨어 보안 사고의 상당수는 개발자가 미처 고려하지 못한 비정상 입력 처리 과정에서 발생하기 때문에, 퍼즈 테스팅은 소프트웨어 보안 및 신뢰성 연구에서 취약점을 자동으로 발굴하는 핵심 기법으로 자리잡았습니다. 정적 분석만으로는 발견하기 어려운 실행 시점의 결함을 실제로 프로그램을 구동시켜 찾아낼 수 있다는 점에서, 컴파일러·네트워크 프로토콜·파일 포맷 파서 등 입력을 다루는 거의 모든 시스템의 견고성 평가 연구에 활용됩니다. 최근에는 딥러닝 모델의 강건성을 검증하는 데에도 유사한 개념이 응용되고 있습니다.

논문에서는 이렇게 쓰입니다

"파일 파싱 모듈의 견고성을 검증하기 위해 AFL 기반 퍼즈 테스팅을 수행하였다."

파일을 읽어들이는 코드가 이상한 입력에도 안전하게 동작하는지 확인하기 위해 자동화된 퍼즈 테스팅 도구를 사용했다는 뜻이다.

"제안된 커버리지 기반 퍼저는 기존 도구 대비 동일 시간 내 더 많은 코드 경로를 탐색하여 새로운 크래시를 다수 발견하였다."

새로 개발한 퍼즈 테스팅 도구가 코드 실행 경로를 더 폭넓게 시도해봄으로써 기존 도구보다 많은 프로그램 오류를 찾아냈다는 뜻이다.

"산업용 제어 시스템의 통신 프로토콜에 대한 퍼즈 테스팅을 통해 서비스 거부를 유발할 수 있는 취약점을 식별하였다."

공장 설비 등을 제어하는 통신 규약에 이상 입력을 넣어보며 시스템이 멈추거나 오작동할 수 있는 보안 취약점을 찾아냈다는 뜻이다.

조금 더 깊게 보면

단순 무작위 입력을 던지는 방식(black-box fuzzing)보다, 프로그램 실행 경로를 관찰하며 새로운 코드 영역을 더 많이 지나가는 입력을 우선적으로 변형해나가는 커버리지 기반 퍼징(coverage-guided fuzzing)이 오늘날 널리 쓰입니다. AFL이나 libFuzzer 같은 도구가 대표적이며, 이들은 실행 중 코드 커버리지를 피드백으로 활용해 탐색 효율을 높입니다. 발견된 크래시가 실제로 보안상 악용 가능한지 판단하기 위해서는 별도의 취약점 분석(triage) 과정이 필요하며, 심볼릭 실행 같은 기법과 결합해 특정 코드 경로에 도달하는 입력을 더 정교하게 생성하는 하이브리드 접근도 연구되고 있습니다.

주의할 점

퍼즈 테스팅은 예상치 못한 결함을 발견하는 데 강력하지만, 발견 여부가 무작위성에 의존하므로 특정 버그를 찾는다는 보장은 없다.

관련 용어