
AFLplusplus v5.03c
AFL++は最先端のファザーであり、ベンチマークで第1位です。元々はAFLをベースにしていました。現在はqemu 5.1、衝突のないカバレッジ、強化されたlaf-intel & redqueen、AFLfast++パワースケジュール、MOptミューテーター、unicorn_modeなどを備えています!
American Fuzzy Lop plus plus (AFL++)
リリースバージョン: 5.03c
GitHub バージョン: 5.04a
リポジトリ: 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 を、詳細については
下記の License セクション を参照してください。
はじめに
始めるための情報をいくつか紹介します:
- AFL++ ドキュメントの概要と非常に役立つグラフィカルガイドについては、 docs/README.md をご覧ください。
- チュートリアルを始めるには、 docs/tutorials.md に進んでください。
- リリースについては、
Releases タブ と
ブランチ を参照してください。ただし、使用するのに最適なブランチは
リスク許容度に応じて
stableまたはdevです。また、 AFL++ の重要な変更点 のリストと 機能 のリストもご覧ください。 - AFL++ を学術研究に使用したい場合は、ウェブサイトの 論文ページ を確認してください。
- 私たちの研究を引用するには、Cite セクションを参照してください。
- 比較には、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 ブランチへのプッシュが発生したときに自動的に公開されます
(branches を参照)。上記のコマンドを使用すると、コンテナ内の
/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 ドキュメントを読んでください!
連絡先
質問は?懸念は?バグ報告は?
- コントリビューターには(例えば、issue を作成することで - ただし AFL++ の欠陥のみ!)連絡できます: https://github.com/AFLplusplus/AFLplusplus。
- 私たちの FAQ と ベストプラクティス をご覧ください。
- 最善の方法:Fuzzing Zulip サーバーに参加することです!
ブランチ
以下のブランチが存在します:
- release:最新の リリース
- stable:AFL++ の安定した 状態 - 安定性に満足したときに dev から随時同期されます。これがデフォルトブランチです。
- dev:AFL++ の開発 状態 - 最先端であり、コンパイルできない、またはバグのあるチェックアウトに遭遇する可能性があります。私たちは 'dev' ブランチへの PR(プルリクエスト)のみを受け付けます!
- (その他):特定の機能に取り組んだり、新しい機能や変更をテストしたりするための実験的ブランチ。
協力者募集
「help wanted」タグが付いた issue リストをご覧ください。 これは AFL++ をサポートし貢献する方法になり得ます - 何かクールなことをするために拡張してください。他のアイデアがあれば - issue を作成して提案するだけです!
貢献したい(そしてプルリクエストを送りたい)すべての方は、提出前に 貢献ガイドラインをお読みください。
特別な感謝
オリジナルの AFL と AFL++ への改善の多くは、コントリビューターからの フィードバック、バグ報告、またはパッチなしには実現できませんでした。
ありがとうございます!(プルリクエストを送る方は - このリストにご自身を追加してください :-)