libFuzzerによるファジング
libFuzzerでコードをファジングし、エッジケースのクラッシュを見つけます。
「libFuzzerによるファジング」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
なぜファジングを行うのか
ファジングはランダムな入力を生成し、クラッシュ、ハング、セキュリティバグを見つけます。最新のファザーはカバレッジフィードバックを使い、新しいコードパスを探索する入力へと進化させます。
libFuzzer
libFuzzer は LLVM の一部で、サニタイザーと統合できます。1 つのエントリーポイントをファジングする関数を 1 つ記述し、入力の生成はフレームワークに任せます。
ファジングターゲットの作成
シグネチャは固定です。バイト配列を受け取り、0 を返します。
#include <cstdint>
#include <cstddef>
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
parse_input(reinterpret_cast<const char*>(data), size);
return 0;
}libFuzzer 用のコンパイル
Clang と -fsanitize=fuzzer,address の組み合わせを使用します。main は必要ないため、直接リンクします。
clang++ -g -O1 -fsanitize=fuzzer,address fuzz.cpp parser.cpp -o fuzz_target
./fuzz_targetカバレッジガイド付きの変異
libFuzzer は、各入力が実行するコードパスを追跡します。有望な入力を変異させて、より深いパスを探索するため、無作為な入力生成よりはるかに効率的です。
コーパス
興味深いことが分かっている入力をディレクトリにまとめ、ファザーの初期入力として与えます。ファザーはそれらを変異させて新しい入力を作ります。
./fuzz_target corpus/辞書ファイル
文法に沿った入力(HTML、JSON、プロトコルメッセージ)の探索を速めるため、よく使われるトークンの辞書を提供します。
サニタイザーと組み合わせる
AddressSanitizer の下で実行すると、ひそかなメモリ破壊が即座にクラッシュするため、ファザーで検出できるようになります。
パフォーマンス
小規模なターゲットであれば、1 つのコアで 1 秒あたり数万回の実行が可能です。数時間または数日実行し、CI のバックグラウンドで動かし続けます。
クラッシュの再現
libFuzzer がクラッシュを見つけると、入力をディスクに保存します。後で再生してデバッグできます。
./fuzz_target crash-abc123OSS-Fuzz
Google の OSS-Fuzz は、オープンソースプロジェクトに対して継続的にファザーを実行し、バグを報告します。多くの著名なライブラリがこれと統合しています。
AFL と Honggfuzz
他にもファザーがあります。
- AFL/AFL++ — プロセスベースで、フォークサーバーによる高速化に対応
- Honggfuzz — ネットワークプロトコルに対応
libFuzzer は C++ への統合が最も簡単です。
ファジングを行う対象
信頼できない入力を処理するコードはすべてファジングします。
- パーサー(JSON、XML、protobuf)
- デコーダー(画像、音声、動画)
- ネットワークプロトコルのハンドラー
- 外部データを読み取るあらゆるコード
確認問題
カバレッジガイド付きファジングが、純粋にランダムなファジングより効果的なのはなぜですか。
まとめ
libFuzzer は Clang と統合されたカバレッジガイド付きファザーです。LLVMFuzzerTestOneInput エントリーポイントを小さく記述し、-fsanitize=fuzzer,address でビルドして、クラッシュを探索させます。サニタイザーやコーパスと組み合わせ、信頼できない入力を扱うコードはすべてファジングします。
よくある質問
「libFuzzerによるファジング」レッスンは無料ですか?
はい。「libFuzzerによるファジング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「libFuzzerによるファジング」で何を学びますか?
libFuzzerでコードをファジングし、エッジケースのクラッシュを見つけます。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「libFuzzerによるファジング」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 静的解析ツール:clang-tidy、cppcheck
- Sanitizer:Address、Thread、UB Sanitizer
- libFuzzerによるファジング
- C++プロジェクトの継続的インテグレーション