0Pricing
C++ Academy · レッスン

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-abc123

OSS-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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 静的解析ツール:clang-tidy、cppcheck
  2. Sanitizer:Address、Thread、UB Sanitizer
  3. libFuzzerによるファジング
  4. C++プロジェクトの継続的インテグレーション
← C++ Academyに戻る