
- 퍼징은 다양한 소프트웨어 시스템에서 버그 찾아내고, 취약점 발견하는데 엄청난 성공을 거둠
- 컴파일러, 런타임엔진, 제약조건 해석기(constraint solver), 접근 가능한 API를 가진 소프트웨어 라이브러리는 소프트웨어 개발의 근간이 되는 구성 요소라 중요
- 다만 기존의 퍼저는 특정 언어에 목표를 두고 설계가 되어서, 다른 언어나 같은 언어의 다른버전(예: java 8 vs java 11, python 3.9 vs python 3.11)에는 쉽게 적용하기 어려움
- 기존 퍼저는 특정 기능에만 국한되어 다른 기능이나 새로운 기능에 관련된 버그는 잘 못 찾아냄.
- 범용 퍼저인 Fuzz4All 제안.
- 논문에서는 두 가지 새로운 방법론 제안
- 자동 프롬포트 생성 : 퍼징에 적합한 프롬포트 자동 생성
- LLM 기반 fuzzing loop : 새로운 퍼징 입력을 생성하기 위해 프롬포트를 반복적으로 업데이트 함
- C, C++, go, SMT2, Java, Python을 입력으로 사용하는 9개의 시스템에서 테스트
- 결과 : 모든 언어에서 기존 언어 특화 퍼저보다 더 높은 coverage 달성
- Gcc, Clang, Z3, CVC5, OpenJDK, Qiskit(양자 컴퓨팅 플랫폼에서) 98개 버그 발견, 심지어 64개는 이전에 알려지지 않았던 버그였음
소개
- 퍼즈 테스팅(fuzz testing, fuzzing)이라고 불리는 것은 예측하지 못한 행동(예: crash)을 파악하기 위한 테스트 기법.
- 컴파일러, 런타임엔진, 제약조건해석기(constraint solver) 같은 시스템들이 중요한 대상

- 이들은 프로그래밍 언어나 형식 언어(formal language)를 입력으로 받음
- 따라서 많은 퍼저들이 이와 같은 시스템으로 설계가 됐는데, 퍼저가 필요한 이유는 컴파일러와 runtime-engine에서의 버그는 모든 하위 프로그램에 영향을 주기 때문에 특히 중요함.
퍼저의 종류
- 생성 기반 퍼져(Generation-based)
- 미리 정의된 문법에 따라 코드 스니펫(코드 조각, 재사용 가능한 코드 조각 의미)작성
- 예를 들면, 목표 프로그래밍 언어에 맞는 미리 정의된 문법(그 언어의 문법 사용)
- 변이 기반 퍼저(Mutation-based)