コンテンツにスキップ

Centipede

出典: フリー教科書『ウィキブックス(Wikibooks)』

Centipedeは、Googleが開発した分散型ファジングエンジンで、特に大規模で遅いターゲットのファジングに適した設計がなされています。以下はその概要です。

Centipedeとは?

[編集]

Centipedeは、主に以下の目的と特徴を備えています:

  1. 大規模ターゲット向けのファジング
    既存のファジングエンジン(例: LibFuzzer, AFL)がスケールしにくい、大規模で複雑なターゲットに対応。
  2. 分散型アーキテクチャ
    • クラスタ環境でのスケールを前提に設計。
    • ローカルで100ジョブ、クラスタ上で10,000ジョブ以上の並列処理が可能。
  3. ターゲットをプロセス分離
    ターゲットを別プロセスで実行することで、クラッシュがファザー本体に影響しない。
  4. 柔軟なカスタマイズ
    ユーザーは独自の「ミューテーター」や「エグゼキューター」を実装可能。
  5. 統合サポート
    AddressSanitizer(ASAN)、MemorySanitizer(MSAN)などのツールと連携可能。

ユースケース

[編集]

Centipedeは、例えば以下のようなケースで利用が検討されています:

  • SiliFuzzのようなプロジェクト:CPUやソフトウェアの非同期動作を検出するための大規模ファジング。
  • 構造化データのファジング:プロトバッファやJSONなど、構造化された入力データの処理。
  • カスタムターゲットの対応:特定用途向けのターゲットコードをテストする場合。

構成要素

[編集]

Centipedeは以下の主要コンポーネントで構成されています:

  1. Fuzzingエンジン:入力を生成し、ターゲットに実行させる。
  2. Fuzzターゲット:入力を処理し、カバレッジ情報を返す対象。
  3. ミューテーター:入力データを少しずつ変異させる。
  4. エグゼキューター:ターゲットにデータを渡し、カバレッジ情報を収集する。
  5. コーパス:ターゲット実行中に収集された入力データの集合。

ビルドと使用方法

[編集]

以下の手順でCentipedeをセットアップします:

Centipedeのビルド

[編集]
git clone https://github.com/google/fuzztest.git
cd fuzztest
bazel build -c opt centipede:all
  • $BIN_DIR/centipede:エンジン本体
  • $BIN_DIR/libcentipede_runner.pic.a:リンク用ランナーライブラリ
  • $CENTIPEDE_SRC/clang-flags.txt:推奨コンパイルフラグ

ファズターゲットのビルド

[編集]

ターゲットをコンパイルし、Centipedeとリンクします。

単純な例(byte_cmp_4)

[編集]
# コンパイル
FUZZ_TARGET=byte_cmp_4
clang++ @$CENTIPEDE_SRC/clang-flags.txt -c $CENTIPEDE_SRC/puzzles/$FUZZ_TARGET.cc -o $BIN_DIR/$FUZZ_TARGET.o

# リンク
clang++ $BIN_DIR/$FUZZ_TARGET.o $BIN_DIR/libcentipede_runner.pic.a \
    -ldl -lrt -lpthread -o $BIN_DIR/$FUZZ_TARGET

LibPNGの例

[編集]

以下の手順でLibPNGをターゲットとして利用できます。

LIBPNG_BRANCH=v1.6.37
git clone --branch $LIBPNG_BRANCH https://github.com/glennrp/libpng.git
cd libpng
./configure
make

Centipedeの利点と課題

[編集]

利点

[編集]
  • スケーラブルな設計により、大規模ターゲットに対応。
  • 独自の実装が可能で、柔軟な適応性を持つ。
  • サニタイザーとの連携により、幅広いバグを検出可能。

課題

[編集]
  • 開発中のため、インターフェースや仕様が安定していない。
  • 初期セットアップにはある程度の知識が必要。

Centipedeは現在進行中のプロジェクトで、特にスケーリングが求められる環境での使用に特化した設計を持っています。興味があれば、FuzzTestで詳細を確認してみてください。