バグ発見キャンペーン
新たに侵害された保証を露呈できる実験を選択し、実験が実際に観測した内容に従って計算リソースを費やします。発見、再現、トリアージのコストを常に可視化しておきます。「コードカバレッジは時間とともに増加すべき」という点や、ブロッキング問題の解決と並んで、速度はリストアップされるパフォーマンス要因の一つです。また、有用なターゲットは「テストしているコードのカバレッジが良好でなければならず」、実行回数だけでは有用なリーチを確立できません(OSS-Fuzz統合、カバレッジ、ClusterFuzzパフォーマンス、パフォーマンス要因)。
現在の能力を確立する
実際のターゲットリビジョン、有効なビルド、ハーネスプロデューサー、アサーション本体を読み取ります。各既存レーンがどの入力、初期状態、操作、効果、スケジュール、障害、設定を実行・観測できるかを記録します。除外および拒否されたケースを調査します。カバレッジまたはリーチ可能性ツールは、文書化されたビルド/ランタイムが適用される場合にのみ使用します。Fuzz Introspectorは「C/C++、Python、Javaで書かれたプロジェクト向け」に、それぞれ独自のビルドツールを用いたレポートを文書化しているため、普遍的なバックエンドではありません(Fuzz Introspector、概要およびビルドツールの違い)。JavaScriptまたはTypeScriptプロジェクトの場合は、JSレーンインベントリを参照してください。
検査した実装が提供する場合、その機能を既存としてカウントします。すでに有効なプログラム生成、クロスエンジン結果比較、トランザクション履歴を使用しているターゲットに対して、同じメカニズムを新しい名前で追加することは、提案された進歩にはなりません。代わりに、カバーされていない相互作用や観測を選択してください。SQLiteのdbsqlfuzzは「SQL入力とデータベースファイルの両方を同時に変異させ」、「以前のファザーが見逃した」欠陥を発見しました。これは、複数の次元を一緒に探索する具体的な先例です。これは「プロプライエタリなファズテスター」です。公開ツールを想定するのではなく、メカニズムを借用してください(SQLiteテスト、§2および§4.1.3)。
1つの候補を実行可能にする
プロジェクトの既存の実験ノートに候補を記述します。サービスや必須スキーマを導入しないでください。これらの決定を証拠パスとともにまとめて保管します。OSS-Fuzzは、ターゲットが短いローカル実行で「少なくともある程度の進捗」を達成すること、そして再現にはレポートに一致するビルドが必要であることを求めています(OSS-Fuzz統合、ファズターゲット、再現、イメージとファザーのビルド)。
- プロデューサーとギャップ: 実際のエントリポイントと、ベースラインで省略された障害空間。
- 保証とオラクル: 支配的な契約、実行可能な観測、および合法/非対応/結論不能の結果。
- 探索: 生成された値/状態/操作、および制御されたスケジュール、障害、設定の選択肢。
- パイロット: 許可された経過時間/ワーカー/リソースのエンベロープ、リプレイ素材、および次の割り当てを正当化する証拠。
観測を設計してからワークロードを増やしてください。Elleのトレーサブルオブジェクトは、レジスタへのブラインド書き込みが「履歴を破壊する」ため、通常の上書きでは隠れてしまう依存関係を明らかにします。その推論には明示的な限界もあります。チェッカーは健全であり「完全性を保証するに近い」状態であり、「私たちのアプローチは述語を無視し、個々のオブジェクトのみを扱います」。より多くの非情報的な履歴を生成するジェネレーターは、これらの限界を修復しません(Elle、§§3、4.3、9)。一般的な契約には correctness-oracles を、特定のモデルにはその下の専門スキルを使用してください。
| 欠落している次元または観測 | 関連する専門スキル |
|---|---|
| 依存するAPIオブジェクトと正当な操作シーケンス | stateful-property-testing |
| 操作モデルなしで到達可能なブラウザまたはReact UI状態、状態ごとのオラクルとパスリプレイ付き | ui-state-exploration |
| 必須の状態/効果を持つランタイム有効なプログラム | semantic-program-generation |
| 独立した実行比較、または正当化された実行間の関係 | semantic-differential-testing、metamorphic-testing |
| インストルメンテーション/探索メカニズム、または保持された探索素材 | coverage-guided-fuzzing、corpus-evolution |
| メモリアクセス診断、または制御されたスケジューリング選択 | native-memory-instrumentation、race-detection-campaigns、schedule-exploration |
| 並行オブジェクトまたはトランザクションの保証 | linearizability-checking、transactional-history-testing |
| デプロイ障害、制御された環境、またはリカバリ境界 | distributed-fault-testing、deterministic-simulation、crash-consistency-testing |
| ハードなパス制約、または境界付き不変条件 | symbolic-concolic-execution、bounded-model-checking |
| リソース増大、進行、ビルドの相互作用、または数値精度 | resource-complexity-testing、liveness-testing、configuration-differential-testing、numerical-oracles |
このテーブルはこのパックの責任をルーティングします。名前付きツールがターゲットをサポートしていることを確立するものではありません。選択した専門スキルとその該当する参照のみを読んでください。harness-sensitivity を使用して、新しいオラクルが代表的な違反に到達して拒否することを、できれば既存のリグレッションやコントロールを通じて確認する証拠を取得します。SQLiteのミューテーションテストは「テストスイートがミューテーションをキャッチすることを検証します」(SQLiteテスト、§7.6)。これを実験に比例させ、繰り返される承認ラウンドにしないでください。
パイロット証拠から割り当てる
許可されたエンベロープ内で実行します。ターゲットコードと意図されたプロパティが実行されているかどうかを確認します。到達不能なパスと、ミューテーションが解決していない到達可能なパスを区別します。Fuzz Introspectorは、この区別のために各ファザーの「静的リーチ可能性ポテンシャル」を動的カバレッジと比較します。欠落しているプロデューサー、セマンティック前提条件、または観測が制限要因である場合、実験を変更します(Fuzz Introspector、概要)。診断については、パイロット診断を参照してください。
その証拠がより多くの探索を正当化する場合、情報豊富なレーンを拡張します。探索メカニズムが異なる補完的なレーンを比較します。AFL++は「すべてのセカンダリファザーにはバリエーションが存在すべき」と述べています(AFL++深層、§3.c マルチコアの使用)。普遍的な時間やコア数ではなく、実際の時間、ワーカー数、リソース制限を使用します。ランタイムフラグは専門スキルに保持します。入力ごとのタイムアウト、キャンペーン期間、メモリ制限は異なる制御です(libFuzzer 23.1.0 オプション)。
プロパティ評価とセマンティック/コードリーチの生カウンター、生の候補と複製された発見、重複と不明、セットアップ/実行/削減/トリアージコストを保持します。これらを捏造された生産性スコアにまとめないでください。比較主張が重要な場合は、一致した条件と変動性を伴う繰り返し試行を使用します。FuzzBenchは「試行回数、平均、中央値、標準偏差」、および「到達カバレッジの分布」を、単一の幸運な実行ではなく報告します(FuzzBenchレポート、ベンチマークごとのサマリー)。
要約する前に、元の入力、開始状態、ソース/ビルド/設定、インストルメンテーション、生の出力、リプレイの選択を保存します。OSS-Fuzzのテストケースは「ターゲットに与えられたバイトを含み」、一部のバグは報告されたサニタイザーの下で「32ビットモードまたは64ビットモードでのみ再現可能」です。シードだけではその完全な成果物ではありません(OSS-Fuzz再現、ファズターゲットのバグおよびイメージとファザーのビルド)。候補を failure-reduction および evidence-based-triage にルーティングします。信頼性の低い、または未解決の発見は、黙ってカウントしたり破棄したりせず、可視化したままにします。ClusterFuzzは再現の信頼性でフィルタリングし、「問題がどのくらいの頻度で、どのような条件下で発生するか」に関する統計を保持します(ClusterFuzzトリアージ、テストケースのフィルタリングおよびクラッシュ統計)。
割り当て決定を完了する
継続、次元変更、再現/削減/トリアージ、または停止を、観測された理由と残りのスペースとともに記録します。プラトー(停滞)は診断を動機付けます。それは正当性や別のツールが役立つことを証明するものではありません。ゼロ発見は有界な結果として保持します。未処理の候補キューは、次のトランシェを生成ではなく証拠に費やすことを正当化できます。カバレッジガイド型のlibFuzzerまたはAFLターゲットの場合、ClusterFuzzは、ターゲットが多くの新しいクラッシュを発見した場合、「パフォーマンスを分析するよりも、それらを修正することの方がおそらく重要である」とアドバイスしています(ClusterFuzzパフォーマンス、ファズターゲットパフォーマンスを分析するタイミング)。
テストされた保証、実際の予算、到達した動作、証拠パス、分類された発見、および次の決定を返します。確立された場合にユーザーに可視な影響を説明します。可能性のある原因を、実証された違反とは別にしておきます。具体的な割り当てと記録の例については、キャンペーン例を参照してください。誤解を招くショートカットについては、よくある間違いを参照してください。
呼び出しは、ユーザーの既存のスコープと実行ルールを保持します。それ自体は、ターゲットの変更、インストール、クラウド費用、本番障害注入、または外部公開を許可するものではありません。