Centipede
表示
Centipedeは、Googleが開発した分散型ファジングエンジンで、特に大規模で遅いターゲットのファジングに適した設計がなされています。以下はその概要です。
Centipedeとは?
[編集]Centipedeは、主に以下の目的と特徴を備えています:
- 大規模ターゲット向けのファジング
- 分散型アーキテクチャ
- クラスタ環境でのスケールを前提に設計。
- ローカルで100ジョブ、クラスタ上で10,000ジョブ以上の並列処理が可能。
- ターゲットをプロセス分離
- ターゲットを別プロセスで実行することで、クラッシュがファザー本体に影響しない。
- 柔軟なカスタマイズ
- ユーザーは独自の「ミューテーター」や「エグゼキューター」を実装可能。
- 統合サポート
- AddressSanitizer(ASAN)、MemorySanitizer(MSAN)などのツールと連携可能。
ユースケース
[編集]Centipedeは、例えば以下のようなケースで利用が検討されています:
- SiliFuzzのようなプロジェクト:CPUやソフトウェアの非同期動作を検出するための大規模ファジング。
- 構造化データのファジング:プロトバッファやJSONなど、構造化された入力データの処理。
- カスタムターゲットの対応:特定用途向けのターゲットコードをテストする場合。
構成要素
[編集]Centipedeは以下の主要コンポーネントで構成されています:
- Fuzzingエンジン:入力を生成し、ターゲットに実行させる。
- Fuzzターゲット:入力を処理し、カバレッジ情報を返す対象。
- ミューテーター:入力データを少しずつ変異させる。
- エグゼキューター:ターゲットにデータを渡し、カバレッジ情報を収集する。
- コーパス:ターゲット実行中に収集された入力データの集合。
ビルドと使用方法
[編集]以下の手順で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で詳細を確認してみてください。