libfuzzer
LLVMに組み込まれたカバレッジガイド型ファザーで、C/C++プロジェクト向けに設計されています。Clangでコンパイル可能なC/C++コードのファジングテストに使用します。
description の原文を見る
> Coverage-guided fuzzer built into LLVM for C/C++ projects. Use for fuzzing C/C++ code that can be compiled with Clang.
SKILL.md 本文
libFuzzer
libFuzzerは、LLVMプロジェクトの一部であるインプロセス・カバレッジガイド型ファザーです。シンプルさとLLVMツールチェーンの統合により、C/C++プロジェクトのファジング開始時には推奨されるツールです。libFuzzerは2022年後半からメンテナンスのみのモードになっていますが、代替ツールよりもインストール・使用が簡単で、広く利用でき、予見可能な将来にはメンテナンスされ続けるでしょう。
使用時の判断基準
| ファザー | 適用場面 | 複雑さ |
|---|---|---|
| libFuzzer | クイックセットアップ、単一プロジェクトのファジング | 低 |
| AFL++ | マルチコアファジング、多様なミューテーション | 中 |
| LibAFL | カスタムファザー、研究プロジェクト | 高 |
| Honggfuzz | ハードウェアベースのカバレッジ | 中 |
libFuzzerを選択すべき場合:
- C/C++コードのシンプルで迅速なセットアップが必要
- プロジェクトがClangでコンパイル可能
- シングルコアのファジングで初期段階は十分
- 後でAFL++への移行が選択肢である
注: libFuzzerで書かれたファジングハーネスはAFL++互換です。そのため、より高度な機能(マルチコアサポートの向上など)が必要な場合は簡単に移行できます。
クイックスタート
#include <stdint.h>
#include <stddef.h>
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
// 必要に応じて入力を検証
if (size < 1) return 0;
// ファザーが提供するデータでターゲット関数を呼び出す
my_target_function(data, size);
return 0;
}
コンパイルと実行:
clang++ -fsanitize=fuzzer,address -g -O2 harness.cc target.cc -o fuzz
mkdir corpus/
./fuzz corpus/
インストール
前提条件
- LLVM/Clangコンパイラ (libFuzzerを含む)
- カバレッジ分析用LLVMツール (オプション)
Linux (Ubuntu/Debian)
apt install clang llvm
最新のLLVMバージョンの場合:
# apt.llvm.orgからLLVMリポジトリを追加
# その後特定のバージョンをインストール、例えば:
apt install clang-18 llvm-18
macOS
# Homebrewを使用
brew install llvm
# またはNixを使用
nix-env -i clang
Windows
Visual Studioを通じてClangをインストール。セットアップ手順についてはMicrosoftのドキュメントを参照してください。
推奨: 可能であれば、ローカルのx86_64 VMか、DigitalOcean、AWS、またはHetznerでレンタルしたものでファジングしてください。LinuxはlibFuzzerの最適なサポートを提供します。
検証
clang++ --version
# LLVMバージョン情報が表示されます
ハーネスの作成
ハーネスの構造
ハーネスはファザーのエントリーポイントです。libFuzzerはLLVMFuzzerTestOneInput関数を異なる入力で繰り返し呼び出します。
#include <stdint.h>
#include <stddef.h>
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
// 1. オプション: 入力サイズの検証
if (size < MIN_REQUIRED_SIZE) {
return 0; // 小さすぎる入力を拒否
}
// 2. オプション: 生バイトを構造化データに変換
// 例: バイト配列から2つの整数をパース
if (size >= 2 * sizeof(uint32_t)) {
uint32_t a = *(uint32_t*)(data);
uint32_t b = *(uint32_t*)(data + sizeof(uint32_t));
my_function(a, b);
}
// 3. ターゲット関数を呼び出す
target_function(data, size);
// 4. 常に0を返す (非ゼロは将来の使用のために予約)
return 0;
}
ハーネスのルール
| すべき | すべきでない |
|---|---|
| すべての入力タイプを処理 (空、巨大、不正形式) | exit()を呼び出す - ファジングプロセスを停止 |
| 返す前にすべてのスレッドを結合 | スレッドを実行したままにする |
| ハーネスを高速かつシンプルに保つ | 過度なログやカプセル化を追加 |
| 決定論的性を維持 | 乱数生成器や/dev/randomの読み取りを使用 |
| 実行間でグローバル状態をリセット | 前の実行からの状態に依存 |
| 狭くフォーカスされたターゲットを使用 | 関連性のないデータ形式を混在 (PNG + TCP) させる |
原理:
- 速度が重要: 1コアあたり毎秒100-1000実行を目指す
- 再現性: クラッシュはファジング完了後に再現可能である必要がある
- 分離: 各実行は独立している必要がある
複雑な入力にはFuzzedDataProviderを使用
複雑な入力 (文字列、複数パラメータ) では、FuzzedDataProviderヘルパーを使用:
#include <stdint.h>
#include <stddef.h>
#include "FuzzedDataProvider.h" // LLVMプロジェクトから
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
FuzzedDataProvider fuzzed_data(data, size);
// 構造化データを抽出
size_t allocation_size = fuzzed_data.ConsumeIntegral<size_t>();
std::vector<char> str1 = fuzzed_data.ConsumeBytesWithTerminator<char>(32, 0xFF);
std::vector<char> str2 = fuzzed_data.ConsumeBytesWithTerminator<char>(32, 0xFF);
// 抽出されたデータでターゲットを呼び出す
char* result = concat(&str1[0], str1.size(), &str2[0], str2.size(), allocation_size);
if (result != NULL) {
free(result);
}
return 0;
}
FuzzedDataProvider.hはLLVMリポジトリからダウンロード。
インターリーブドファジング
単一のハーネスを使用して複数の関連関数をテスト:
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
if (size < 1 + 2 * sizeof(int32_t)) {
return 0;
}
uint8_t mode = data[0];
int32_t numbers[2];
memcpy(numbers, data + 1, 2 * sizeof(int32_t));
// 最初のバイトに基づいて関数を選択
switch (mode % 4) {
case 0: add(numbers[0], numbers[1]); break;
case 1: subtract(numbers[0], numbers[1]); break;
case 2: multiply(numbers[0], numbers[1]); break;
case 3: divide(numbers[0], numbers[1]); break;
}
return 0;
}
関連スキル: 詳細なハーネス作成テクニック、複雑な入力の処理パターン、 構造認識ファジング、プロトバフベースのファジングについては、fuzz-harness-writingテクニックスキルを参照。
コンパイル
基本的なコンパイル
キーフラグは-fsanitize=fuzzerです。これは以下を実行します:
- libFuzzerランタイムをリンク (main関数を提供)
- カバレッジトラッキング用SanitizerCoverageインストルメンテーションを有効化
memcmpなどの組み込み関数を無効化
clang++ -fsanitize=fuzzer -g -O2 harness.cc target.cc -o fuzz
フラグの説明:
-fsanitize=fuzzer: libFuzzerを有効化-g: デバッグシンボルを追加 (クラッシュ分析に有用)-O2: 本番レベルの最適化 (ファジング推奨)-DNO_MAIN: コードがmain関数を持つ場合、マクロを定義
サニタイザーを含める
AddressSanitizer (推奨):
clang++ -fsanitize=fuzzer,address -g -O2 -U_FORTIFY_SOURCE harness.cc target.cc -o fuzz
複数のサニタイザー:
clang++ -fsanitize=fuzzer,address,undefined -g -O2 harness.cc target.cc -o fuzz
関連スキル: 詳細なサニタイザー設定、一般的な問題、ASAN_OPTIONSフラグ、 高度なサニタイザーの使用については、address-sanitizerおよびundefined-behavior-sanitizer テクニックスキルを参照。
ビルドフラグ
| フラグ | 目的 |
|---|---|
-fsanitize=fuzzer | libFuzzerランタイムとインストルメンテーションを有効化 |
-fsanitize=address | AddressSanitizer (メモリエラー検出) を有効化 |
-fsanitize=undefined | UndefinedBehaviorSanitizerを有効化 |
-fsanitize=fuzzer-no-link | リンクなしでインストルメント (ライブラリ用) |
-g | デバッグシンボルを含める |
-O2 | 本番最適化レベル |
-U_FORTIFY_SOURCE | fortificationを無効化 (ASanを干渉できる) |
スタティックライブラリの構築
スタティックライブラリを生成するプロジェクト:
- ファジングインストルメンテーション有りでライブラリをビルド:
export CC=clang CFLAGS="-fsanitize=fuzzer-no-link -fsanitize=address"
export CXX=clang++ CXXFLAGS="$CFLAGS"
./configure --enable-shared=no
make
- ハーネスでスタティックライブラリをリンク:
clang++ -fsanitize=fuzzer -fsanitize=address harness.cc libmylib.a -o fuzz
CMakeの統合
project(FuzzTarget)
cmake_minimum_required(VERSION 3.0)
add_executable(fuzz main.cc harness.cc)
target_compile_definitions(fuzz PRIVATE NO_MAIN=1)
target_compile_options(fuzz PRIVATE -g -O2 -fsanitize=fuzzer -fsanitize=address)
target_link_libraries(fuzz -fsanitize=fuzzer -fsanitize=address)
ビルド:
cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ .
cmake --build .
コーパス管理
初期コーパスの作成
コーパス用ディレクトリを作成 (空で開始可能):
mkdir corpus/
オプションだが推奨: シード入力 (有効な例ファイル) を提供:
# PNGパーサーの場合:
cp examples/*.png corpus/
# プロトコルパーサーの場合:
cp test_packets/*.bin corpus/
シード入力のメリット:
- ファザーはゼロから開始しない
- 有効なコードパスに素早く到達
- 効果を大幅に向上
コーパス構造
コーパスディレクトリは以下を含む:
- ユニークなコードパスをトリガーする入力ファイル
- ミニマイズ版 (libFuzzerが自動的にミニマイズ)
- コンテンツハッシュで命名 (例:
a9993e364706816aba3e25717850c26c9cd0d89d)
コーパスのミニマイズ
libFuzzerはファジング中に自動的にコーパスエントリをミニマイズ。明示的にミニマイズ:
mkdir minimized_corpus/
./fuzz -merge=1 minimized_corpus/ corpus/
これにより、重複排除、ミニマイズされたコーパスがminimized_corpus/に作成されます。
関連スキル: コーパス作成戦略、シード選択、形式固有のコーパス構築、 コーパスメンテナンスについては、fuzzing-corpusテクニックスキルを参照。
キャンペーン実行
基本的な実行
./fuzz corpus/
クラッシュが見つかるか、停止するまで実行 (Ctrl+C)。
推奨: クラッシュ後に継続
./fuzz -fork=1 -ignore_crashes=1 corpus/
-forkと-ignore_crashesフラグ (実験的だが広く使用) により、クラッシュ発見後もファジングを継続可能。
一般的なオプション
入力サイズを制御:
./fuzz -max_len=4000 corpus/
経験則: 最小限の現実的な入力サイズの2倍。
タイムアウトを設定:
./fuzz -timeout=2 corpus/
2秒以上実行するテストケースを中止。
辞書を使用:
./fuzz -dict=./format.dict corpus/
標準出力/標準エラーを閉じる (ファジングを高速化):
./fuzz -close_fd_mask=3 corpus/
すべてのオプションを確認:
./fuzz -help=1
マルチコアファジング
オプション1: ジョブとワーカー (推奨):
./fuzz -jobs=4 -workers=4 -fork=1 -ignore_crashes=1 corpus/
-jobs=4: 4つの順次キャンペーンを実行-workers=4: ジョブを4つのプロセスで並列処理- テストケースはジョブ間で共有
オプション2: フォークモード:
./fuzz -fork=4 -ignore_crashes=1 corpus/
注: 本格的なマルチコアファジングの場合、AFL++、Honggfuzz、またはLibAFLへの切り替えを検討してください。
テストケースの再実行
単一クラッシュを再実行:
./fuzz ./crash-a9993e364706816aba3e25717850c26c9cd0d89d
ディレクトリ内のすべての入力をファジングなしでテスト:
./fuzz -runs=0 corpus/
出力の解釈
ファジングが実行されるときは、次のような統計が表示されます:
INFO: Seed: 3517090860
INFO: Loaded 1 modules (9 inline 8-bit counters)
#2 INITED cov: 3 ft: 4 corp: 1/1b exec/s: 0 rss: 26Mb
#57 NEW cov: 4 ft: 5 corp: 2/4b lim: 4 exec/s: 0 rss: 26Mb
| 出力 | 意味 |
|---|---|
INITED | ファジング初期化済み |
NEW | 新しいカバレッジが見つかった、コーパスに追加 |
REDUCE | 入力がミニマイズされ、カバレッジを保持 |
cov: N | ヒットしたカバレッジエッジ数 |
corp: X/Yb | コーパスサイズ: X エントリ、Y 合計バイト |
exec/s: N | 1秒あたりの実行数 |
rss: NMb | メモリ使用量 (常駐セット) |
クラッシュ時:
==11672== ERROR: libFuzzer: deadly signal
artifact_prefix='./'; Test unit written to ./crash-a9993e364706816aba3e25717850c26c9cd0d89d
0x61,0x62,0x63,
abc
Base64: YWJj
クラッシュは./crash-<hash>に保存され、16進数、UTF-8、Base64で入力を表示します。
再現性: -seed=<value>を使用してファジングキャンペーンを再現 (シングルコアのみ)。
ファジング辞書
辞書は、入力形式に関するヒントを提供することで、ファザーが興味深い入力をより高速に発見するのに役立ちます。
辞書フォーマット
テキストファイルにクォート文字列を作成 (1行1個):
# '#'で始まる行はコメント
# マジックバイト
magic="\x89PNG"
magic2="IEND"
# キーワード
"GET"
"POST"
"Content-Type"
# 16進数シーケンス
delimiter="\xFF\xD8\xFF"
辞書の使用
./fuzz -dict=./format.dict corpus/
辞書の生成
ヘッダーファイルから:
grep -o '".*"' header.h > header.dict
man pageから:
man curl | grep -oP '^\s*(--|-)\K\S+' | sed 's/[,.]$//' | sed 's/^/"&/; s/$/&"/' | sort -u > man.dict
バイナリ文字列から:
strings ./binary | sed 's/^/"&/; s/$/&"/' > strings.dict
LLMを使用: ChatGPTなどに質問して、形式用の辞書を生成させる (例: "Generate a libFuzzer dictionary for a JSON parser")。
関連スキル: 高度な辞書生成、形式固有の辞書、辞書最適化戦略については、 fuzzing-dictionariesテクニックスキルを参照。
カバレッジ分析
libFuzzerは基本的なカバレッジ統計 (cov: N) を表示しますが、詳細なカバレッジ分析には追加ツールが必要です。
ソースベースのカバレッジ
1. カバレッジインストルメンテーション有りで再コンパイル:
clang++ -fsanitize=fuzzer -fprofile-instr-generate -fcoverage-mapping harness.cc target.cc -o fuzz
2. ファザーを実行してカバレッジ収集:
LLVM_PROFILE_FILE="coverage-%p.profraw" ./fuzz -runs=10000 corpus/
3. カバレッジデータをマージ:
llvm-profdata merge -sparse coverage-*.profraw -o coverage.profdata
4. カバレッジレポートを生成:
llvm-cov show ./fuzz -instr-profile=coverage.profdata
5. HTMLレポートを生成:
llvm-cov show ./fuzz -instr-profile=coverage.profdata -format=html > coverage.html
カバレッジを改善
ヒント:
- コーパスに優れたシード入力を提供
- 形式認識ファジングに辞書を使用
- ハーネスが適切にターゲットを練習しているか確認
- 複雑な形式に構造認識ファジングを検討
- 長期キャンペーン実行 (日/週)
関連スキル: 詳細なカバレッジ分析テクニック、カバレッジギャップの特定、 体系的なカバレッジ改善、ファザー間のカバレッジ比較については、 coverage-analysisテクニックスキルを参照。
サニタイザー統合
AddressSanitizer (ASan)
ASanはバッファオーバーフローやuse-after-freeなどのメモリエラーを検出します。ファジングに非常に推奨。
ASanを有効化:
clang++ -fsanitize=fuzzer,address -g -O2 -U_FORTIFY_SOURCE harness.cc target.cc -o fuzz
ASan出力の例:
==1276163==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6020000c4ab1
WRITE of size 1 at 0x6020000c4ab1 thread T0
#0 0x55555568631a in check_buf(char*, unsigned long) main.cc:13:25
#1 0x5555556860bf in LLVMFuzzerTestOneInput harness.cc:7:3
環境変数でASanを設定:
ASAN_OPTIONS=verbosity=1:abort_on_error=1 ./fuzz corpus/
重要なフラグ:
verbosity=1: ASanが有効であることを表示detect_leaks=0: リーク検出を無効化 (リークは終了時に報告)abort_on_error=1: エラー時に_exit()の代わりにabort()を呼び出す
欠点:
- 2-4倍のスローダウン
- 約20TBの仮想メモリを必要 (メモリ制限を無効化:
-rss_limit_mb=0) - Linuxで最も適切にサポート
関連スキル: 包括的なASan設定、一般的な落とし穴、シンボリゼーション、 他のサニタイザーとの組み合わせについては、address-sanitizerテクニックスキルを参照。
UndefinedBehaviorSanitizer (UBSan)
UBSanは整数オーバーフロー、null ポインター逆参照などの未定義動作を検出します。
UBSanを有効化:
clang++ -fsanitize=fuzzer,undefined -g -O2 harness.cc target.cc -o fuzz
ASanと組み合わせ:
clang++ -fsanitize=fuzzer,address,undefined -g -O2 harness.cc target.cc -o fuzz
MemorySanitizer (MSan)
MSanは初期化されないメモリ読み取りを検出。使用がより複雑 (すべての依存関係を再構築が必要)。
clang++ -fsanitize=fuzzer,memory -g -O2 harness.cc target.cc -o fuzz
一般的なサニタイザー問題
| 問題 | 解決法 |
|---|---|
| ASanがファジングを遅くしすぎ | -fsanitize-recover=addressで非致命的エラー |
| メモリ不足 | ASAN_OPTIONS=rss_limit_mb=0または-rss_limit_mb=0を設定 |
| スタック枯渇 | スタックサイズを増やす: ASAN_OPTIONS=stack_size=8388608 |
_FORTIFY_SOURCEで誤検知 | -U_FORTIFY_SOURCEフラグを使用 |
| MSanが依存関係でレポート | すべての依存関係を-fsanitize=memoryで再構築 |
実世界の例
例1: libpngのファジング
libpngはPNG画像を読み書きするために広く使用されるライブラリです。バグはセキュリティ問題につながることがあります。
1. ソースコードを取得:
curl -L -O https://downloads.sourceforge.net/project/libpng/libpng16/1.6.37/libpng-1.6.37.tar.xz
tar xf libpng-1.6.37.tar.xz
cd libpng-1.6.37/
2. 依存関係をインストール:
apt install zlib1g-dev
3. ファジングインストルメンテーション有りでコンパイル:
export CC=clang CFLAGS="-fsanitize=fuzzer-no-link -fsanitize=address"
export CXX=clang++ CXXFLAGS="$CFLAGS"
./configure --enable-shared=no
make
4. ハーネスを取得 (またはあなた自身で作成):
curl -O https://raw.githubusercontent.com/glennrp/libpng/f8e5fa92b0e37ab597616f554bee254157998227/contrib/oss-fuzz/libpng_read_fuzzer.cc
5. コーパスと辞書を準備:
mkdir corpus/
curl -o corpus/input.png https://raw.githubusercontent.com/glennrp/libpng/acfd50ae0ba3198ad734e5d4dec2b05341e50924/contrib/pngsuite/iftp1n3p08.png
curl -O https://raw.githubusercontent.com/glennrp/libpng/2fff013a6935967960a5ae626fc21432807933dd/contrib/oss-fuzz/png.dict
6. ファザーをリンクしてコンパイル:
clang++ -fsanitize=fuzzer -fsanitize=address libpng_read_fuzzer.cc .libs/libpng16.a -lz -o fuzz
7. ファジングキャンペーンを実行:
./fuzz -close_fd_mask=3 -dict=./png.dict corpus/
例2: 単純なゼロ除算バグ
ゼロ除算バグを見つけるハーネス:
#include <stdint.h>
#include <stddef.h>
double divide(uint32_t numerator, uint32_t denominator) {
// バグ: denominatorがゼロかどうかをチェックしない
return numerator / denominator;
}
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
if(size != 2 * sizeof(uint32_t)) {
return 0;
}
uint32_t numerator = *(uint32_t*)(data);
uint32_t denominator = *(uint32_t*)(data + sizeof(uint32_t));
divide(numerator, denominator);
return 0;
}
コンパイルしてファジング:
clang++ -fsanitize=fuzzer harness.cc -o fuzz
./fuzz
ファザーはすぐにクラッシュを引き起こす入力を発見します。
高度な使用法
ヒントとコツ
| ヒント | 理由 |
|---|---|
| シングルコアから開始、マルチコアはAFL++に切り替え | libFuzzerハーネスはAFL++互換 |
| 構造化形式には辞書を使用 | バグ発見が10-100倍高速化 |
-close_fd_mask=3でファイルディスクリプタを閉じる | SUT(Subject Under Test)が出力を書き込む場合、スピードアップ |
合理的な-max_lenを設定 | 巨大な入力の浪費時間を防止 |
| 分単位ではなく日/週で実行 | カバレッジプラトーは時間をかけて破る |
| テストスイートからシード コーパスを使用 | 有効な入力からファジング開始 |
構造認識ファジング
高度に構造化された入力 (複雑なプロトコル、ファイル形式) の場合、libprotobuf-mutatorを使用:
- Protocol Buffersを使用して入力構造を定義
- libFuzzerはprotobufメッセージをミューテート (構造保存ミューテーション)
- ハーネスはprotobufをネイティブ形式に変換
詳細は構造認識ファジングドキュメントを参照。
カスタムミューテータ
libFuzzerは特化したファジング用のカスタムミューテータを許可:
extern "C" size_t LLVMFuzzerCustomMutator(uint8_t *Data, size_t Size,
size_t MaxSize, unsigned int Seed) {
// カスタムミューテーションロジック
return new_size;
}
extern "C" size_t LLVMFuzzerCustomCrossOver(const uint8_t *Data1, size_t Size1,
const uint8_t *Data2, size_t Size2,
uint8_t *Out, size_t MaxOutSize,
unsigned int Seed) {
// カスタムクロスオーバーロジック
return new_size;
}
パフォーマンスチューニング
| 設定 | 効果 |
|---|---|
-close_fd_mask=3 | stdout/stderrを閉じる、ファジング高速化 |
-max_len=<合理的なサイズ> | 巨大な入力の浪費時間を回避 |
-timeout=<秒> | ハングを検出、スタック実行を防止 |
| ASanを無効化してベースライン取得 | 2-4倍のスピードアップ (メモリバグは見逃す) |
-jobsと-workersを使用 | 限定的なマルチコアサポート |
| Linuxで実行 | 最適なプラットフォームサポートとパフォーマンス |
トラブルシューティング
| 問題 | 原因 | 解決法 |
|---|---|---|
| 数時間後にクラッシュが見つからない | コーパスが不適切、カバレッジが低い | シード入力を追加、辞書を使用、ハーネスを確認 |
| 実行/秒が非常に遅い (<100) | ターゲットが複雑、過度なログ | ターゲット最適化、-close_fd_mask=3使用、ログ削減 |
| メモリ不足 | ASanの20TB仮想メモリ | -rss_limit_mb=0設定してRSS制限を無効化 |
| 最初のクラッシュ後にファザーが停止 | デフォルト動作 | -fork=1 -ignore_crashes=1を使用して継続 |
| クラッシュを再現できない | ハーネス/ターゲット内の非決定論的性 | 乱数生成とグローバル状態を削除 |
-fsanitize=fuzzerでリンクエラー | libFuzzerランタイム欠落 | Clangを確認、LLVMインストールをチェック |
| GCCプロジェクトがClangでコンパイルできない | GCC固有コード | AFL++のgcc_pluginを代わりに使用 |
| カバレッジが改善しない | コーパスプラトー | より長く実行、辞書追加、シード改善、カバレッジレポートチェック |
| クラッシュするがASanがトリガーしない | メモリエラーがASanで検出されない | -fsanitize=addressで再コンパイル |
関連スキル
テクニックスキル
| スキル | ユースケース |
|---|---|
| fuzz-harness-writing | 効果的なハーネス作成、構造認識ファジング、FuzzedDataProvider使用の詳細ガイダンス |
| address-sanitizer | メモリエラー検出設定、ASAN_OPTIONS、トラブルシューティング |
| undefined-behavior-sanitizer | ファジング中の未定義動作検出 |
| coverage-analysis | ファジング効果測定、未テストコードパスの特定 |
| fuzzing-corpus | シードコーパス構築・管理、コーパスミニマイズ戦略 |
| fuzzing-dictionaries | 形式固有辞書作成、高速バグ発見 |
関連ファザー
| スキル | 検討時期 |
|---|---|
| aflpp | 本格的なマルチコアファジング、またはlibFuzzerがプラトーに達したとき |
| honggfuzz | Linux上でのハードウェアベースのカバレッジフィードバック希望時 |
| libafl | カスタムファザー構築またはファジング研究実施時 |
リソース
公式ドキュメント
- LLVM libFuzzerドキュメント - 公式リファレンス
- GoogleによるlibFuzzerチュートリアル - ステップバイステップガイド
- SanitizerCoverage - カバレッジインストルメンテーション詳細
高度なトピック
プロジェクト例
- OSS-Fuzz - オープンソースプロジェクト向け継続的ファジング (多くのlibFuzzer例)
- AFL++辞書コレクション - 再利用可能な辞書
ライセンス: 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を通じてオンチェーン取引とデータ照会を実現します。