업데이트로 돌아가기
New releaseSep 4, 2026

AFLplusplus v5.03c

퍼저 afl++는 커뮤니티 패치, qemu 5.1 업그레이드, 충돌 없는 커버리지, 향상된 laf-intel 및 redqueen, AFLfast++ 파워 스케줄, MOpt 뮤테이터, unicorn_mode 등 더 많은 기능을 갖춘 afl입니다!

공유

American Fuzzy Lop plus plus (AFL++)

AFL++ logo

릴리스 버전: 5.03c

GitHub 버전: 5.03c

저장소: https://github.com/AFLplusplus/AFLplusplus

AFL++는 다음 사람들이 유지보수합니다:

원래는 Michal "lcamtuf" Zalewski가 개발했습니다.

AFL++는 Google의 AFL보다 우수한 포크입니다 - 더 빠른 속도, 더 많고 더 나은 뮤테이션, 더 많고 더 나은 인스트루멘테이션, 커스텀 모듈 지원 등을 제공합니다.

AFL++는 AGPL-3.0-or-later 라이선스로 배포되며, Apache-2.0 라이선스가 적용되는 파일도 포함합니다. 퍼징 하니스로 컴파일되는 모든 것은 Apache 2.0 라이선스가 유지됩니다. 각 파일은 자체 SPDX-License-Identifier 헤더에 라이선스를 명시합니다 — 해당 파일에 대해 따라야 하는 라이선스는 바로 그것입니다. AGPL을 사용할 수 없는 조직을 위해 상용 라이선스가 선택적으로 제공됩니다 (좋은 목적을 위한 기부를 통해 획득 — 프로젝트와 유지보수자는 금전적 이익을 받지 않습니다). 자세한 내용은 LICENSING.md의 쉬운 설명과 아래의 라이선스 섹션을 참조하세요.

시작하기

시작하는 데 도움이 되는 몇 가지 정보입니다:

  • AFL++ 문서 개요와 매우 유용한 그래픽 가이드는 docs/README.md를 방문하세요.
  • 튜토리얼을 시작하려면 docs/tutorials.md로 이동하세요.
  • 릴리스에 대해서는 Releases 탭브랜치를 참조하세요. 그러나 사용하기 가장 좋은 브랜치는 위험 감수 수준에 따라 stable 또는 dev입니다. 또한 AFL++의 중요한 변경 사항 목록과 기능 목록도 확인하세요.
  • 학술 연구에 AFL++를 사용하려면 웹사이트의 논문 페이지를 확인하세요.
  • 우리 연구를 인용하려면 인용 섹션을 참조하세요.
  • 비교를 위해서는 fuzzbench aflplusplus 설정을 사용하거나, AFL_LLVM_CMPLOG=1과 함께 afl-clang-fast를 사용하세요. Google의 fuzzbench에서 aflplusplus 기본 구성을 찾을 수 있습니다.

AFL++ 빌드 및 설치

모든 것이 컴파일된 AFL++를 쉽게 사용하려면 Docker Hub에서 이미지를 직접 가져오세요 (x86_64 및 arm64 모두 사용 가능):

docker pull aflplusplus/aflplusplus
docker run -ti -v /location/of/your/target:/src aflplusplus/aflplusplus

이 이미지는 stable 브랜치에 푸시가 발생할 때 자동으로 게시됩니다 (브랜치 참조). 위 명령어를 사용하면 컨테이너의 /src에서 대상 소스 코드를 찾을 수 있습니다.

참고: aflplusplus/aflplusplus:dev도 가져올 수 있으며, 이는 AFL++의 가장 최신 개발 상태입니다.

AFL++를 직접 빌드하려면 — 이 방법을 권장합니다docs/INSTALL.md에서 계속 진행하세요.

빠른 시작: AFL++로 퍼징하기

참고: 시작하기 전에 퍼징의 일반적인 위험에 대해 읽어보세요.

이것은 소스 코드가 있는 대상을 퍼징하기 위한 빠른 시작 가이드입니다. 프로세스에 대해 자세히 알아보려면 docs/fuzzing_in_depth.md를 참조하세요.

다른 대상을 퍼징하는 방법을 알아보려면 다음을 참조하세요:

단계별 빠른 시작:

  1. afl-cc를 사용하여 퍼징할 프로그램 또는 라이브러리를 컴파일하세요. 일반적인 방법은 다음과 같습니다:

    CC=/path/to/afl-cc CXX=/path/to/afl-c++ ./configure --disable-shared
    make clean all
    
  2. 프로그램에 의미가 있는 작지만 유효한 입력 파일을 준비하세요. 복잡한 구문(SQL, HTTP 등)을 퍼징할 때는 dictionaries/README.md에 설명된 대로 사전도 생성하세요.

  3. 프로그램이 stdin에서 읽는 경우 다음과 같이 afl-fuzz를 실행하세요:

    ./afl-fuzz -i seeds_dir -o output_dir -- \
    /path/to/tested/program [...program's cmdline...]
    

    사전을 추가하려면 afl-fuzz에 -x /path/to/dictionary.txt를 추가하세요.

    프로그램이 파일에서 입력을 받는 경우 프로그램의 명령줄에 @@를 넣을 수 있습니다. AFL++가 자동 생성된 파일 이름을 해당 위치에 넣어줍니다.

  4. 퍼저 UI에서 빨간색으로 표시되는 모든 항목은 즉시 docs/afl-fuzz_approach.md#understanding-the-status-screen을 참조하여 조사하세요.

  5. 발견된 크래시와 행은 -o output_dir 디렉토리의 crashes/hangs/ 하위 디렉토리에서 찾을 수 있습니다. 크래시를 재생하려면 대상에 입력으로 전달하세요. 예를 들어 대상이 stdin을 사용하는 경우:

    cat output_dir/crashes/id:000000,* | /path/to/tested/program [...program's cmdline...]
    

    코어를 생성하거나 gdb를 직접 사용하여 크래시를 추적할 수 있습니다.

  6. 퍼징의 커버리지 분석을 위해 파트너 도구인 cov-analysis(퍼징 코퍼스 기반 소스 커버리지 리포트)와 fuzz-reachability(하니스가 도달할 수 있는 함수의 정적 분석으로, 실행 가능한 커버리지 격차와 데드 코드를 구분하고 인스트루멘테이션 허용 목록 생성)를 권장합니다.

  7. 아무리 강조해도 지나치지 않습니다 — 효과적으로 퍼징하려면 docs/fuzzing_in_depth.md 문서를 읽으세요!

연락처

질문이 있나요? 우려 사항이 있나요? 버그 리포트가 있나요?

브랜치

다음과 같은 브랜치가 있습니다:

  • release: 최신 릴리스
  • stable: AFL++의 안정적인 상태 — 안정성에 만족할 때 때때로 dev에서 동기화됩니다. 이것이 기본 브랜치입니다.
  • dev: AFL++의 개발 상태 — 최첨단이며 컴파일되지 않거나 버그가 있는 체크아웃을 받을 수 있습니다. PR(풀 리퀘스트)은 'dev' 브랜치에만 접수합니다!
  • (기타): 특정 기능 작업 또는 새로운 기능이나 변경 사항 테스트를 위한 실험 브랜치.

도움 요청

"help wanted" 태그가 있는 이슈 목록을 확인하세요. 이것이 AFL++를 지원하고 기여하는 방법이 될 수 있습니다 — 멋진 기능으로 확장해 보세요. 다른 아이디어가 있다면 — 이슈를 생성하여 제안하세요!

기여(및 풀 리퀘스트 전송)를 원하는 모든 분들은 제출 전에 기여 지침을 읽어주세요.

특별 감사

원래 AFL과 AFL++에 대한 많은 개선은 기여자들의 피드백, 버그 리포트 또는 패치 없이는 가능하지 않았을 것입니다.

감사합니다! (풀 리퀘스트를 보내는 분들은 이 목록에 자신을 추가해 주세요 :-)

기여자 목록
  Jann Horn                             Hanno Boeck
  Felix Groebert                        Jakub Wilk
  Richard W. M. Jones                   Alexander Cherepanov
  Tom Ritter                            Hovik Manucharyan
  Sebastian Roschke                     Eberhard Mattes
  Padraig Brady                         Ben Laurie
  @dronesec                             Luca Barbato
  Tobias Ospelt                         Thomas Jarosch
  Martin Carpenter                      Mudge Zatko
  Joe Zbiciak                           Ryan Govostes
  Michael Rash                          William Robinet
  Jonathan Gray                         Filipe Cabecinhas
  Nico Weber                            Jodie Cunningham
  Andrew Griffiths                      Parker Thompson
  Jonathan Neuschaefer                  Tyler Nighswander
  Ben Nagy                              Samir Aguiar
  Aidan Thornton                        Aleksandar Nikolich
  Sam Hakim                             Laszlo Szekeres
  David A. Wheeler                      Turo Lamminen
  Andreas Stieger                       Richard Godbee
  Louis Dassy                           teor2345
  Alex Moneger                          Dmitry Vyukov
  Keegan McAllister                     Kostya Serebryany
  Richo Healey                          Martijn Bogaard
  rc0r                                  Jonathan Foote
  Christian Holler                      Dominique Pelle
  Jacek Wielemborek                     Leo Barnes
  Jeremy Barnes                         Jeff Trull
  Guillaume Endignoux                   ilovezfs
  Daniel Godas-Lopez                    Franjo Ivancic
  Austin Seipp                          Daniel Komaromy
  Daniel Binderman                      Jonathan Metzman
  Vegard Nossum                         Jan Kneschke
  Kurt Roeckx                           Marcel Boehme
  Van-Thuan Pham                        Abhik Roychoudhury
  Joshua J. Drake                       Toby Hutton
  Rene Freingruber                      Sergey Davidoff
  Sami Liedes                           Craig Young
  Andrzej Jackowski                     Daniel Hodson
  Nathan Voss                           Dominik Maier
  Andrea Biondo                         Vincent Le Garrec
  Khaled Yakdan                         Kuang-che Wu
  Josephine Calliotte                   Konrad Welc
  Thomas Rooijakkers                    David Carlier
  Ruben ten Hove                        Joey Jiao
  fuzzah                                @intrigus-lgtm
  Yaakov Saxon                          Sergej Schumilo
  Ziqiao Kong                           Ryan Berger
  Sangjun Park                          Scott Guest
  Fabian Keil                           @Jay-1409
  Gergely Nagy

인용

과학 연구에서 AFL++를 사용한다면 WOOT'20에서 발표된 우리 논문을 인용하는 것을 고려해 주세요:

Andrea Fioraldi, Dominik Maier, Heiko Eißfeldt, and Marc Heuse. “AFL++: Combining incremental steps of fuzzing research”. In 14th USENIX Workshop on Offensive Technologies (WOOT 20). USENIX Association, Aug. 2020.
BibTeX
@inproceedings {AFLplusplus-Woot20,
author = {Andrea Fioraldi and Dominik Maier and Heiko Ei{\ss}feldt and Marc Heuse},
title = {{AFL++}: Combining Incremental Steps of Fuzzing Research},
booktitle = {14th {USENIX} Workshop on Offensive Technologies ({WOOT} 20)},
year = {2020},
publisher = {{USENIX} Association},
month = aug,
}

zread Ask DeepWiki

라이선스

AFL++는 GNU AGPL-3.0-or-later 라이선스로 배포됩니다. 간단히 말해, AFL++를 세 가지 방법으로 사용할 수 있습니다:

  1. 무료, AGPL-3.0-or-later 조건: 기본값입니다. AFL++를 사용, 수정 및 공유할 수 있습니다. 수정된 버전을 네트워크 서비스로 실행하는 경우 AGPL은 사용자에게 해당 소스 코드를 제공할 것을 요구합니다. 전문: LICENSE.

  2. 파일별, 해당 파일 헤더의 라이선스 조건: 프로젝트에는 SPDX-License-Identifier: AGPL-3.0-or-laterSPDX-License-Identifier: Apache-2.0 헤더가 있는 파일이 모두 포함되어 있습니다. 사용하는 파일의 헤더를 항상 확인하고 거기에 명시된 라이선스를 준수하세요. Apache-2.0으로 표시된 파일은 Apache-2.0 라이선스에 따라 개별적으로 재사용할 수 있습니다. (일부 번들된 타사 파일은 다른 라이선스를 가집니다. 예: GPL-3.0-or-later의 GCC 플러그인과 Apache-2.0-WITH-LLVM-exception의 LLVM SanitizerCoverage 패스 — 각각 자체 SPDX 식별자로 표시됨). 결합된 afl-fuzz 바이너리에는 AGPL 파일이 포함되므로 프로그램 전체는 AGPL입니다.

  3. 상용 라이선스: 선택 사항, AGPL을 준수할 수 없거나 준수하고 싶지 않은 조직을 위한 것입니다. 프로젝트는 금전적 이익을 받지 않습니다. 대신 **EFF 또는 CCC**에 EUR 20,000 (€20,000)을 기부하고 증빙을 [email protected]로 이메일로 보내세요. 그러면 기부 날짜부터 1년간 라이선스가 유효합니다 (재기부로 갱신 가능). 전체 조건: LICENSE.COMMERCIAL.

번들된 타사 구성 요소(예: xxHash, t1ha, libFuzzer, 서브모듈)는 자체 라이선스를 유지합니다. 완전한 쉬운 설명은 LICENSING.md를 참조하세요.

카테고리