ossfuzz
OSS-Fuzzは、オープンソースプロジェクト向けに無料の継続的ファジングを提供するサービスです。継続的なファジングインフラのセットアップやプロジェクトの登録を行う際に使用します。
description の原文を見る
> OSS-Fuzz provides free continuous fuzzing for open source projects. Use when setting up continuous fuzzing infrastructure or enrolling projects.
SKILL.md 本文
OSS-Fuzz
OSS-Fuzz は、Google が開発したオープンソースプロジェクトで、継続的ファズテスト向けの無料分散インフラストラクチャを提供します。ファジングプロセスを簡素化し、より簡単な修正を可能にします。OSS-Fuzz に受け入れられるのは選定されたプロジェクトのみですが、プロジェクトのコアはオープンソースであるため、誰でもプライベートプロジェクト用に独自のインスタンスをホストできます。
概要
OSS-Fuzz は、イメージをビルドしてハーネスを開始したり、そのカバレッジを計算したりするための簡単な CLI フレームワークを提供します。さらに、OSS-Fuzz はカバレッジ情報などのファジング出力から生成された静的 Web ページをホストするサービスとして使用できます。
主要な概念
| 概念 | 説明 |
|---|---|
| helper.py | イメージのビルド、ファザーのビルド、ハーネスのローカル実行用 CLI スクリプト |
| Base Images | ビルド依存関係とコンパイラを提供する階層的 Docker イメージ |
| project.yaml | OSS-Fuzz 登録用のプロジェクトメタデータを定義する設定ファイル |
| Dockerfile | ビルド依存関係を含むプロジェクト固有のイメージ |
| build.sh | プロジェクト用のファジングハーネスをビルドするスクリプト |
| Criticality Score | プロジェクト受け入れを評価するために OSS-Fuzz チームが使用するメトリクス |
適用時期
このテクニックを適用する場合:
- オープンソースプロジェクト向けの継続的ファジングを設定する
- サーバー管理なしで分散ファジングインフラストラクチャが必要
- ファジングと統合されたカバレッジレポートとバグ追跡が必要
- 既存の OSS-Fuzz ハーネスをローカルでテストする
- OSS-Fuzz バグレポートからのクラッシュを再現する
このテクニックをスキップする場合:
- プロジェクトがクローズドソース(独自の OSS-Fuzz インスタンスをホストしない限り)
- プロジェクトが OSS-Fuzz の criticality score の閾値を満たさない
- 専有またはカスタマイズされたファジングインフラストラクチャが必要
- インフラストラクチャが必要でない簡単なスクリプトのファジング
クイックリファレンス
| タスク | コマンド |
|---|---|
| OSS-Fuzz をクローン | git clone https://github.com/google/oss-fuzz |
| プロジェクトイメージをビルド | python3 infra/helper.py build_image --pull <project> |
| ASan でファザーをビルド | python3 infra/helper.py build_fuzzers --sanitizer=address <project> |
| 特定のハーネスを実行 | python3 infra/helper.py run_fuzzer <project> <harness> |
| カバレッジレポートを生成 | python3 infra/helper.py coverage <project> |
| helper.py オプションを確認 | python3 infra/helper.py --help |
OSS-Fuzz プロジェクトコンポーネント
OSS-Fuzz は、複数の公開利用可能なツールと Web インターフェースを提供します。
バグトラッカー
バグトラッカーでは、以下が可能です:
- 特定のプロジェクトのバグを確認(最初はメンテナのみに表示、その後公開)
- 新しい問題を作成し、既存の問題にコメントする
- すべてのプロジェクトを通じて同様のバグを検索し、問題を理解する
ビルドステータスシステム
ビルドステータスシステムは以下を追跡するのに役立ちます:
- 含まれるすべてのプロジェクトのビルドステータス
- 最後に成功したビルドの日付
- ビルド失敗とその期間
Fuzz Introspector
Fuzz Introspectorは以下を表示します:
- OSS-Fuzz に登録されたプロジェクトのカバレッジデータ
- カバーされたコードのヒット周波数
- パフォーマンス分析およびボトルネック識別
例と説明についてはこのケーススタディを参照してください。
ステップバイステップ: 単一ハーネスの実行
OSS-Fuzz プラットフォーム全体をホストする必要はありません。ヘルパースクリプトを使用すると、個別のハーネスをローカルで簡単に実行できます。
ステップ 1: OSS-Fuzz をクローン
git clone https://github.com/google/oss-fuzz
cd oss-fuzz
python3 infra/helper.py --help
ステップ 2: プロジェクトイメージをビルド
python3 infra/helper.py build_image --pull <project-name>
これにより、プロジェクト用のベース Docker イメージがダウンロードおよびビルドされます。
ステップ 3: サニタイザーを使用してファザーをビルド
python3 infra/helper.py build_fuzzers --sanitizer=address <project-name>
サニタイザーオプション:
--sanitizer=addressfor AddressSanitizer with LeakSanitizer- その他のサニタイザーも利用可能(言語サポートは異なる)
注: ファザーは /build/out/<project-name>/ にビルドされ、ハーネス実行ファイル、辞書、コーパス、クラッシュファイルが含まれます。
ステップ 4: ファザーを実行
python3 infra/helper.py run_fuzzer <project-name> <harness-name> [<fuzzer-args>]
ヘルパースクリプトは、スキップされたステップを自動的に実行します。
ステップ 5: カバレッジ分析(オプション)
まず、gsutil をインストールしてください(gcloud の初期化はスキップ)。
python3 infra/helper.py build_fuzzers --sanitizer=coverage <project-name>
python3 infra/helper.py coverage <project-name>
ローカルコーパスのみを使用するには --no-corpus-download を使用します。このコマンドはカバレッジレポートを生成してローカルでホストします。
詳細については、公式 OSS-Fuzz ドキュメントを参照してください。
一般的なパターン
パターン: irssi の例の実行
ユースケース: シンプルな登録済みプロジェクトで OSS-Fuzz セットアップをテストする
# OSS-Fuzz をクローンしてナビゲート
git clone https://github.com/google/oss-fuzz
cd oss-fuzz
# irssi ファザーをビルドして実行
python3 infra/helper.py build_image --pull irssi
python3 infra/helper.py build_fuzzers --sanitizer=address irssi
python3 infra/helper.py run_fuzzer irssi irssi-fuzz
予想される出力:
INFO:__main__:Running: docker run --rm --privileged --shm-size=2g --platform linux/amd64 -i -e FUZZING_ENGINE=libfuzzer -e SANITIZER=address -e RUN_FUZZER_MODE=interactive -e HELPER=True -v /private/tmp/oss-fuzz/build/out/irssi:/out -t gcr.io/oss-fuzz-base/base-runner run_fuzzer irssi-fuzz.
Using seed corpus: irssi-fuzz_seed_corpus.zip
/out/irssi-fuzz -rss_limit_mb=2560 -timeout=25 /tmp/irssi-fuzz_corpus -max_len=2048 < /dev/null
INFO: Running with entropic power schedule (0xFF, 100).
INFO: Seed: 1531341664
INFO: Loaded 1 modules (95687 inline 8-bit counters): 95687 [0x1096c80, 0x10ae247),
INFO: Loaded 1 PC tables (95687 PCs): 95687 [0x10ae248,0x1223eb8),
INFO: 719 files found in /tmp/irssi-fuzz_corpus
INFO: seed corpus: files: 719 min: 1b max: 170106b total: 367969b rss: 48Mb
#720 INITED cov: 409 ft: 1738 corp: 640/163Kb exec/s: 0 rss: 62Mb
#762 REDUCE cov: 409 ft: 1738 corp: 640/163Kb lim: 2048 exec/s: 0 rss: 63Mb L: 236/2048 MS: 2 ShuffleBytes-EraseBytes-
パターン: 新しいプロジェクトの登録
ユースケース: プロジェクトを OSS-Fuzz(またはプライベートインスタンス)に追加
projects/<your-project>/ に 3 つのファイルを作成します:
1. project.yaml - プロジェクトメタデータ:
homepage: "https://github.com/yourorg/yourproject"
language: c++
primary_contact: "your-email@example.com"
main_repo: "https://github.com/yourorg/yourproject"
fuzzing_engines:
- libfuzzer
sanitizers:
- address
- undefined
2. Dockerfile - ビルド依存関係:
FROM gcr.io/oss-fuzz-base/base-builder
RUN apt-get update && apt-get install -y \
autoconf \
automake \
libtool \
pkg-config
RUN git clone --depth 1 https://github.com/yourorg/yourproject
WORKDIR yourproject
COPY build.sh $SRC/
3. build.sh - ハーネスをビルド:
#!/bin/bash -eu
./autogen.sh
./configure --disable-shared
make -j$(nproc)
# ハーネスをビルド
$CXX $CXXFLAGS -std=c++11 -I. \
$SRC/yourproject/fuzz/harness.cc -o $OUT/harness \
$LIB_FUZZING_ENGINE ./libyourproject.a
# コーパスと辞書が利用可能であればコピー
cp $SRC/yourproject/fuzz/corpus.zip $OUT/harness_seed_corpus.zip
cp $SRC/yourproject/fuzz/dictionary.dict $OUT/harness.dict
OSS-Fuzz の Docker イメージ
ハーネスは Docker コンテナでビルドおよび実行されます。すべてのプロジェクトはランナーイメージを共有しますが、各プロジェクトには独自のビルドイメージがあります。
イメージ階層
イメージはこのシーケンスで相互に構築されます:
- base_image - 特定の Ubuntu バージョン
- base_clang - Clang コンパイラ;
base_imageをベース - base_builder - ビルド依存関係;
base_clangをベース- 言語固有のバリアント:
base_builder_goなど - 完全なリストは /oss-fuzz/infra/base-images/ を参照
- 言語固有のバリアント:
- プロジェクト Docker イメージ - プロジェクト固有の依存関係;
base_builderまたは言語バリアントをベース
ランナーイメージ(別途使用)
- base_runner - ハーネスを実行;
base_clangをベース - base_runner_debug - デバッグツール付き;
base_runnerをベース
高度な使用法
ヒントとコツ
| ヒント | 理由 |
|---|---|
| ソースコードを手動でコピーしない | プロジェクト Dockerfile は既に最新バージョンをプルしている |
| 既存のプロジェクトを確認 | oss-fuzz/projects で例を参照 |
| ハーネスを別のリポジトリに保持 | curl-fuzzer のように - より整理された |
| 特定のコンパイラバージョンを使用 | ベースイメージは一貫したビルド環境を提供 |
| Dockerfile に依存関係をインストール | OSS-Fuzz 登録の承認が必要な場合があります |
Criticality Score
OSS-Fuzz は criticality score を使用してプロジェクト受け入れを評価します。スコアリングの仕組みについてはこの例を参照してください。
スコアが低いプロジェクトでも、プライベート OSS-Fuzz インスタンスに追加される可能性があります。
独自のインスタンスをホスト
OSS-Fuzz はオープンソースなため、以下の用途で独自のインスタンスをホストできます:
- 公開 OSS-Fuzz の対象外のプライベートプロジェクト
- criticality score が低いプロジェクト
- カスタムファジングインフラストラクチャの必要性
アンチパターン
| アンチパターン | 問題 | 正しいアプローチ |
|---|---|---|
| build.sh でソースを手動でプル | 最新バージョンを使用しない | Dockerfile で git clone を処理 |
| コードを OSS-Fuzz リポジトリにコピー | 管理が難しく、分離原則に違反 | 外部ハーネスリポジトリを参照 |
| ベースイメージバージョンを無視 | ビルドに矛盾 | 提供されるベースイメージとコンパイラを使用 |
| ローカルテストをスキップ | CI リソースを無駄にする | PR 前に helper.py をローカルで使用 |
| ビルドステータスを確認しない | ビルド失敗に気付かない | ビルドステータスページを定期的に監視 |
ツール固有のガイダンス
libFuzzer
OSS-Fuzz は主に C/C++ プロジェクト向けのファジングエンジンとして libFuzzer を使用します。
ハーネス署名:
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
// ファジングロジック
return 0;
}
build.sh でビルド:
$CXX $CXXFLAGS -std=c++11 -I. \
harness.cc -o $OUT/harness \
$LIB_FUZZING_ENGINE ./libproject.a
統合のヒント:
- OSS-Fuzz が提供する
$LIB_FUZZING_ENGINE変数を使用 -fsanitize=fuzzerは自動的に処理される- 可能な限り静的ライブラリにリンク
AFL++
OSS-Fuzz は AFL++ を代替ファジングエンジンとしてサポートしています。
project.yaml で有効化:
fuzzing_engines:
- afl
- libfuzzer
統合のヒント:
- AFL++ ハーネスは libFuzzer ハーネスと一緒に動作
- パフォーマンス向上のためにパーシスタントモードを使用
- OSS-Fuzz はエンジン固有のコンパイルフラグを処理
Atheris (Python)
C 拡張機能を備えた Python プロジェクト向けです。
cbor2 統合の例:
ハーネス:
import atheris
import sys
import cbor2
@atheris.instrument_func
def TestOneInput(data):
fdp = atheris.FuzzedDataProvider(data)
try:
cbor2.loads(data)
except (cbor2.CBORDecodeError, ValueError):
pass
def main():
atheris.Setup(sys.argv, TestOneInput)
atheris.Fuzz()
if __name__ == "__main__":
main()
build.sh でビルド:
pip3 install .
for fuzzer in $(find $SRC -name 'fuzz_*.py'); do
compile_python_fuzzer $fuzzer
done
統合のヒント:
- OSS-Fuzz が提供する
compile_python_fuzzerヘルパーを使用 - Continuously Fuzzing Python C Extensions ブログ記事を参照
Rust プロジェクト
project.yaml で有効化:
language: rust
fuzzing_engines:
- libfuzzer
sanitizers:
- address # AddressSanitizer のみ Rust でサポート
build.sh でビルド:
cargo fuzz build -O --debug-assertions
cp fuzz/target/x86_64-unknown-linux-gnu/release/fuzz_target_1 $OUT/
統合のヒント:
- Rust は libfuzzer で AddressSanitizer のみをサポート
- ローカル開発に cargo-fuzz を使用
- OSS-Fuzz は Rust 固有のコンパイルを処理
トラブルシューティング
| 問題 | 原因 | 解決策 |
|---|---|---|
| 依存関係がないためビルドが失敗 | 依存関係が Dockerfile にない | Dockerfile に apt-get install またはそれに相当するものを追加 |
| ハーネスがすぐにクラッシュ | 入力検証がない | ハーネスでサイズチェックを追加 |
| カバレッジが 0% | ハーネスがターゲットコードに到達しない | ハーネスが実際にターゲット関数を呼び出しているか確認 |
| ビルドタイムアウト | 複雑なビルドプロセス | build.sh を最適化し、並列ビルドを検討 |
| ビルド中のサニタイザーエラー | 互換性のないフラグ | OSS-Fuzz 環境変数で提供されるフラグを使用 |
| ソースコードが見つからない | Dockerfile の作業ディレクトリが間違っている | WORKDIR を設定するか、絶対パスを使用 |
関連スキル
このテクニックを使用するツール
| スキル | 適用方法 |
|---|---|
| libfuzzer | OSS-Fuzz が使用するプライマリファジングエンジン |
| aflpp | OSS-Fuzz がサポートする代替ファジングエンジン |
| atheris | OSS-Fuzz で Python プロジェクトのファジング用 |
| cargo-fuzz | OSS-Fuzz で Rust プロジェクト用 |
関連テクニック
| スキル | 関係 |
|---|---|
| coverage-analysis | OSS-Fuzz は helper.py でカバレッジレポートを生成 |
| address-sanitizer | OSS-Fuzz プロジェクトのデフォルトサニタイザー |
| fuzz-harness-writing | OSS-Fuzz へのプロジェクト登録に必須 |
| corpus-management | OSS-Fuzz は登録済みプロジェクト用のコーパスを管理 |
リソース
主要な外部リソース
OSS-Fuzz 公式ドキュメント OSS-Fuzz プラットフォームの登録、ハーネス作成、トラブルシューティングをカバーする包括的なドキュメント。
入門ガイド OSS-Fuzz への新規プロジェクト登録のステップバイステッププロセス(要件と承認プロセス含む)。
cbor2 OSS-Fuzz 統合 PR C 拡張機能を備えた Python プロジェクトを OSS-Fuzz に登録する実例。以下を示します:
- 初期提案とプロジェクト紹介
- Criticality score 評価
- 完全な実装(project.yaml、Dockerfile、build.sh、ハーネス)
Fuzz Introspector ケーススタディ Fuzz Introspector を使用してカバレッジを分析しファジングボトルネックを特定する例と説明。
ビデオリソース
登録とハーネス開発に関するワークショップ記録とチュートリアルについては、OSS-Fuzz ドキュメントを確認してください。
ライセンス: CC-BY-SA-4.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- trailofbits
- リポジトリ
- trailofbits/skills
- ライセンス
- CC-BY-SA-4.0
- 最終更新
- 不明
Source: https://github.com/trailofbits/skills / ライセンス: CC-BY-SA-4.0
関連スキル
superfluid
Superfluidプロトコルおよびそのエコシステムに関するナレッジベースです。Superfluidについて情報を検索する際は、ウェブ検索の前にこちらを参照してください。対応キーワード:Superfluid、CFA、GDA、Super App、Super Token、stream、flow rate、real-time balance、pool(member/distributor)、IDA、sentinels、liquidation、TOGA、@sfpro/sdk、semantic money、yellowpaper、whitepaper
civ-finish-quotes
実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。
nookplot
Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。
web3-polymarket
Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。
ethskills
Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。
xxyy-trade
このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。