Fuzzing-101
構成
- 演習 1: Xpdf, CVE-2019-13288, 120分, Afl-clang-fast, Afl-fuzz, GDB
- 演習 2: libexif, CVE-2009-3895, CVE-2012-2836, 6時間, Afl-clang-lto, Fuzzライブラリ, Eclipse IDE
- 演習 3: TCPdump, CVE-2017-13028, 4時間, ASan, Sanitizers
- 演習 4: LibTIFF, CVE-2016-9297, 3時間, コードカバレッジ, LCOV
- 演習 5: Libxml2, CVE-2017-9048, 3時間, 辞書, 基本的な並列化, コマンドライン引数ファジング
- 演習 6: GIMP, CVE-2016-4994, ボーナスバグ, 7時間, 継続的ファジング, インタラクティブアプリケーションのファジング
- 演習 7: VLC メディアプレーヤー, CVE-2019-14776, 6時間, 部分計測, ファジングハーネス
- 演習 8: Adobe Reader, 8時間, クローズドソースアプリケーションのファジング, QEMU 計測
- 演習 9: 7-Zip, CVE-2016-2334, 8時間, WinAFL, Windows アプリケーションのファジング
- 演習 10 (最終チャレンジ): Google Chrome / V8, CVE-2019-5847, 8時間, Fuzzilli, JavaScript エンジンのファジング
変更ログ
- 2022年2月14日: 演習 5 の
wget のタイプミスを修正
- 2021年11月25日: 演習 3 を更新および修正
このコースは誰のためのものか?
- ファジングの基礎を学びたい人
- 実際のソフトウェアプロジェクトで脆弱性を見つけたい人
要件
- Linux システムとインターネット接続が必要
- 基本的な Linux スキルを推奨
- すべての演習は Ubuntu 20.04.2 LTS でテスト済み
- このコースでは Michał "lcamtuf" Zalewski の AFL の新しいフォークである AFL++ を使用
ファジングとは?
- ファズテスト(またはファジング): プログラムにランダム/変異した入力値を与え、例外/クラッシュを監視する自動化されたソフトウェアテスト手法
- AFL, libFuzzer, HonggFuzz は実際のアプリケーションで成功しているファザーの例
- カバレッジベースの進化的ファザー: コードカバレッジデータを収集して比較し、新しい実行パスを見つける入力値を選択
カバレッジベースの進化的ファザー
- 進化的: 進化アルゴリズムに着想を得たメタヒューリスティックなアプローチで、初期サブセット(シード)の進化と変異を通じて新しいクラッシュを見つける
- カバレッジベース: コードカバレッジデータを収集して比較し、新しい実行パスを見つける入力値を選択
謝辞
- 支援してくれた人々: Xavier RENE-CORAIL, Alan Vivona, Jason White, Octavio Gianatiempo, van Hauser, Marc Poulhiès, Xu Hanyu, tclan126, epi052, Jeremias Gomes
連絡先
- 支援が必要な場合や提案がある場合は、GitHub Security Lab Slack の
#fuzzing チャンネルに参加
GN⁺のまとめ
- このコースは、ファジングの基本概念を学び、実際のソフトウェアで脆弱性を見つけるのに役立つ
- AFL++ のようなツールを使って、多様な実例を通じてファジング技術を身につけることができる
- ファジングはソフトウェアの安定性とセキュリティを強化するうえで重要な役割を果たし、このコースはそのための実践的なアプローチを提供する
- 類似の機能を持つツールとして libFuzzer と HonggFuzz がある
1件のコメント
Hacker Newsの意見
リンク先の記事は読むのに11分ほどかかり、golangのアプローチとの違いが興味深い
ファジングをより効果的に導く技術について気になる
Heartbleedが一覧にないのは驚き
共有してくれてありがとうという意見