ファジング(Fuzzing)

ふぁじんぐ

ファジング(Fuzzing)

ファジングとは、対象プログラムにランダムまたは半構造化された大量の入力データを自動的に与え、クラッシュや予期しない挙動を引き起こすことでソフトウェアの脆弱性やバグを検出するテスト手法である。

ファジングの基本的な仕組み

ファジング(ファズテスト)は、テスト対象のプログラムに対して大量の異常な入力を自動生成し、片端から投げ込むことで「壊れ方」を観察する手法だ。入力にはランダムなバイト列、極端に長い文字列、境界値付近の数値、不正なフォーマットのファイルなどが含まれる。プログラムがクラッシュしたりハングしたりすれば、そこに潜在的な脆弱性がある可能性が高い。

手法は大きく 2 種類に分かれる。ミューテーションベースは正常な入力を少しずつ改変して異常入力を作る方式で、セットアップが手軽な反面、入力の構造を理解していないため深い処理パスに到達しにくい。ジェネレーションベースは入力の文法やプロトコル仕様を定義し、文法的には正しいが意味的にはおかしい入力を生成する。HTTP リクエストや画像ファイルなど構造化された入力に対しては後者の方が効率的だ。

カバレッジガイドファジングの台頭

現代のファジングツールの主流はカバレッジガイドファジングである。Google が OSS 向けに公開した AFL(American Fuzzy Lop)がこの分野を大きく前進させた。プログラムにインストルメンテーション(計装)を施し、入力がどのコードパスを通過したかを追跡する。新しいコードパスを発見した入力は「興味深い」と判定され、さらに変異させて投入される。この進化的なフィードバックループにより、ランダムな入力だけでは到達できない深い処理ロジックのバグを効率的に掘り起こせる。

Google の OSS-Fuzz プロジェクトは、1,000 以上の OSS プロジェクトに対してカバレッジガイドファジングを継続的に実行しており、これまでに 10,000 件を超える脆弱性を発見してきた。DevSecOps の CI パイプラインにファジングを組み込む動きも広がっている。

AI との関係 ― ファジングの限界と補完

ファジングは強力だが万能ではない。FFmpeg で 500 万回の自動テストをすり抜けた 16 年もののバグを Claude Mythos が発見した事例は、ファジングが構造的に苦手とする領域の存在を示している。ファジングは「入力→出力」の境界面を叩く手法であり、複数のコンポーネントにまたがるロジック脆弱性や、特定の状態遷移の組み合わせでのみ発現するバグは検出しにくい。

Project Glasswing のようなAI 駆動のコード解析は、ソースコードを文脈込みで読解し、ファジングとは異なる抽象度で脆弱性を見つける。両者は競合ではなく補完関係にあり、シフトレフトの実践においてはファジングを CI に組み込みつつ、AI による深い解析を定期的に実施するのが現実的なアプローチになりつつある。