fuzzing-dictionary
パーサー・プロトコル・特定フォーマットのコードをファジングする際に、ドメイン固有のトークンをファザーに提供する辞書を生成します。対象の仕様や構文に精通したトークンリストを活用することで、ファジングの効率と脆弱性発見率を高めます。
description の原文を見る
> Fuzzing dictionaries guide fuzzers with domain-specific tokens. Use when fuzzing parsers, protocols, or format-specific code.
SKILL.md 本文
Fuzzing Dictionary
Fuzzing dictionary は、ドメイン固有のトークンを提供することで、ファザーを興味深いインプットへ導きます。純粋なランダムミューテーションの代わりに、ファザーは既知のキーワード、マジックナンバー、プロトコルコマンド、フォーマット固有の文字列を取り込み、パーサー、プロトコルハンドラー、ファイルフォーマットプロセッサーの深いコードパスに到達しやすくなります。
Overview
Dictionary はターゲットにとって意味のあるトークンを表す引用符で囲まれた文字列を含むテキストファイルです。これにより、ファザーは初期の検証チェックをバイパスし、ブラインドミューテーションだけでは到達しにくいコードパスを探索できます。
Key Concepts
| Concept | Description |
|---|---|
| Dictionary Entry | 引用符で囲まれた文字列(例:"keyword")またはキーバリューペア(例:kw="value") |
| Hex Escapes | "\xF7\xF8" のような非印字文字のバイトシーケンス |
| Token Injection | ファザーが生成されたインプットに dictionary エントリを挿入 |
| Cross-Fuzzer Format | Dictionary ファイルは libFuzzer、AFL++、cargo-fuzz で動作 |
When to Apply
以下の場合にこのテクニックを適用します:
- パーサーをファジング(JSON、XML、設定ファイル)
- プロトコル実装をファジング(HTTP、DNS、カスタムプロトコル)
- ファイルフォーマットハンドラーをファジング(PNG、PDF、メディアコーデック)
- カバレッジが早期に頭打ちになり、深いロジックに到達していない
- ターゲットコードが特定のキーワードやマジック値をチェック
以下の場合はこのテクニックをスキップします:
- フォーマット期待を持たない純粋なアルゴリズムをファジング
- ターゲットにキーワードベースのパースがない
- コーパスが既に高いカバレッジを達成している
Quick Reference
| Task | Command/Pattern |
|---|---|
| libFuzzer で使用 | ./fuzz -dict=./dictionary.dict ... |
| AFL++ で使用 | afl-fuzz -x ./dictionary.dict ... |
| cargo-fuzz で使用 | cargo fuzz run fuzz_target -- -dict=./dictionary.dict |
| ヘッダーから抽出 | grep -o '".*"' header.h > header.dict |
| バイナリから生成 | strings ./binary | sed 's/^/"&/; s/$/&"/' > strings.dict |
Step-by-Step
Step 1: Create Dictionary File
各行に引用符で囲まれた文字列を含むテキストファイルを作成します。コメント(#)をドキュメントに使用します。
Dictionary フォーマット例:
# Lines starting with '#' and empty lines are ignored.
# Adds "blah" (w/o quotes) to the dictionary.
kw1="blah"
# Use \\ for backslash and \" for quotes.
kw2="\"ac\\dc\""
# Use \xAB for hex values
kw3="\xF7\xF8"
# the name of the keyword followed by '=' may be omitted:
"foo\x0Abar"
Step 2: Generate Dictionary Content
利用可能な内容に基づいて、生成方法を選択します:
LLM から:
A dictionary can be used to guide the fuzzer. Write me a dictionary file for fuzzing a <PNG parser>. Each line should be a quoted string or key-value pair like kw="value". Include magic bytes, chunk types, and common header values. Use hex escapes like "\xF7\xF8" for binary values.
ヘッダーファイルから:
grep -o '".*"' header.h > header.dict
Man ページから(CLI ツール用):
man curl | grep -oP '^\s*(--|-)\K\S+' | sed 's/[,.]$//' | sed 's/^/"&/; s/$/&"/' | sort -u > man.dict
バイナリ文字列から:
strings ./binary | sed 's/^/"&/; s/$/&"/' > strings.dict
Step 3: Pass Dictionary to Fuzzer
ファザーに応じた適切なフラグを使用します(上記 Quick Reference を参照)。
Common Patterns
Pattern: Protocol Keywords
Use Case: HTTP またはカスタムプロトコルハンドラーをファジング
Dictionary 内容:
# HTTP methods
"GET"
"POST"
"PUT"
"DELETE"
"HEAD"
# Headers
"Content-Type"
"Authorization"
"Host"
# Protocol markers
"HTTP/1.1"
"HTTP/2.0"
Pattern: Magic Bytes and File Format Headers
Use Case: イメージパーサー、メディアデコーダー、アーカイブハンドラーをファジング
Dictionary 内容:
# PNG magic bytes and chunks
png_magic="\x89PNG\r\n\x1a\n"
ihdr="IHDR"
plte="PLTE"
idat="IDAT"
iend="IEND"
# JPEG markers
jpeg_soi="\xFF\xD8"
jpeg_eoi="\xFF\xD9"
Pattern: Configuration File Keywords
Use Case: 設定ファイルパーサーをファジング(YAML、TOML、INI)
Dictionary 内容:
# Common config keywords
"true"
"false"
"null"
"version"
"enabled"
"disabled"
# Section headers
"[general]"
"[network]"
"[security]"
Advanced Usage
Tips and Tricks
| Tip | Why It Helps |
|---|---|
| 複数の生成方法を組み合わせ | LLM 生成キーワード + バイナリからの文字列は広い表面をカバー |
| 境界値を含める | "0"、"-1"、"2147483647" はエッジケースをトリガー |
| フォーマットデリミターを追加 | :, =, {, } はファザーが有効な構造を構築するのに役立つ |
| Dictionary を絞る | 数千ではなく 50-200 エントリが最適に動作 |
| Dictionary の有効性をテスト | dict ありなしで実行、カバレッジを比較 |
Auto-Generated Dictionaries (AFL++)
afl-clang-lto コンパイラを使用する場合、AFL++ はバイナリの文字列比較から dictionary エントリを自動抽出します。これはコンパイル時の AUTODICTIONARY 機能を通じて行われます。
自動 dictionary を有効化:
export AFL_LLVM_DICT2FILE=auto.dict
afl-clang-lto++ target.cc -o target
# Dictionary saved to auto.dict
afl-fuzz -x auto.dict -i in -o out -- ./target
複数の Dictionary を組み合わせ
一部のファザーは複数の dictionary ファイルをサポート:
# AFL++ with multiple dictionaries
afl-fuzz -x keywords.dict -x formats.dict -i in -o out -- ./target
Anti-Patterns
| Anti-Pattern | Problem | Correct Approach |
|---|---|---|
| 完全な文を含める | ファザーは散文ではなく原子的トークンが必要 | 個別キーワードに分割 |
| エントリを複製 | ミューテーション予算を浪費 | sort -u で重複排除 |
| 巨大な dictionary | ファザーを遅化、有用なトークンを希釈 | フォーカス保持:50-200 最関連エントリ |
| Hex escapes を欠落 | 非印字バイトが破損 | バイナリ値に \xXX を使用 |
| コメントなし | メンテナンスと監査が困難 | # コメントでセクションをドキュメント |
Tool-Specific Guidance
libFuzzer
clang++ -fsanitize=fuzzer,address harness.cc -o fuzz
./fuzz -dict=./dictionary.dict corpus/
統合のヒント:
- Dictionary トークンはミューテーション中に挿入/置換される
-max_lenと組み合わせてインプットサイズを制御-print_final_stats=1を使用して dictionary 有効性メトリクスを表示-max_lenより長いエントリは無視される
AFL++
afl-fuzz -x ./dictionary.dict -i input/ -o output/ -- ./target @@
統合のヒント:
- AFL++ は複数 dictionary 用に複数の
-xフラグをサポート afl-clang-ltoでAFL_LLVM_DICT2FILEを使用して自動生成 dictionary を作成- Dictionary 有効性はファザー統計 UI に表示
- トークンは決定的およびハボック段階で使用される
cargo-fuzz (Rust)
cargo fuzz run fuzz_target -- -dict=./dictionary.dict
統合のヒント:
- cargo-fuzz は libFuzzer バックエンドを使用するため、すべての libFuzzer dict フラグが動作
- ハーネスと並べて
fuzz/ディレクトリに dictionary ファイルを配置 - ハーネスディレクトリから参照:
cargo fuzz run target -- -dict=../dictionary.dict
go-fuzz (Go)
go-fuzz は組み込み dictionary サポートを持たず、手動でコーパスに dictionary エントリをシードできます:
# Convert dictionary to corpus files
grep -o '".*"' dict.txt | while read line; do
echo -n "$line" | base64 > corpus/$(echo "$line" | md5sum | cut -d' ' -f1)
done
go-fuzz -bin=./target-fuzz.zip -workdir=.
Troubleshooting
| Issue | Cause | Solution |
|---|---|---|
| Dictionary ファイルが読み込まれない | パス間違い、またはフォーマットエラー | ファザー出力で dict 解析エラーを確認、ファイルフォーマットを検証 |
| カバレッジ改善なし | Dictionary トークンが無関連 | ターゲットコードで実際のキーワードを分析、別の生成方法を試行 |
| Dict ファイルの構文エラー | エスケープされていないクォート、または無効なエスケープ | バックスラッシュには \\、クォートには \" を使用、テスト実行で検証 |
| ファザーが長いエントリを無視 | エントリが -max_len を超える | エントリを max インプット長以下に保つ、または -max_len を増やす |
| 多くのエントリがファザーを遅化 | Dictionary が大きすぎる | 50-200 最関連エントリに削減 |
Related Skills
Tools That Use This Technique
| Skill | How It Applies |
|---|---|
| libfuzzer | -dict= フラグ経由のネイティブ dictionary サポート |
| aflpp | -x フラグ経由のネイティブ dictionary サポート、AUTODICTIONARIES による自動生成 |
| cargo-fuzz | libFuzzer バックエンドを使用、-dict= サポートを継承 |
Related Techniques
| Skill | Relationship |
|---|---|
| fuzzing-corpus | Dictionary はコーパスを補完:コーパスは構造、dictionary はキーワードを提供 |
| coverage-analysis | カバレッジデータを使用して dictionary 有効性を検証 |
| harness-writing | ハーネス構造により、どの dictionary トークンが有用かを決定 |
Resources
Key External Resources
AFL++ Dictionaries 一般的なフォーマット(HTML、XML、JSON、SQL など)用の事前構築 dictionary。フォーマット固有ファジングの良い出発点。
libFuzzer Dictionary Documentation libFuzzer の公式 dictionary フォーマットと使用法ドキュメント。トークン挿入戦略とパフォーマンス含意を説明。
Additional Examples
OSS-Fuzz Dictionaries
Google の継続的ファジングサービスからの実世界 dictionary。プロジェクトディレクトリで *.dict ファイルを検索して、本番例を参照。
ライセンス: 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を通じてオンチェーン取引とデータ照会を実現します。