ファジング
入力データのプロトコル仕様から、静的に決定する部分と動的に決定する部分を切り分け、動的部分に対して変動の自動化を図る手法。静的部分と動的部分が記された定義ファイルの作成を必要とし、その作成を行なうセキュリティ担当者の力量に依存するところが大きい。
「ファジング」という用語が登場し、手順が確立される以前から、ランダムな入力の実行を用いたテスト手法が存在していた。たとえば、ジェラルド・ワインバーグは、コンピュータプログラムヘの入力として、ゴミ箱から引き出されたパンチカードや乱数のカードを使用し、それらの実行によって望ましくない動作を引き出し、バグの検出に用いていた。
1981年、DuranとNtafosは、ランダムな入力を使用してプログラムをテストすることの有効性を正式に調査した研究論文を発表している。それまでランダムな入力によるテストは、プログラムをテストするための「最悪の手段」であると広く認識されていたが、DuranとNtafosは、ランダムな入力によるテストが費用効果の高い代替手段であることを示した。 1983年、AppleのSteve Cappsは、Mac Paintなどの従来のMacOSアプリケーション用にランダムな入力を生成するツールTheMonkeyを開発した。名称の由来にあるMonkey(日本語:「猿」)は、「無限の猿定理」で提示された「猿がタイプライターのキーボードでランダムにキーを無限に押せば最終的にシェイクスピア全集をタイプアウトする」という思考実験に由来する。 1991年、ランダムなプロセッサ命令のセットを実行することにより、UnixおよびUnixライクなオペレーティングシステムでプログラムの信頼性・堅牢性をテストするように設計されたアプリケーションcrashmeが公開された。 これらのテスト手法は、ランダムテストまたはモンキーテストとも呼ばれてきた。
これに対して、ファジングは、テストケースの自動生成・実行と、自動化に伴う再現性の高さとコードカバレッジの広さで優れており、テスト実施者の経験と勘に依存しないソフトウェアテストとして発展してきた。ただし、ファジングにおいても依然としてテスト実施者の経験と勘に依存する要素はある。入力データの決定方法では半自動化を選択する場合もあるほか、ファイル形式のファジングなどの分野では手動ファジングが効果的な場合もある。 ファジングが有効な例としては、信頼境界線を越えた入力が挙げられる。一例として、ファジングを用いたコードの検証を行う際は、管理者権限ユーザーのみがアクセスできる構成ファイルを解析するコードよりも、任意のユーザーによるファイルのアップロードを処理するコードのほうが、有効な結果を得られる可能性が高い。 ファジングはソフトウェアまたはコンピュータシステムの不具合、特に脆弱性を発見するために一般的に使用され、ソフトウェアの未知の脆弱性と堅牢性の課題を明らかにするうえで最も重要な手法の一つである。 品質保証の分野でもファジングと同様の手法が使用されており、堅牢性テスト、構文テスト、または否定テストと呼ばれている。
初期のツール、PROTOSなどが用いていた方法である。ターゲットがもつ機能から、その入力対象となるデータのうち、問題を生じる可能性が高いもの(0、1、その他境界値周辺の値など)を事前に生成しておく。テストデータの範囲内だけでテスト可能であるという欠点をもつ。
ミラーらのプロジェクトは、テストしたUNIXユーティリティの25~33%をクラッシュさせることに成功した。また、各クラッシュをデバッグして原因を特定し、検出された各障害を分類した。加えて、他の研究者が他のソフトウェアでも同様の検証実験を行えるようにするために、ツールのソースコード、テスト手順、及び生の結果データが公開された。なお、1990年の研究論文では、ファジングの信頼性とセキュリティの関係性についても言及されている。 この時点ではまだ用いられているテスト内容は、たんに「クラッシュするか否か」「ハングするか否か」といったレベルのものであり、ファジングという用語も概念も登場する前のことであったが、これらのことを行なったバートン・ミラーは「ファジングの父」と呼ばれている。 ファザーを用いたテストは、1995年に再度実験が行われた。アプリケーションは、MacOSおよびWindows用のGUIアプリケーション、ネットワークプロトコル、およびシステムライブラリAPIテストを含むように拡張された。このときには様々なUNIXアプリケーションに対して脆弱性が発見されている。
ファジングによる脆弱性検出に関心のある研究者・開発者に向けの日本国産ファジングフレームワーク。多種多様なファジングアルゴリズムを統合されたインターフェイスから扱うことのできるフレームワークで、既存のファジングアルゴリズムをブロックのように組み替えて新たなアルゴリズムを作り出すことを可能にするドメイン固有言語「HierarFlow」を備えている。ファジングアルゴリズムの実装コストを低下させ、再利用性を向上させる機能を含む。