Fuzzing 101 基礎
(github.com/antonio-morales)- Fuzzing-101 は、ファジングを初めて学ぶ人が実際のソフトウェアを対象に脆弱性を見つける過程を練習できるように作られたコース
- コースは 10個の実際の対象と10個の演習 で構成されており、Xpdf、libexif、TCPdump、LibTIFF、Libxml2、GIMP、VLC media player、Adobe Reader、7-Zip、Google Chrome/V8 を扱う
- 各演習は CVE の再現または発見を目的とし、CVE-2019-13288、CVE-2016-2334、CVE-2019-5847 などの脆弱性とともに、AFL++、ASan、LCOV、WinAFL、Fuzzilli などを使用する
- 受講条件はインターネットに接続された Linux システム であり、基本的な Linux の操作能力が推奨され、すべての演習は Ubuntu 20.04.2 LTS でテストされている
- ファジングは、ランダムまたは変異した入力をプログラムに与え、例外やクラッシュを監視する自動化テスト手法であり、このコースでは カバレッジベースの進化型ファザー の基本動作を学習対象としている
コースの目的と対象
- Fuzzing-101 は、ファジングを専門的に学びたいが、どこから始めればよいかわからない人のためのコース
- コースは 10個の実際のターゲット と 10個の演習 で構成される
- 想定読者は次のとおり
- ファジングの基礎 を学びたい人
- 実際のソフトウェアプロジェクトで 脆弱性を見つける方法 を学びたい人
演習構成
- 各演習では、特定のソフトウェア、見つける CVE、想定所要時間、主要トピックをあわせて示している
| 演習 | 対象 | 見つける CVE | 想定時間 | 主要トピック |
|---|---|---|---|---|
| Exercise 1 | Xpdf | CVE-2019-13288 | 120分 | Afl-clang-fast, Afl-fuzz, GDB |
| Exercise 2 | libexif | CVE-2009-3895, CVE-2012-2836 | 6時間 | Afl-clang-lto, ライブラリファジング, Eclipse IDE |
| Exercise 3 | TCPdump | CVE-2017-13028 | 4時間 | ASan, Sanitizers |
| Exercise 4 | LibTIFF | CVE-2016-9297 | 3時間 | コードカバレッジ, LCOV |
| Exercise 5 | Libxml2 | CVE-2017-9048 | 3時間 | 辞書, 基本並列化, コマンドライン引数ファジング |
| Exercise 6 | GIMP | CVE-2016-4994, ボーナスバグ | 7時間 | 持続的ファジング, 対話型アプリケーションのファジング |
| Exercise 7 | VLC media player | CVE-2019-14776 | 6時間 | 部分計測, ファジングハーネス |
| Exercise 8 | Adobe Reader | なし | 8時間 | クローズドソースアプリケーションのファジング, QEMU 計測 |
| Exercise 9 | 7-Zip | CVE-2016-2334 | 8時間 | WinAFL, Windows アプリケーションのファジング |
| Exercise 10 | Google Chrome / V8 | CVE-2019-5847 | 8時間 | Fuzzilli, JavaScript エンジンのファジング |
実行環境とツール
- 必要なのはインターネット接続が可能な Linux システム
- 演習内で使用できる VMware イメージが提供される
- 基本的な Linux の操作能力 が強く推奨される
- すべての演習は Ubuntu 20.04.2 LTS でテストされている
- コースでは AFL++ を使用する
- AFL++ は Michał “lcamtuf” Zalewski の AFL から分岐した、より新しく優れたフォークとして紹介されている
ファジングの基本概念
- ファズテスト(fuzz testing) またはファジングは、プログラムにランダムまたは変異した入力値を与え、例外やクラッシュを監視する自動化ソフトウェアテスト手法
- 実際のアプリケーションで成功したファザーの例として AFL, libFuzzer, HonggFuzz が示されている
- この3つのツールはいずれも カバレッジベースの進化型ファザー の例
カバレッジベースの進化型ファザー
- 進化型(evolutionary) アプローチは、進化アルゴリズムに着想を得たメタヒューリスティック手法
- 初期入力集合であるシード(seeds)を時間とともに進化・変異させる
- 選択基準の例として カバレッジ が使われる
- カバレッジベース(coverage-guided) ファザーは、新たなクラッシュを見つける可能性を高めるため、入力ごとのコードカバレッジデータを収集・比較する
- カバレッジ収集は通常 計測(instrumentation) を通じて行われる
- 新しい実行経路につながる入力を選択する
変更履歴
- 2022-02-14: Exercise 5 の一部
wgetの誤記が修正された - 2021-11-25: Exercise 3 が一部修正とともに更新された
1件のコメント
Hacker News のコメント
ファジングに関する逸話: https://threadreaderapp.com/thread/1799457232607985698
11分ほど無駄にしたいなら、良い読み物です
他社製品のバグを探すために競い合ったあと、よりによって Microsoft Publisher で1つ見つけたと得意げに語り、Microsoft をこき下ろす文化はよく理解できません
自社製品をテストするために1週間ずっと徹夜するのが「標準プロセス」になっている会社があるなら、誰もが幸運なのかもしれません
筆者を確認してみると、IRC で知っていた人かもしれず、「Mantis」と「infosec」がぴったり一致します
興味深いのは、これと Go のアプローチがはっきり違う点です
Go ではテストを走らせるように簡単にファジングを実行できるので、アプリケーションやライブラリの特定部分を狙うのがとても簡単です
そのため、こうした手法の多くが不要になります
ファジングをよりうまく誘導する手法が気になりますが、現時点ではシードコーパスを提供してうまくいくことを期待するのが最善のように見えます
Heartbleed が一覧にないのは意外です。再現はとても簡単です