ソフトウェアやシステムは、開発者が想定していない入力を与えると、思わぬエラーや脆弱性が見つかることがあります。こうした問題を見つけるための方法が「ファジング(Fuzzing)」です。ファジングは、自動的にランダムなデータや異常なデータを送り込み、その反応を調べることでバグや脆弱性を発見します。
この記事では『ファジング』について、以下の内容を図を用いてわかりやすく解説します。
- ファジングとは?
- ファジングの種類(ブラックボックス・ホワイトボックス・グレーボックス)
- 「ファジング」と「ペネトレーションテスト」の違い
- ファジングの「メリット」と「デメリット」
ファジングとは?

ファジング(Fuzzing)とは、ソフトウェアやシステムに対して、「ファズ」と呼ばれる予期しないデータやランダムなデータを送り込み、バグや脆弱性を発見するテスト手法です。
ファズの例としては、こんなものがあります。
- 極端に長い文字列(例:数万文字の入力)
- 特殊文字や制御コード(例:改行コードやNULL文字など)
- フォーマットが壊れたデータ(例:JSONのカッコが足りない)
- 不正な数値(例:負の数やあり得ないほど大きな数値)
上記のような、通常のテストでは想定しないようなファズを与えることで、予期しない挙動、クラッシュ、メモリ破壊、無限ループなどを引き起こし、バグや脆弱性を発見します。
ファジングでは、たくさんのファズを自動的に入力して、その結果を集めます。こうすることで「人の思い込み」や「想定外の見落とし」を避けながら、公平にソフトを検査できます。そのため、手作業で入力するのではなく、専用のファジングツール(ファザー)を使って、ファズの生成から入力、挙動の監視までを自動化するのが一般的です。
「ファズ」と「ファジング」と「ファザー」の整理
- ファズ(Fuzz)
- 問題を起こしそうなデータ(予期しないデータやランダムなデータ)
- ファジング(Fuzzing)
- テスト手法の名称
- ファザー(Fuzzer)
- ファズを送付するツール
補足
ファジングは別名「ファズ・テスト」とも呼ばれています。
ファジングの種類(ブラックボックス・ホワイトボックス・グレーボックス)
ファジングは、その手法によって以下の3つに分類することができます。
- ブラックボックスファジング
- ホワイトボックスファジング
- グレーボックスファジング
ブラックボックスファジング
ブラックボックスファジングは、テスト対象となるシステムやソフトウェアの内部構造や設計仕様を知らない状態で、外からデータを送り込む方法です。テスターはシステムの「入出力」だけに注目し、異常なデータを入力して挙動を確認します。
- 例
- Webフォームにありえない長さの文字列を入力する
- APIに間違った形式のデータを送る
- メリット
- 内部構造を知らなくてもテストできる
- 思わぬ脆弱性を見つけやすい
- デメリット
- 内部の動きを考慮していないので、特定の脆弱性やバグは見つけにくい
ホワイトボックスファジング
ホワイトボックスファジングは、テスト対象となるシステムやソフトウェアの内部構造や設計仕様を完全に把握した状態で、外からデータを送り込む方法です。
- 例
- 「if文の分岐条件が集中する箇所」に異常なデータを送り込む
- メモリ処理が多い部分を重点的にテストする
- メリット
- 設計を元に効率よくバグを探せる
- 隠れたバグを徹底的に洗い出せる
- デメリット
- テストケースが膨大になりやすく、工数が増える
- ソースコードや設計情報がなければ実施できない
グレーボックスファジング
グレーボックスファジングは、ブラックボックスファジングとホワイトボックスファジングを組み合わせたテスト手法です。テスト対象となるシステムやソフトウェアの内部構造や設計仕様の一部だけを活用し、リスクが高そうな部分を重点的に調べつつ、ランダムなデータも使います。
- 例
- 設計書にある「重要な関数」だけ重点的にテスト
- 同時にランダムデータも投入して想定外のバグを探す
- メリット
- バランスがよく、効率的に脆弱性を探せる
- ホワイトボックスより工数が少なく、ブラックボックスより精度が高い
- デメリット
- 「どこまで内部情報を活用するか」という判断が必要になる
「ファジング」と「ペネトレーションテスト」の違い
ファジングと似た検査手法として、ペネトレーションテストがあります。どちらもセキュリティ上の問題や不具合を発見するためのテストであるため混同されがちですが、検査対象や目的、手法には明確な違いがあります。
ペネトレーションテストは、すでに運用中のネットワークやシステム全体を対象に行うテストです。攻撃者の視点で、
- 外部から侵入できないか?
- 内部の機密情報にアクセスできないか?
- サービスを止める攻撃ができないか?
など、実際に想定されるサイバー攻撃のシナリオを作成し、ネットワークやシステムへの侵入をテストします。
ペネトレーションテストはこのようにネットワークシステム全体を評価しますが、ファジングは個別のソフトウェアやプログラムを評価します。
ファジングとペネトレーションテストの違いを以下の表にまとめます。
比較項目 | ファジング | ペネトレーションテスト |
検査対象 | ソフトウェアや特定のコンポーネント | ネットワーク全体やWebアプリ、OS、サーバーなど |
目的 | 想定外の入力による不具合や脆弱性の発見 | 実際の攻撃者になりきって侵入・情報漏洩を検証 |
アプローチ | ランダム/異常なデータを大量に入力する | 実際の攻撃手法を用いたシナリオベースの侵入 |
得られる結果 | ソフトウェアのバグ・メモリ破壊・例外処理漏れなど | 侵入可能かどうか/防御体制の実効性 |
対象の状態 | 開発中またはテスト中のソフトウェア | 運用中の本番システム |
あわせて読みたい
『ペネトレーションテスト』については下記の記事で詳しく説明しています。興味のある方は下記のリンクからぜひチェックをしてみてください。 続きを見るペネトレーションテスト(侵入テスト)とは?わかりやすく解説!
ファジングの「メリット」と「デメリット」
ファジングには以下のようなメリットとデメリットがあります。
メリット
- 未知の脆弱性を発見できる
- ファジングを行う最大の利点は、未知の脆弱性を効率よく発見できる点にあります。
- 開発者が通常のテストで想定していない入力データをシステムに与えることで、思いもよらぬ挙動を引き起こし、それによって潜在的な問題を浮かび上がらせることができます。
- バグ(不具合)を見つけやすい
- ファジングはセキュリティ面だけでなく、通常のバグ検出にも有効です。人間の想定を超える多様な入力パターンを使うことで、開発時には予測できなかった不具合を見つけやすくなります。
- テストを自動化できる
- 入力データの生成からテスト実行、挙動の監視までを自動で行えるのが大きな特徴です。これにより、人手で膨大なテストを繰り返す必要がなくなり、時間やコストの削減につながります。
デメリット
- テストパターン外の脆弱性は見つけにくい
- ファジングはツールが生成したデータに基づいてテストを行います。そのため、ツールのアルゴリズムやパターンに含まれない脆弱性やバグは検出できないことがあります。
- 結果の分析には専門知識が必要
- 例えば、テスト中にクラッシュが発生しても「どの入力データが原因か」「修正はどこに必要か」を突き止めるには、システムの構造やソフトウェアの動作を深く理解している必要があります。
- ツール選びが難しい
- ファジングツールにはさまざまな種類があり、対象ごとに得意・不得意があります。ネットワーク通信、ファイル形式、画像処理など、ソフトウェアの性質に合ったツールを選ばなければ、効率的に脆弱性を検出できないこともあります。誤ったツール選定は、十分な効果を得られない原因となります。
- 導入・運用コストがかかる場合がある
- テストそのものは自動化できても、環境構築や結果の解析にはコストが発生します。特に自社に専門人材がいない場合は、外部のセキュリティ専門家に依頼する必要があり、その分の費用や調整が必要になります。
本記事のまとめ
この記事では『ファジング(Fuzzing)』について説明しました。
ファジングは、普段のテストでは気づきにくい未知のバグや脆弱性を発見できる強力な手法です。ブラックボックス・ホワイトボックス・グレーボックスといったアプローチを使い分けることで、効率的かつ効果的にシステムの品質を向上させられます。
一方で、ペネトレーションテストのように「実際の攻撃者視点で本番システムを検証する方法」とは対象や目的が異なるため、両者を組み合わせて使うことがより効果的です。
お読み頂きありがとうございました。