
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 License の下にあるファイルも含まれています。
ファジングハーネスにコンパイルされるすべてのものは、Apache 2.0 ライセンスのままです。
各ファイルは、その SPDX-License-Identifier ヘッダーに自身のライセンスを明記しています - それが
そのファイルに対して従わなければならないライセンスです。
AGPL を使用できない組織向けに、オプションの商用ライセンスも利用可能です
(善因団体への寄付によって取得可能 - プロジェクトおよびそのメンテナンス担当者は
いかなる金銭も受け取りません)。
平易な言葉での概要については LICENSING.md を、詳細については
以下のライセンスセクションを参照してください。
はじめに
ここでは、始めるための情報をいくつか紹介します:
- AFL++ ドキュメントの概要と非常に役立つグラフィカルガイドについては、 docs/README.md を参照してください。
- チュートリアルを始めるには、 docs/tutorials.md にアクセスしてください。
- リリースについては、リリースタブと
ブランチを参照してください。ただし、使用するのに最適なブランチは、リスク許容度に応じて
stableまたはdevです。また、AFL++ の 重要な変更点 と 機能 のリストも確認してください。 - 学術研究で AFL++ を使用する場合は、ウェブサイトの 論文ページ を確認してください。
- 私たちの研究を引用するには、引用セクションを参照してください。
- 比較には、fuzzbench の
aflplusplusセットアップ、またはAFL_LLVM_CMPLOG=1を指定したafl-clang-fastを使用してください。aflplusplusのデフォルト設定は、Google の fuzzbench にあります。
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...]辞書を追加するには、
-x /path/to/dictionary.txtを afl-fuzz に追加します。プログラムがファイルから入力を受け取る場合は、プログラムのコマンドラインに
@@を配置できます。 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++ は 3 つの方法で使用できます:
-
無料、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 License の下で個別に再利用できます。(いくつかの バンドルされたサードパーティファイルは他のライセンスを保持しています。例: GCC プラグインは GPL-3.0-or-later、LLVM SanitizerCoverage パスは Apache-2.0-WITH-LLVM-exception - それぞれ独自の SPDX 識別子でマークされています。) 組み合わせたafl-fuzzバイナリには AGPL ファイルが含まれているため、プログラム全体としては AGPL であることに 注意してください。 -
商用ライセンス: オプション。AGPL に準拠できない、または準拠したくない組織向け。 プロジェクトはいかなる金銭も受け取りません。 代わりに EUR 20,000 (€20,000) を EFF または CCC のいずれかに寄付し、証明を [email protected] にメールで送信してください。ライセンスは寄付日から 1年間有効です (再度寄付することで更新可能)。完全な条件: LICENSE.COMMERCIAL。
バンドルされたサードパーティコンポーネント (例: xxHash、t1ha、libFuzzer、サブモジュール) は 独自のライセンスを保持します。完全な平易な言葉での概要については、 LICENSING.md を参照してください。