コンテンツにスキップ

2026年現代ファジング:スナップショット、フレームワーク、および以前ファジングできなかった何

· 13 min read · default
cybersecurityfuzzingvulnerability-researchreverse-engineeringtestingsecurity

ファジングは評判問題がある:多くのエンジニアはまだそれをランダム バイトをプログラムで投げるものとして画像します。その説明は1990年代で大体正確でここ10年間誤解を招いています。モダン ファジングはカバレッジガイド付き—ファザー計測ターゲット、各入力到達するコード パス観察、および変異を操舵 新しいテリトリー探索する入力に。そのフィードバック ループはランダムにパーサーを突く、および体系的にその状態 スペースをウォーク、および理由ファジングは実は今年数千の本当のCVE発見するので、専門家で概査を受けています。

2026ランドスケープは1つのツール を過ぎて成熟しており、ただし、面白い開発は到達ターゲット従来型ファジングできなかったに関する:オペレーティング システム カーネル、高価なセットアップの後ろのコード、および入力構造が バイト変異を打つアプリケーション。このガイドはそのランドスケープ カバー—カバレッジガイド付き古典、syzkallerカーネル、Snapchangeスナップショット ファジング、およびLibAFLターゲットが実際に必要なファザー構築—プラスcargo-fuzzおよびhonggfuzz日常的作業。

なぜカバレッジ ガイダンスはすべてを変えました

メカニズムはファジングが何良いかおよび どこでそれは停止するかを説明するので理解する価値あります。カバレッジガイド付きファザー計測器でターゲットをコンパイル、制御フローグラフのどれいくつかのエッジ実行中を記録します。コーパス入力を維持、および変異入力到達エッジ前の入力到達しなかった時、その入力は判定興味深いおよび追加される コーパス進一歩変異される。数百万反復以上の、コーパス蓄積入力はごと深いテリトリーに到達、異常なパス—人間が書いたテストがないパス含む。

これはロジック外観を少しほぼ生成します。有効なPNGでシード コーパス与えられたのは、ファザーはチャンク構造を発見し、その後有効なチャンク タイプ、その後各タイプの解析分岐、プログレッシブ ビルディング入力ディープに到達デコーダーへ。それはまた「PNG」を理解しません;それは何でも保つのはカバレッジを移動。

コロラリーは ファジング停止するところ:困難な チェックそれは推測できない。マジック定数比較、チェックサム、または暗号署名壁を作成—ランダム変異本当に確率を作成することはありません 正しい8バイト、所以すべてその チェックの背後にあるもの停止です。実際的な応答はシード コーパスを有効な入力でシード、マジック値のディクショナリーを提供、またはファザー構築で チェックサムをパッチするです。カバレッジ プラトーを「壁ヒット」として認識するのではなく「何もバグがない」は1つの最も有用な直感このし仕事は。

カーネル ファジング:syzkaller

オペレーティング システム カーネルは従来型ファザー対して敵対的ターゲット。入力はファイルではなくsyscallシーケンス相互依存引数—fdopenから流れこむ必要がありますread、およびほとんどのランダムsyscall シーケンス EINVAL持つ即座に失敗。クラッシュ1つのプロセス代わりのマシン全体をテイク ダウン、およびカバレッジ必要があるに集まる カーネル スペース。

syzkaller3つもを解決します。記述する syscall宣言型言語(syzlang)それはつじつまが合ったそれら十分に有効正しく型の、相互依存引数シーケンス;ターゲットを実行 内使い捨てVM のため クラッシュが生き残るおよび自動的に集計;およびそれはKCOVカーネル カバレッジ フィードバック プラス KASAN 無音であるメモリー エラーをキャッチ。Googleの syzbot 連続に実行 Linux に対して数千バグを報告しました。

教訓はカーネル一般化:syzkaller の動作が人フォーク知識入力構造説明。ターゲット入力の場合文法がある、スケーラー ファザー ティーチング そのよりフル バイト変異の幅広い。対応するコストは本物—拡張syzlangに下試テスト サブシステムは本当の仕事、およびそれは同様に最高値寄付ほとんどの人はできるカーネル ファジングなります。

スナップショット ファジング:セットアップを過ぎ取得

2番目の フロンティアはデータベース クエリー パーサーなどの高価な初期化の背後にあるコード。各反復は開始 サーバー、初期化 ストレージ、認証、セッション確立必要があるの ファジングする前に1つのクエリー解析。おおよそ秒当たり10反復、カバレッジガイド付き ファジング は絶望的—技術は数千必要。

スナップショット ファジングこれを反転。正確ターゲットを実行するの感心のモーメント、取得メモリー スナップショットマシン 状態全体、およびその後その状態から毎反復をリストアします。すべてセットアップ コストは 1度支払われます。Snapchange(AWS から)これ実装 KVM:キャプチャ スナップショット QEMU、書き込み小さいRustハーネス 説明 入力はどこに削除や 反復いつ終わる、およびそれが本当に高いレート再生。

これアンロック カテゴリーが以前以前実用的でなかった:状態ネットワーク プロトコル ファジング 中セッション、認証の背後のコード、ハイパーバイザーおよびカーネル コード、および任意 高スタートアップなアプリケーション。貿易は努力—書き込み Rust ファザー代わりに、ターゲットの メモリー レイアウト十分を理解する必要があります入力を正しく削除。それは特殊技術が精密に支払う場合 代替案は ファザー ターゲットではなく かどうか。

フレームワーク:ターゲットが必要なファザーを構築

3番目の 開発はフィロソフィカル。AFL++およびlibFuzzerは優秀なものです設計目的および厄介の場合ターゲットしない フィット—カスタム バイナリー プロトコル、エミュレート ファームウェア イメージ、入力はバッファー代わりのツリー。歴史的には曲げたツール、通常不幸。

LibAFL、AFL++ チームから、治療 ファザーとして合成可能パーツ:オブザーバー記録データ、フィードバック判定 興味深さ、変異子変形 入力、スケジューラー、ステージ、および実行者。集約 組み合わせ ターゲット必要、定義独自入力タイプ および変異子入力が構造化 場合、実行者選ぶ(インプロセス、forkserver、QEMUエミュレーション、Frida 計測、スナップショット)、およびマルチコア スケーリング無料を取得。

正直なフレーミングは これが ツール実行、それで シーケンス物事より大きい コミットメント:で開始cargo-fuzzRust またはhonggfuzz/AFL++ ネイティブ ターゲット、LibAFLへ 移動 唯一 当てはめない特に理由を述べることができるとき。「入力はプロトコル状態マシンおよび バイト変異決して生成 有効な二番目メッセージ」そのような理由;「高速でもしたい」通常ではありません。

日常的なファジング チームの實際に維持

ほとんどの値、ほとんどのチーム、モノトーン パーサーおよび信頼できない 入力ハンドラー連続ファジングから来ます。cargo-fuzzこれはほぼ 摩擦 Rust するする:&[u8]を取る関数(または、より良い、型化 値 経由arbitrary クレート)書き込みおよび1つのコマンド実行します。honggfuzz同様に簡単 ネイティブ コード および追加 ハードウェア ベース カバレッジ Intel PT/BTS経由、させる あなたは ファザーバイナリー 再コンパイルできない—有用クローズドソース 依存関係。

2つのプラクティス分離 チーム取得 値 チーム放棄チームから ファジング 後 週。1 最初、**シード コーパス 有効な 実在する 入力でさせる;**ファザー空のコーパスから開始時間膨大な 支出 ベーシック フォーマット有効性を再発見 与えた。2 番目、連続実行および処理 検査結果 テストとして: 最小化 各 クラッシュを変換 回帰 テストのでとどまる修正、および コーパス拝認の コード変更以上進歩するの間で。ファジングはない1つの午後監査;それは バックグラウンド プロセス 変更はコード見つけ続いています。

サニタイザー言及 に値する効果を乗算 彼ら。AddressSanitizer しない無音メモリー 腐敗は即座 診断可能 クラッシュ、およびUBSan 現れることが不可能動作が神秘的な不適応の後です。ファジング サニタイザー見つけることもなしで 本当に単独でクラッシュするバグ—通常 何が実は本当に小さい フラクション 。

トリアージ:クラッシュ到着時開始する仕事

クラッシュ検査開始、およびチーム日常的にごまかす 努力「ファザー停止」および「開発者修正できる」。4つのステップ 役割 切り替える 有用なレポートおよび 1つは無視。

最小化 入力。 クラッシュ入力 ファザーから は通常 不関連バイト 多い 何もこれらを削除。すべてのシリアス ファザー出荷 最小化(cargo fuzz tminafl-tmin、syzkallersyz-repro)、および それを実行 4キロバイト blob に変換 数バイト 分離 実際の トリガーに。これ 膨大な開発者 必要 理解ため。

複製 削除。 ファザー夜実行 同じ バグ数十 レポート 異なる入力経由。クラッシュ位置およびスタック シグネチャ グループ化 200 クラッシュ6 別々のバグに変換。これステップなし、トリアージ ことのように見える不可能コスト人が放棄します。

評価 悪用性、注意深く。 すべてのクラッシュはありません 脆弱性。パーサーの null ポインター 参照解除は通常 否定のサービス;ヒープ バッファー オーバーフロー 攻撃 制御ド長はより悪い可能性あります。サニタイザー出力膨大ここ—ASan メモリー エラーのタイプ、サイズ、および両方割り当てを伝える アクセス スタック。抵抗 誘惑 すべてラベル重大な、何チーム インフレード 重大度 停止 レポート 信頼。

変換 回帰 テストへ。 最小化 入力修正 と一緒にコミットされた ユニット テストになります。これ 何バグはとどまる修正 何 ファジング 複合 時間を変更 後にコードを再発見 イシュー代わりに。

チーム 値 ファジング 取得 されたもの 1度パイプライン構築、最も クラッシュ。

開始ところ 選択

決定はターゲットを従う。Rust コード 用に cargo-fuzz を使用、およびarbitraryをファザーを使用して に型化 API、バイト パーサーのみならず。ネイティブ ユーザースペース バイナリー ソース 持つ ため、honggfuzz または AFL++ サニタイザー。バイナリー ソース なし、honggfuzz のハードウェア フィードバック または AFL++ QEMUモード。OSカーネル、syzkaller、および も考慮し拡張 syzlang サブシステム対しいる気を。高価なセットアップの背後のコード または状態セッション、Snapchange または スナップショット 可能 LibAFL 設定。および入力 本当の 構造 —プロトコル、AST、文法を持つ形式—いずれか文法対応 変異子 またはカスタム LibAFL ファザー、バイト変異がプラトー早く。

これら全て、同じ規律は適用:シード 良く、サニタイザー実行、連続実行、クラッシュを最小化、および 検査結果を回帰テスト。ツールは役割より少ない より是非として。

ボトムライン

ファジング 2026は カバレッジ フィードバック上に構築 体系的な脆弱性 発見 規律、およびそのフロンティアは到達ターゲット以前アウトスコープ。syzkallerカーネル syscall 構造をエンコーディングおよび使い捨てVM 実行;SnapchangeはKVMスナップショットファジング以前不実用的なカテゴリー、LibAFLさせるには構築 ファザー マッチ 異常ターゲット ツール;およびcargo-fuzzおよびhonggfuzzするに 安い十分日常的な連続ファジング 実際に維持。語彙から開始 言語、シード コーパス 有効な 入力 、常に サニタイザー有効化、カバレッジプラトー エンジニア 過ぎ壁に 壁とする、各 クラッシュ テストに変換。

参考文献とリソース

ツール

背景および分析

関連1337skills チートシート