[논문 리뷰] Fuzz4All: Universal Fuzzing with Large Language Models
Fuzz4All은 대형 언어 모델을 보편적인 입력 생성기이자 변형기로 사용하여 다중 언어 및 SUT를 퍼즈 테스트하고 커버리지를 높이며 실제 시스템 전반에서 수많은 버그를 발견합니다.
Fuzzing has achieved tremendous success in discovering bugs and vulnerabilities in various software systems. Systems under test (SUTs) that take in programming or formal language as inputs, e.g., compilers, runtime engines, constraint solvers, and software libraries with accessible APIs, are especially important as they are fundamental building blocks of software development. However, existing fuzzers for such systems often target a specific language, and thus cannot be easily applied to other languages or even other versions of the same language. Moreover, the inputs generated by existing fuzzers are often limited to specific features of the input language, and thus can hardly reveal bugs related to other or new features. This paper presents Fuzz4All, the first fuzzer that is universal in the sense that it can target many different input languages and many different features of these languages. The key idea behind Fuzz4All is to leverage large language models (LLMs) as an input generation and mutation engine, which enables the approach to produce diverse and realistic inputs for any practically relevant language. To realize this potential, we present a novel autoprompting technique, which creates LLM prompts that are wellsuited for fuzzing, and a novel LLM-powered fuzzing loop, which iteratively updates the prompt to create new fuzzing inputs. We evaluate Fuzz4All on nine systems under test that take in six different languages (C, C++, Go, SMT2, Java and Python) as inputs. The evaluation shows, across all six languages, that universal fuzzing achieves higher coverage than existing, language-specific fuzzers. Furthermore, Fuzz4All has identified 98 bugs in widely used systems, such as GCC, Clang, Z3, CVC5, OpenJDK, and the Qiskit quantum computing platform, with 64 bugs already confirmed by developers as previously unknown.
연구 동기 및 목표
- 다중 입력 언어와 기능에 걸쳐 작동하는 보편적 퍼징 접근법을 제안한다.
- LLMs를 활용한 입력 생성 및 변을 통해 언어별 퍼징 도구의 필요성을 제거한다.
- 임의의 사용자 입력을 효과적인 퍼징 프롬프트로 증류하기 위해 자동 프례팅(autoprompting)을 자동화한다.
- 다양하고 기능이 풍부한 입력을 생성하기 위해 LLM 기반의 반복 퍼징 루프를 개발한다.
- 다양한 언어와 실제 시스템에서 커버리지와 버그 탐지 여부를 평가한다.
제안 방법
- 사용자 제공 문서를 간결한 퍼징 프롬프트로 증류하는 자동 프례팅을 도입한다.
- 증류 LLM으로 후보 프롬프트를 생성하고 생성 LLM이 퍼징 입력을 생성하도록 한다.
- 생성 입력의 타당성/커버리지 잠재력을 기준으로 프롬프트를 점수화하고 최적의 프롬프트를 선택한다.
- 입력 예시와 생성 전략을 추가하여 새로운 입력을 생성하는 LLM 기반의 퍼징 루프를 구현한다.
- generate-new, mutate-existing, semantic-equiv 전략을 결합하여 퍼징 입력을 반복적으로 다양화한다.
- SUT를 계측하지 않고도 사용자 정의 오라클(예: 크래시)에 대해 퍼징 출력을 검증한다.

실험 결과
연구 질문
- RQ1Fuzz4All은 코드 커버리지 측면에서 기존의 언어별 퍼저와 비교하여 어떤 차이가 있는가?
- RQ2Fuzz4All은 특정 기능에 초점을 맞춘 타깃 퍼징을 효과적으로 수행할 수 있는가?
- RQ3자동 프례팅과 퍼징 루프 구성 요소가 전체 효과에 어떤 기여를 하는가?
- RQ4다양한 언어와 SUT에 걸쳐 Fuzz4All이 어떤 실제 버그를 발견하는가?
주요 결과
- Fuzz4All은 여섯 개 언어와 아홉 개 SUT에서 상태-of-the-art 퍼저보다 더 높은 코드 커버리지를 달성하며 평균 36.8%의 향상을 보인다.
- 이 접근법은 널리 사용되는 시스템에서 98개의 버그를 확인했고, 그 중 64개의 버그는 이미 개발자에 의해 이전에 알려지지 않은 것으로 확인되었다.
- Fuzz4All은 일반 퍼징과 사용자 제공 문서나 명세에 의해 주도된 기능 지향 퍼징을 모두 지원한다.
- 자동 프례팅 전략은 임의의 사용자 입력을 효과적인 퍼징 프롬프트로 증류하여 다언어 적용 가능성을 가능하게 한다.
- LLM 기반의 퍼징 루프는 예시와 생성 전략으로 프롬프트를 지속적으로 업데이트하여 다양한 입력을 생성한다.
- 이 방법은 SUT의 계측이 필요하지 않아 실용적 적용을 단순화한다.

더 나은 연구,지금 바로 시작하세요
연구 설계부터 논문 작성까지, 연구 시간을 획기적으로 줄여보세요.
카드 등록 없음 · 무료 플랜 제공
이 리뷰는 AI가 만들고, 인간 에디터가 검토했습니다.