
AFLplusplus v5.03c
퍼저 afl++는 커뮤니티 패치, qemu 5.1 업그레이드, 충돌 없는 커버리지, 향상된 laf-intel 및 redqueen, AFLfast++ 파워 스케줄, MOpt 뮤테이터, unicorn_mode 등 더 많은 기능을 갖춘 afl입니다!
American Fuzzy Lop plus plus (AFL++)
릴리스 버전: 5.03c
GitHub 버전: 5.03c
저장소: https://github.com/AFLplusplus/AFLplusplus
AFL++는 다음 사람들이 유지보수합니다:
- Marc "van Hauser" Heuse [email protected]
- Dominik Maier [email protected]
- Andrea Fioraldi [email protected]
- Heiko "hexcoder-" Eissfeldt [email protected]
- frida_mode는 @Worksbutnottested가 유지보수합니다
원래는 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를 참조하세요.
다른 대상을 퍼징하는 방법을 알아보려면 다음을 참조하세요:
- 바이너리 전용 대상: docs/fuzzing_binary-only_targets.md
- 네트워크 서비스: docs/best_practices.md#fuzzing-a-network-service
- GUI 프로그램: docs/best_practices.md#fuzzing-a-gui-program
단계별 빠른 시작:
-
afl-cc를 사용하여 퍼징할 프로그램 또는 라이브러리를 컴파일하세요. 일반적인 방법은 다음과 같습니다:CC=/path/to/afl-cc CXX=/path/to/afl-c++ ./configure --disable-shared make clean all -
프로그램에 의미가 있는 작지만 유효한 입력 파일을 준비하세요. 복잡한 구문(SQL, HTTP 등)을 퍼징할 때는 dictionaries/README.md에 설명된 대로 사전도 생성하세요.
-
프로그램이 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++가 자동 생성된 파일 이름을 해당 위치에 넣어줍니다. -
퍼저 UI에서 빨간색으로 표시되는 모든 항목은 즉시 docs/afl-fuzz_approach.md#understanding-the-status-screen을 참조하여 조사하세요.
-
발견된 크래시와 행은
-o output_dir디렉토리의crashes/및hangs/하위 디렉토리에서 찾을 수 있습니다. 크래시를 재생하려면 대상에 입력으로 전달하세요. 예를 들어 대상이 stdin을 사용하는 경우:cat output_dir/crashes/id:000000,* | /path/to/tested/program [...program's cmdline...]코어를 생성하거나 gdb를 직접 사용하여 크래시를 추적할 수 있습니다.
-
퍼징의 커버리지 분석을 위해 파트너 도구인 cov-analysis(퍼징 코퍼스 기반 소스 커버리지 리포트)와 fuzz-reachability(하니스가 도달할 수 있는 함수의 정적 분석으로, 실행 가능한 커버리지 격차와 데드 코드를 구분하고 인스트루멘테이션 허용 목록 생성)를 권장합니다.
-
아무리 강조해도 지나치지 않습니다 — 효과적으로 퍼징하려면 docs/fuzzing_in_depth.md 문서를 읽으세요!
연락처
질문이 있나요? 우려 사항이 있나요? 버그 리포트가 있나요?
- 기여자들에게는 다음을 통해 연락할 수 있습니다 (예: 이슈 생성 — 단, AFL++ 결함에 한함!): https://github.com/AFLplusplus/AFLplusplus.
- FAQ와 모범 사례를 확인하세요.
- 가장 좋은 방법: Fuzzing Zulip 서버에 가입하세요!
브랜치
다음과 같은 브랜치가 있습니다:
- 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,
}
라이선스
AFL++는 GNU AGPL-3.0-or-later 라이선스로 배포됩니다. 간단히 말해, AFL++를 세 가지 방법으로 사용할 수 있습니다:
-
무료, AGPL-3.0-or-later 조건: 기본값입니다. AFL++를 사용, 수정 및 공유할 수 있습니다. 수정된 버전을 네트워크 서비스로 실행하는 경우 AGPL은 사용자에게 해당 소스 코드를 제공할 것을 요구합니다. 전문: LICENSE.
-
파일별, 해당 파일 헤더의 라이선스 조건: 프로젝트에는
SPDX-License-Identifier: AGPL-3.0-or-later및SPDX-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입니다. -
상용 라이선스: 선택 사항, AGPL을 준수할 수 없거나 준수하고 싶지 않은 조직을 위한 것입니다. 프로젝트는 금전적 이익을 받지 않습니다. 대신 **EFF 또는 CCC**에 EUR 20,000 (€20,000)을 기부하고 증빙을 [email protected]로 이메일로 보내세요. 그러면 기부 날짜부터 1년간 라이선스가 유효합니다 (재기부로 갱신 가능). 전체 조건: LICENSE.COMMERCIAL.
번들된 타사 구성 요소(예: xxHash, t1ha, libFuzzer, 서브모듈)는 자체 라이선스를 유지합니다. 완전한 쉬운 설명은 LICENSING.md를 참조하세요.