1 ポイント 投稿者 GN⁺ 2024-10-07 | 1件のコメント | WhatsAppで共有
  • Fuzzing-101 は、ファジングを初めて学ぶ人が実際のソフトウェアを対象に脆弱性を見つける過程を練習できるように作られたコース
  • コースは 10個の実際の対象と10個の演習 で構成されており、Xpdf、libexif、TCPdump、LibTIFF、Libxml2、GIMP、VLC media player、Adobe Reader、7-Zip、Google Chrome/V8 を扱う
  • 各演習は CVE の再現または発見を目的とし、CVE-2019-13288CVE-2016-2334CVE-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件のコメント

 
GN⁺ 2024-10-07
Hacker News のコメント
  • ファジングに関する逸話: https://threadreaderapp.com/thread/1799457232607985698
    11分ほど無駄にしたいなら、良い読み物です

    • Google で 2007年の CNET 記事が出てきますが、おそらく eEye が「プレスリリースを方々にばらまいた」からでしょう: https://www.cnet.com/news/privacy/flaw-found-in-office-2007/
      他社製品のバグを探すために競い合ったあと、よりによって Microsoft Publisher で1つ見つけたと得意げに語り、Microsoft をこき下ろす文化はよく理解できません
      自社製品をテストするために1週間ずっと徹夜するのが「標準プロセス」になっている会社があるなら、誰もが幸運なのかもしれません
    • 文体が確かに面白さを増しています
      筆者を確認してみると、IRC で知っていた人かもしれず、「Mantis」と「infosec」がぴったり一致します
  • 興味深いのは、これと Go のアプローチがはっきり違う点です
    Go ではテストを走らせるように簡単にファジングを実行できるので、アプリケーションやライブラリの特定部分を狙うのがとても簡単です
    そのため、こうした手法の多くが不要になります
    ファジングをよりうまく誘導する手法が気になりますが、現時点ではシードコーパスを提供してうまくいくことを期待するのが最善のように見えます

    • libFuzzer のような一部のファジングツールは LLVM 中間表現を活用してコードカバレッジ指標を作り、それをファジングアルゴリズムにフィードバックしてテストカバレッジを高めます
    • カバレッジを誘導するために強化学習を使うアイデアを博士課程のテーマとして提案したことはありますが、実際にその道には進まず、動作するかどうかも分かりません
  • Heartbleed が一覧にないのは意外です。再現はとても簡単です

    • ここにあるチュートリアルはいずれもローカルファイルやローカルデータを使っていて、ネットワークベースのファジングは扱っていないため外れたのだと思います