address-sanitizer
AddressSanitizerはファジング実行中にメモリエラーを検出します。C/C++コードのファジングテスト時に、バッファオーバーフローやuse-after-freeバグを発見したい場合に使用してください。
description の原文を見る
> AddressSanitizer detects memory errors during fuzzing. Use when fuzzing C/C++ code to find buffer overflows and use-after-free bugs.
SKILL.md 本文
AddressSanitizer (ASan)
AddressSanitizer (ASan) は、ソフトウェアテスト、特にファジング中に広く採用されているメモリエラー検出ツールです。バッファオーバーフロー、use-after-free エラー、その他のメモリ安全性違反など、気づかないうちに発生する可能性があるメモリ破損バグの検出に役立ちます。
概要
ASan はメモリ脆弱性の特定における有効性により、ファジングにおける標準的なプラクティスです。コンパイル時にコードをインストルメント化し、メモリの割り当てとアクセスを追跡して、実行時に違法な操作を検出します。
主要な概念
| 概念 | 説明 |
|---|---|
| インストルメント化 | コンパイル中にメモリ操作にランタイムチェックを追加 |
| シャドウメモリ | 20TB の仮想メモリをマップして割り当て状態を追跡 |
| パフォーマンスコスト | インストルメント化されていないコードと比較して約 2~4 倍の低速化 |
| 検出範囲 | バッファオーバーフロー、use-after-free、double-free、メモリリークを検出 |
適用する場合
このテクニックを適用する場合:
- C/C++ コードをメモリ安全性脆弱性についてファジングする
- unsafe ブロックを含む Rust コードをテストする
- メモリ破損に関連するクラッシュをデバッグする
- メモリエラーが疑われるユニットテストを実行する
このテクニックをスキップする場合:
- 本番環境コードを実行する (ASan はセキュリティを低下させる可能性がある)
- プラットフォームが Windows または macOS である (ASan サポートが限定的)
- パフォーマンスオーバーヘッドが許容不可能な場合
- FFI なしの純粋に安全な言語をファジングする場合 (例: pure Go、pure Java)
クイックリファレンス
| タスク | コマンド/パターン |
|---|---|
| ASan を有効化 (Clang/GCC) | -fsanitize=address |
| 詳細出力を有効化 | ASAN_OPTIONS=verbosity=1 |
| リーク検出を無効化 | ASAN_OPTIONS=detect_leaks=0 |
| エラーで強制的に中止 | ASAN_OPTIONS=abort_on_error=1 |
| 複数のオプション | ASAN_OPTIONS=verbosity=1:abort_on_error=1 |
ステップバイステップ
ステップ 1: ASan でコンパイル
-fsanitize=address フラグを使ってコードをコンパイルしてリンクします:
clang -fsanitize=address -g -o my_program my_program.c
-g フラグは、ASan がエラーを検出したときにより良いスタックトレースを取得するために推奨されます。
ステップ 2: ASan オプションを設定
ASAN_OPTIONS 環境変数を設定して ASan の動作を設定します:
export ASAN_OPTIONS=verbosity=1:abort_on_error=1:detect_leaks=0
ステップ 3: プログラムを実行
ASan でインストルメント化されたバイナリを実行します。メモリエラーが検出されると、ASan は詳細レポートを出力します:
./my_program
ステップ 4: ファジャーのメモリ制限を調整
ASan は約 20TB の仮想メモリを必要とします。ファジャーのメモリ制限を無効化します:
- libFuzzer:
-rss_limit_mb=0 - AFL++:
-m none
一般的なパターン
パターン: 基本的な ASan 統合
ユースケース: ASan を使った標準的なファジング設定
前:
clang -o fuzz_target fuzz_target.c
./fuzz_target
後:
clang -fsanitize=address -g -o fuzz_target fuzz_target.c
ASAN_OPTIONS=verbosity=1:abort_on_error=1 ./fuzz_target
パターン: ユニットテスト付き ASan
ユースケース: ユニットテストスイートに対して ASan を有効化
前:
gcc -o test_suite test_suite.c -lcheck
./test_suite
後:
gcc -fsanitize=address -g -o test_suite test_suite.c -lcheck
ASAN_OPTIONS=detect_leaks=1 ./test_suite
高度な使用法
ヒントとコツ
| ヒント | 有用な理由 |
|---|---|
-g フラグを使用する | デバッグ用に詳細なスタックトレースを提供 |
verbosity=1 を設定する | プログラム開始前に ASan が有効であることを確認 |
| ファジング中のリーク検出を無効化する | リーク検出は即座にクラッシュを引き起こさず、出力が雑然とする |
abort_on_error=1 を有効化する | 一部のファジャーは _exit() の代わりに abort() が必要 |
ASan レポートを理解する
ASan がメモリエラーを検出すると、以下の情報を含む詳細レポートが出力されます:
- エラータイプ: バッファオーバーフロー、use-after-free など
- スタックトレース: エラーが発生した場所
- 割り当て/解放トレース: メモリが割り当て/解放された場所
- メモリマップ: エラー周辺のシャドウメモリ状態
ASan レポートの例:
==12345==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60300000eff4 at pc 0x00000048e6a3
READ of size 4 at 0x60300000eff4 thread T0
#0 0x48e6a2 in main /path/to/file.c:42
複数のサニタイザーの組み合わせ
ASan を他のサニタイザーと組み合わせて、包括的な検出を実現できます:
clang -fsanitize=address,undefined -g -o fuzz_target fuzz_target.c
プラットフォーム固有の考慮事項
Linux: 完全な ASan サポート、最高のパフォーマンス macOS: サポートが限定的で、一部の機能が動作しない可能性がある Windows: 実験的サポート、本番ファジングには推奨されない
アンチパターン
| アンチパターン | 問題 | 正しいアプローチ |
|---|---|---|
| 本番環境で ASan を使用する | アプリケーションのセキュリティが低下する可能性がある | テスト時のみ ASan を使用する |
| メモリ制限を無効化しない | 20TB の仮想メモリのためにファジャーがプロセスを強制終了する可能性がある | -rss_limit_mb=0 または -m none を設定する |
| リークレポートを無視する | メモリリークはリソース管理の問題を示唆している | ファジングキャンペーンの終了時にリークレポートを確認する |
ツール別ガイダンス
libFuzzer
ファジャーとアドレスサニタイザーの両方でコンパイル:
clang++ -fsanitize=fuzzer,address -g harness.cc -o fuzz
無制限の RSS で実行:
./fuzz -rss_limit_mb=0
統合のヒント:
- 常に
-fsanitize=fuzzerを-fsanitize=addressと組み合わせる - クラッシュレポートで詳細なスタックトレースを得るために
-gを使用する - クラッシュハンドリング向上のために
ASAN_OPTIONS=abort_on_error=1を検討する
参照: libFuzzer: AddressSanitizer
AFL++
AFL_USE_ASAN 環境変数を使用:
AFL_USE_ASAN=1 afl-clang-fast++ -g harness.cc -o fuzz
無制限のメモリで実行:
afl-fuzz -m none -i input_dir -o output_dir ./fuzz
統合のヒント:
AFL_USE_ASAN=1は自動的に適切なコンパイルフラグを追加する- AFL++ のメモリ制限を無効化するために
-m noneを使用する - 大きなカバレッジマップを持つプログラムの場合は
AFL_MAP_SIZEを検討する
cargo-fuzz (Rust)
--sanitizer=address フラグを使用:
cargo fuzz run fuzz_target --sanitizer=address
または fuzz/Cargo.toml に設定:
[profile.release]
opt-level = 3
debug = true
統合のヒント:
- ASan は unsafe Rust コードまたは FFI の境界をファジングする場合に有用
- 安全な Rust コードはそれほど恩恵を受けない可能性がある (コンパイラが既に多くのエラーを防止)
- unsafe ブロック、生ポインタ、C ライブラリバインディングに焦点を当てる
参照: cargo-fuzz: AddressSanitizer
honggfuzz
ASan でコンパイルして honggfuzz とリンク:
honggfuzz -i input_dir -o output_dir -- ./fuzz_target_asan
ターゲットをコンパイル:
hfuzz-clang -fsanitize=address -g target.c -o fuzz_target_asan
統合のヒント:
- honggfuzz は ASan とすぐに連携できます
- サニタイザーでより良いカバレッジを得るためにフィードバック駆動モードを使用する
- ASan はメモリフットプリントを増加させるため、メモリ使用量を監視する
トラブルシューティング
| 問題 | 原因 | 解決策 |
|---|---|---|
| ファジャーが即座にプロセスを強制終了する | ASan の 20TB 仮想メモリに対してメモリ制限が低い | -rss_limit_mb=0 (libFuzzer) または -m none (AFL++) を使用する |
| "ASan runtime not initialized" | リンク順序が不正または実行時がない | -fsanitize=address がコンパイルとリンクの両方で使用されていることを確認する |
| リークレポートが出力を雑然とする | LeakSanitizer がデフォルトで有効 | ASAN_OPTIONS=detect_leaks=0 を設定する |
| パフォーマンスが悪い (>4 倍の低速化) | デバッグモードまたは最適化されていないビルド | -fsanitize=address に加えて -O2 または -O3 でコンパイル |
| ASan が明らかなバグを検出していない | バイナリがインストルメント化されていない | ASAN_OPTIONS=verbosity=1 で ASan が起動情報を出力することを確認する |
| 誤検出 | インターセプタの競合 | 特定のライブラリに関する既知の問題については ASan FAQ を確認する |
関連スキル
このテクニックを使用するツール
| スキル | 適用方法 |
|---|---|
| libfuzzer | -fsanitize=fuzzer,address でコンパイルして、メモリエラー検出統合ファジングを実現 |
| aflpp | コンパイル中に AFL_USE_ASAN=1 環境変数を使用 |
| cargo-fuzz | Rust ファジターゲットに対して ASan を有効化するために --sanitizer=address フラグを使用 |
| honggfuzz | ASan でインストルメント化されたファジング用に -fsanitize=address でターゲットをコンパイル |
関連テクニック
| スキル | 関係性 |
|---|---|
| undefined-behavior-sanitizer | 包括的なバグ検出 (未定義動作 + メモリエラー) のために ASan と組み合わせてよく使用される |
| fuzz-harness-writing | ハーネスは ASan 検出クラッシュを処理し、誤検出を回避するように設計する必要がある |
| coverage-analysis | カバレッジ駆動ファジングは、ASan がメモリエラーを検出できるコードパスのトリガーに役立つ |
リソース
主要な外部リソース
AddressSanitizer on Google Sanitizers Wiki
ASan の公式ドキュメント:
- アルゴリズムと実装の詳細
- 検出されるエラータイプの完全なリスト
- パフォーマンス特性とオーバーヘッド
- プラットフォーム固有の動作
- 既知の制限と非互換性
すべてのサニタイザーで共有される一般的な設定フラグ:
verbosity: 診断出力レベルを制御log_path: サニタイザー出力をファイルにリダイレクトsymbolize: レポートでのシンボル解決を有効/無効化external_symbolizer_path: カスタムシンボライザーを使用
ASan 固有の設定オプション:
detect_leaks: メモリリーク検出を制御abort_on_error: エラーでabort()vs_exit()を呼び出しdetect_stack_use_after_return: スタック use-after-return バグを検出check_initialization_order: 初期化順序バグを検出
一般的な落とし穴と解決策:
- リンク順序の問題
- 他のツールとの競合
- プラットフォーム固有の問題
- パフォーマンスチューニングのヒント
Clang AddressSanitizer Documentation
Clang 固有のガイダンス:
- コンパイルフラグとオプション
- 他の Clang 機能との相互作用
- サポート対象プラットフォームとアーキテクチャ
GCC 固有の ASan ドキュメント:
- GCC 固有のフラグと動作
- Clang 実装との違い
- GCC でのプラットフォームサポート
AddressSanitizer: A Fast Address Sanity Checker (USENIX Paper)
技術的な詳細を含むオリジナル研究論文:
- シャドウメモリアルゴリズム
- 仮想メモリ要件 (以前は 16TB、現在は約 20TB)
- パフォーマンスベンチマーク
- 設計の決定とトレードオフ
ライセンス: 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を通じてオンチェーン取引とデータ照会を実現します。