American Fuzzy Lop の afl-fuzz がテストプログラムで実行中 | |
| 開発者 | ミハウ・ザレフスキ |
|---|---|
| 初回リリース | 2013年11月12日 |
| 安定版リリース | 2.57b / 2020年6月30日[1] |
| リポジトリ |
|
| 書かれた | C、アセンブリ |
| オペレーティング·システム | クロスプラットフォーム |
| タイプ | ファザー |
| ライセンス | Apache ライセンス 2.0 |
| Webサイト | lcamtuf.coredump.cx/afl/ |
American Fuzzy Lop ( AFL ) は、すべて小文字でamerican fuzzy lopと表記され、遺伝的アルゴリズムを使用してテストケースのコードカバレッジを効率的に増やすフリーソフトウェア ファザーです。これまでに、X.Org Server、[2]、PHP、[3]、OpenSSL、[4] [5]、pngcrush、bash、[6]、Firefox、[7]、BIND、[8] [9]、Qt、[10]、SQLite [11]などの主要なフリーソフトウェアプロジェクトで数十の重大なソフトウェアバグを検出しました。
AFL [12]は、2013 年 11 月に最初にリリースされて以来、セキュリティ研究で最も広く使用されているファザーの 1 つになりました。リリース後何年もの間、AFL は「最先端の」ファザーと見なされてきました。[13] AFL は「ファジングのデファクト スタンダード」と見なされており、[14] AFL のリリースは、研究分野としてのファジングの発展に大きく貢献しました。[15] AFL は学術界で広く使用されており、学術的なファザーは AFL のフォークであることが多く、AFL は新しい手法を評価するためのベースラインとしてよく使用されています。[16] [17]
アメリカン・ファジー・ロップのソースコードはGitHubで公開されています。その名前はウサギの一種であるアメリカン・ファジー・ロップに由来しています。
概要
AFL では、テスト対象のアプリケーションを実行するサンプル コマンドと、少なくとも 1 つの小さなサンプル入力をユーザーが提供する必要があります。入力は、標準入力経由で、またはプロセス コマンド ラインで指定された入力ファイルとして、テスト対象のプログラムに渡すことができます。ネットワーク プログラムのファジングは現在直接サポートされていませんが、場合によっては、この問題に対する実行可能な解決策があります。[18]たとえば、オーディオ プレーヤーの場合、American fuzzy lop に短いサウンド ファイルを開くように指示することができます。次に、ファジング ツールは指定されたコマンドを実際に実行しようとし、成功した場合は、同じ動作をトリガーする最小のファイルに入力ファイルを縮小しようとします。
この初期段階の後、AFL は入力ファイルにさまざまな変更を適用して、実際のファジング プロセスを開始します。テスト対象のプログラムがクラッシュまたはハングする場合、これは通常、新しいバグ、おそらくセキュリティの脆弱性が発見されたことを意味します。この場合、変更された入力ファイルは、ユーザーがさらに検査できるように保存されます。
ファジングのパフォーマンスを最大化するために、American fuzzy lop では、制御フローを追跡するヘルパー関数を使用してコードをインストルメント化するユーティリティ プログラムの支援を受けてテスト対象プログラムをコンパイルすることを想定しています。これにより、ファジングツールは入力に応じてターゲットの動作がいつ変化したかを検出できます。これが不可能な場合は、ブラック ボックス テストもサポートされます。
ファジングアルゴリズム

ファジングツールは、さまざまな入力に対してプログラムを繰り返し実行することで、対象プログラムの予期しない動作(つまり、バグ)を見つけようとします。前述のように、AFLはグレーボックスファジングツールです。つまり、コンパイル時に対象プログラムにコードカバレッジを測定するためのインストルメンテーションを注入し、カバレッジメトリックを使用して新しい入力の生成を指示します。AFLのファジングアルゴリズムは、その後の多くのグレーボックスファジングツールに影響を与えました。[20] [21]
AFLへの入力は、インストルメント化されたターゲットプログラム(テスト対象システム)とコーパス、つまりターゲットへの入力のコレクションです。入力はテストケースとも呼ばれます。アルゴリズムは入力のキューを維持し、入力コーパスに初期化されます。全体的なアルゴリズムは次のように機能します。[22]
- キューから次の入力をロードする
- テストケースを最小限に抑える
- テスト ケースを変更します。変更によってコード カバレッジが増加する場合は、それをキューに追加します。変更によってクラッシュまたはハングが発生する場合は、後で検査できるようにディスクに保存します。
- ステップ1に進む
突然変異
新しい入力を生成するために、AFLは既存の入力にさまざまな突然変異を適用します。[23]これらの突然変異は、ターゲットプログラムの入力形式にほとんど依存せず、通常は入力を単純なバイナリデータの塊として扱います。
まず、AFLは各入力に対して決定論的な突然変異のシーケンスを適用します。これらは入力のさまざまなオフセットに適用されます。これには以下が含まれます。[24] [25]
- 1~32ビットの反転(つまり、否定または反転)
- リトルエンディアンとビッグエンディアンの両方のエンコードで、8 ビット、16 ビット、32 ビットの整数を増分および減分します。
- 入力の一部を「約 2 ダースの「興味深い」値」で上書きします。これには、ゼロ、さまざまな幅の符号付きおよび符号なし整数の最大値と最小値が含まれます (これもリトルエンディアンとビッグエンディアンの両方のエンコードで行われます)。
- 入力の一部を、ユーザー指定または自動検出されたトークン( マジックバイト、テキストベースの形式のキーワードなど)の「辞書」から抽出したデータに置き換える[26] [23] [27]
利用可能なすべての決定論的突然変異を適用した後、AFLは2〜128の突然変異が連続して適用される段階である大混乱に進みます。これらの突然変異は次のいずれかです。 [23]
- 上で述べた決定論的突然変異
- ランダムな値でバイトを上書きする
- マルチバイト「ブロック」に対する操作:
- ブロックの削除
- ブロックの複製
- ブロック内の各バイトを単一の値に設定する
AFL がキュー全体を循環して新しいコード カバレッジを達成する入力を生成しない場合は、スプライシングを開始します。スプライシングでは、キューから 2 つの入力を取得し、任意の位置で切り捨てて連結し、その結果に Havoc ステージを適用します。
カバレッジの測定
AFLは、コードカバレッジを測定するためにビン化されたヒットカウントの使用を開拓しました。[28]著者は、この技術がパス爆発を軽減すると主張しています。[29] [30]
概念的には、AFL は、ターゲットの特定の実行がターゲットの制御フロー グラフの各エッジを通過する回数をカウントします。ドキュメントでは、これらのエッジをタプルと呼び、カウントをヒットカウントと呼びます。実行の最後に、ヒットカウントは1、2、3、4~7、8~15、16~31、32~127、および 128 以上の 8 つのバケットにビンまたはバケット化されます。AFL は、これまでの実行によって生成された (タプル、ビン化されたカウント) ペアのグローバル セットを維持します。入力が (タプル、ビン化されたカウント) ペアを生成し、それがまだグローバル セットにない場合は、その入力は「興味深い」とみなされ、キューに追加されます。
実際には、ヒットカウントは効率的だが損失のある方式で収集され、処理されます。コンパイル時のインストルメンテーションは、ターゲットプログラムの制御フローグラフの各分岐に、概念的に次のようなコードを挿入します。[31]
cur_location = < COMPILE_TIME_RANDOM > ; shared_mem [ cur_location ^ prev_location ] ++ ; prev_location = cur_location >> 1 ;
ここで、<COMPILE_TIME_RANDOM>はランダムな整数であり、はファザーとターゲット間で
共有されるshared_mem64キロバイトのメモリ領域です。
この表現は、単純なブロックまたはステートメントのカバレッジよりもきめが細かく(より多くの実行を区別します)なっていますが、それでも線形時間の「興味深さ」テストが可能になります。
最小化
入力が小さいほど実行時間が短くなるという仮定に基づいて、AFLはキュー内のテストケースを最小化またはトリミングしようとします。 [23] [32]トリミングは入力からブロックを削除することによって機能します。トリミングされた入力でも同じカバレッジが得られる場合(「カバレッジの測定」を参照)、元の入力は破棄され、トリミングされた入力がキューに保存されます。
スケジュール
AFLはキューから優先入力のサブセットを選択し、非優先入力はある確率でスキップされる。[33] [28]
特徴
パフォーマンス機能
American fuzzy lopが解決しなければならなかった課題の1つは、1秒間に数百のプロセスを効率的に生成するforkことでした。すべてのプロセスを最初から生成する元のエンジンとは別に、American fuzzy lopはシステムコールに大きく依存するデフォルトのエンジンを提供しています。[34] [28]これは、 LLVMの遅延フォークサーバーモードまたは同様の永続モードを活用することでさらに高速化できますが、テスト対象のプログラムを変更する必要があるというコストがかかります。[35]また、American fuzzy lopは、ネットワーク経由で同じプログラムをファジングすることもサポートしています。
ユーザーインターフェース
American fuzzy lop は、ファジング プロセスに関する統計情報をリアルタイムで表示するカラフルなコマンド ライン インターフェイスを備えています。さまざまな設定は、コマンド ライン オプションまたは環境変数によってトリガーできます。また、プログラムは、マシンが読み取り可能な形式でファイルから実行時統計情報を読み取ることもできます。
ユーティリティプログラム
afl-fuzzバイナリ計測に使用できる およびツールに加えて、American fuzzy lop には、ファジング プロセスの監視を目的としたユーティリティ プログラムが備わっています。それとは別に、テスト ケースとテスト コーパスの最小化に使用できるafl-cminおよびがあります。これは、 によって生成されたテスト ケースが他のファザーによって使用される場合
afl-tminに役立ちます。afl-fuzz
フォーク
AFL は、新しいファジング手法を検証したり、さまざまな種類のプログラムにファジングを適用したりするために、何度もフォークされてきました。注目すべきフォークには次のようなものがあります。
- AFL++
- MOPT-AFL [36]
- AFLファスト[37]
- AFLSmart [38]
- AFLGo [39]
- シムCC-AFL [40]
- WinAFL、「WindowsバイナリをファジングするためのAFLのフォーク」[41]
AFL++
| 初回リリース | 2.52c / 2019年6月5日 |
|---|---|
| 安定版リリース | 4.08c / 2023年8月10日[42] |
| リポジトリ |
|
| Webサイト | aflplus.plus |
AFL++(AFLplusplus)[43]は、2017年9月以来Googleの上流AFL開発が比較的不活発であったために作成された、コミュニティによって維持されているAFLのフォークです。新しい機能と高速化が含まれています。[44]
オープンソースソフトウェアに無料のファジングサービスを提供するGoogleのOSS-Fuzzイニシアチブは、2021年1月にAFLオプションをAFL++に置き換えました。[45] [46]
参考文献
注記
- ^ 「リリース - google/AFL」。2021年1月19日閲覧– GitHub経由。
- ^ 「アドバイザリ-2015-03-17」x.org。
- ^ 「NVD - 詳細」. nist.gov .
- ^ 「NVD - 詳細」. nist.gov .
- ^ 「NVD - 詳細」. nist.gov .
- ^ 「CVE - CVE-2014-6278」。mitre.org。
- ^ 「CVE - CVE-2014-8637」。mitre.org。
- ^ 「American Fuzzy Lop でサーバーをファジングする方法」。Fastly 。2015年 7 月 21 日。
- ^ 「CVE - CVE-2015-5477」。mitre.org。
- ^ 「[発表] Qt プロジェクト セキュリティ アドバイザリ - Qt イメージ フォーマット処理における複数の脆弱性」。qt -project.org。2015年 4 月 13 日。
- ^ 「SQLite のテスト方法 # 4.1.1. American Fuzzy Lop Fuzzer を使用した SQL ファズ」。sqlite.org。
- ^ 「テスト管理およびレポートソフトウェア」www.aflglobal.com . 2024年8月13日閲覧。
- ^ Poncelet, Clement; Sagonas, Konstantinos; Tsiftes, Nicolas (2023 年 1 月 5 日)。「ファザーはたくさんあるのに、時間は少ない✱」。第 37 回 IEEE/ACM 国際自動ソフトウェア エンジニアリング会議の議事録。ASE '22。ニューヨーク、ニューヨーク州、米国: Association for Computing Machinery。pp. 1–12。doi : 10.1145 / 3551349.3556946。ISBN 978-1-4503-9475-8. S2CID 253456740。
- ^ フィオラルディ他2023年、2頁。
- ^ Fioraldi, Andrea; Maier, Dominik Christian; Zhang, Dongjia; Balzarotti, Davide (2022 年 11 月 7 日)。「LibAFL」。2022 ACM SIGSAC コンピューターおよび通信セキュリティ会議の議事録。CCS '22。ニューヨーク、ニューヨーク州、米国: Association for Computing Machinery。pp. 1051–1065。doi : 10.1145 /3548606.3560602。ISBN 978-1-4503-9450-5. S2CID 253410747。「AFL のリリースは、ソフトウェア セキュリティ テストの分野における重要なマイルストーンとなり、ファジングを主要な研究テーマとして再活性化させました」。
- ^ Hazimeh, Ahmad; Herrera, Adrian; Payer, Mathias (2021年6月15日). 「Magma: Ground-Truth Fuzzing Benchmark」. Proceedings of the ACM on Measurement and Analysis of Computing Systems . 4 (3): 49:1–49:29. arXiv : 2009.01120 . doi :10.1145/3428334. S2CID 227230949.
- ^ メッツマンら2021年。
- ^ Technion. 「nginx のファジング - afl-fuzz による脆弱性の検出」. lolware.net .
- ^ Zalewski, Michał (2015年2月27日). 「Logo for afl-fuzz」. afl-users | Google グループ. 2019年7月25日閲覧。
- ^ フィオラルディら2023年。
- ^ Chen, Peng; Chen, Hao ( 2018年 5 月)。「Angora: Principled Search による効率的なファジング」。2018 IEEE セキュリティおよびプライバシーシンポジウム (SP)。pp. 711–725。doi :10.1109/ SP.2018.00046。ISBN 978-1-5386-4353-2.S2CID 3729194 。
- ^ 「AFL の背後にある動機 — AFL 2.53b ドキュメント」。afl -1.readthedocs.io 。2023年2 月 26 日閲覧。
- ^ abcd フィオラルディら。 2023、p. 6.
- ^ 「バイナリ ファジング戦略: 何が機能し、何が機能しないか」。lcamt uf.blogspot.com。2014年 8 月 8 日。
- ^ 「AFL ユーザーガイド — AFL 2.53b ドキュメント」。afl -1.readthedocs.io 。2023年2 月 26 日閲覧。
- ^ 「SQLite のバグを簡単に見つける方法」lcamtuf.blogspot.com . 2015 年 4 月 14 日。
- ^ マネス、バレンティン JM;ハン・ヒョンソク。ハン、チュンウ。チャ・サンキル。エゲレ、マヌエル。シュワルツ、エドワード J.ウー、マーベリック(2021年11月)。 「ファジングの芸術、科学、工学: 調査」。ソフトウェアエンジニアリングに関するIEEEトランザクション。47 (11): 2312–2331。arXiv : 1812.00140。土井:10.1109/TSE.2019.2946563。ISSN 1939-3520。S2CID 102351047。
- ^ abc フィオラルディら。 2023、p. 5.
- ^ 「afl-fuzz の技術「ホワイトペーパー」」
- ^ 「AFL の詳細 — AFL 2.53b ドキュメント」。afl -1.readthedocs.io 。2023年2 月 27 日閲覧。「このアプローチにより、複雑な実行トレースの計算集約的で脆弱なグローバル比較を実行する必要がなくなり、パス爆発の脅威を回避しながら、プログラム状態の非常にきめ細かな長期的調査が可能になります。」
- ^ 「AFL の詳細 — AFL 2.53b ドキュメント」。afl -1.readthedocs.io 。2023年2 月 27 日閲覧。
- ^ 「AFL の詳細 — AFL 2.53b ドキュメント」。afl -1.readthedocs.io 。2023年2 月 27 日閲覧。
- ^ 「AFL の詳細 — AFL 2.53b ドキュメント」。afl -1.readthedocs.io 。2023年2 月 27 日閲覧。
- ^ 「execve() なしでランダム プログラムをファジングする」lcamtuf.blogspot.com . 2014 年 10 月 14 日。
- ^ 「AFL の新機能: 永続モード」。lcamt uf のブログ。2015 年 6 月 11 日。
- ^ 劉、晨陽。ジー、ショーリン。チャン、チャオ。リー、ユウウェイ。リー・ウェイハン。ソン、ユウ。ベヤ、ラヒーム(2019)。 {MOPT}: ファザーの最適化された突然変異スケジューリング。 1949 ~ 1966 ページ。ISBN 978-1-939133-06-9。
- ^ マルセル、ベーメ;ファム、ヴァントゥアン。ロイチョードリー、アビク(2019年5月)。 「マルコフ連鎖としてのカバレッジベースのグレイボックスファジング」。ソフトウェアエンジニアリングに関するIEEEトランザクション。45 (5): 489–506。土井:10.1109/TSE.2017.2785841。ISSN 1939-3520。
- ^ ファム、ヴァントゥアン;ベーメ、マルセル。サントーサ、アンドリュー E.カチュレスク、アレクサンドル・ラズヴァン。ロイチョードリー、アビク(2021年9月)。 「スマート グレーボックス ファジング」。ソフトウェアエンジニアリングに関するIEEEトランザクション。47 (9): 1980 ~ 1997 年。土井:10.1109/TSE.2019.2941681。ISSN 1939-3520。S2CID 53721813。
- ^ Böhme, Marcel; Pham, Van-Thuan; Nguyen, Manh-Dung; Roychoudhury, Abhik (2017 年 10 月 30 日)。「Directed Greybox Fuzzing」。2017 ACM SIGSAC コンピューターおよび通信セキュリティ会議の議事録。CCS '17。ニューヨーク、ニューヨーク州、米国: Association for Computing Machinery。pp. 2329–2344。doi :10.1145 / 3133956.3134020。ISBN 978-1-4503-4946-8. S2CID 29430742。
- ^ Poeplau, Sebastian; Francillon, Aurélien (2020). SymCC によるシンボリック実行: 解釈しないで、コンパイルしましょう! pp. 181–198. ISBN 978-1-939133-17-5。
- ^ WinAFL、Google Project Zero、2023年2月23日、 2023年2月26日閲覧
- ^ 「リリース - AFLplusplus/AFLplusplus」。2023年11月1日閲覧– GitHub経由。
- ^ Fioraldi, Andrea; Maier, Dominik; Eißfeldt, Heiko; Heuse, Marc (2020 年 8 月)。AFL++: ファジング研究の段階的なステップを組み合わせる。第 14 回 USENIX 攻撃技術ワークショップ (WOOT 20)。
- ^ 「AFL++ ファジング フレームワーク」。AFLplusplus。
- ^ metzman, jonathan. "[afl++] ファジングには AFL ではなく AFL++ を使用する。by jonathanmetzman · Pull Request #5046 · google/oss-fuzz". GitHub .
- ^ メッツマンら。 2021年、p. 1394年。
出典
- Fioraldi, Andrea; Mantovani, Alessandro; Maier , Dominik; Balzarotti, Davide (2023 年 1 月 20 日)。「American Fuzzy Lop の分析 - FuzzBench の評価」。ACM Transactions on Software Engineering and Methodology。32 (2): 1–26。doi : 10.1145 /3580596。ISSN 1049-331X。S2CID 247088398 。
- Metzman, Jonathan; Szekeres, László; Simon, Laurent; Sprabery, Read; Arya, Abhishek (2021 年 8 月 18 日)。「FuzzBench: オープンなファザー ベンチマーク プラットフォームおよびサービス」。第 29 回 ACM 欧州ソフトウェア エンジニアリング会議合同会議およびソフトウェア エンジニアリングの基礎に関するシンポジウムの議事録。ESEC / FSE 2021。米国ニューヨーク州ニューヨーク: Association for Computing Machinery。pp. 1393–1403。doi : 10.1145 /3468264.3473932。ISBN 978-1-4503-8562-6. S2CID 237205274。
さらに読む
- 原著者ミハウ・ザレフスキが執筆したAFLの技術「ホワイトペーパー」
- マルチシステムとインターネットセキュリティのクックブック、Hors-Serie No. 11「セキュリティツール」、p. 36、「American Fuzzy Lop」、Kevin Denis、2015年6月。[1] 2016年5月6日アーカイブ、Wayback Machine
- 「ファズとストリングス (lwn.net)」
- 「FreeBSD でのファジング - security/afl による (ほぼ) 自動化されたバグ検出」 - FOSDEMでのプレゼンテーション
- 「2 つの障害探索ミサイルを使用したテスト: ファジングとプロパティ ベース テスト」 - EuroPython 2015 でのプレゼンテーション。
- 「ファジング プロジェクト」
- 「AFL によるコードのファジング」、ピーター・グットマン、;login、第 41 巻、第 2 号、2016 年夏、[2]
外部リンク
- AFL公式ドキュメント
- AFL の作者である Michał Zalewski のブログ。このブログには、AFL の技術的な詳細を詳しく説明した投稿がいくつか掲載されています。
