セキュリティ:ファジングについて

ソフトウェアやシステムの開発においてバグや未知の脆弱性を検出する方法として、「ファジング」という手法があります。最近ではスマートフォンやネットワーク家電、制御系のシステムなど幅広くこのファジングが導入されています。ここでは、ファジングとそのテスト手法についてご紹介します。

ファジングとは

ファジングは、ブラックボックステストの手法のひとつとして位置づけられます。対象となるソフトウェアやシステムに予測できない入力データ(ファズ)を与えて、例外を監視することによりバグや脆弱性を検出するテストです。主に製品の開発部門や出荷前の製品をテストする品質保証部門において活用されます。ファジングの特徴は、大量のファズを使って総当たり的に検査を行うという点です。このような総当たり的な手法を「ブルートフォース」と呼びます。あらゆるパターンの入力を試すことが理想であるため、同じ手順の作業を少しずつ入力する値を変えながら何度も繰り返して実施することになります。そのためファジングツールによって自動化して行うのが一般的です。

ホワイトボックステスト・ブラックボックステスト

ホワイトボックステストとは、ソフトウェアやシステムの内部構造を把握した上で動作検証を行うテスト手法です。内部構造を把握した上での検証なので、細部にいたるまで網羅的にチェックできるというメリットがある一方、大規模なソフトウェアでは検証に膨大な手間がかかることやソースコードが入手できないと適用できないといった問題があります。
ブラックボックステストは、ホワイトボックステストとは逆にソフトウェアやシステムの内部構造とは関係なく、入力を制御しその出力を観察するテスト手法です。さまざまな入力に対して仕様書通りの出力が得られるかどうかを確認することが目的で、システム内部でどういった処理が行われているかは一切考慮しません。ソースコードも必要ありません。

ファジングツール

ファジングツールには、主に以下の3つのフェーズがあります。

  1. ファズの生成
  2. ファズの送信
  3. ファジング対象の挙動・死活監視

ファジングツールは、これらの一連の動作(テストケース)を自動で繰り返し行うことによりバグや脆弱性を検出します。

Webサーバへのファジングの例

ここで、ヘッダ部分に「aAaAaA...」という異常な文字列を含むHTTPリクエストをWebサーバに送信するファジングの例を紹介します。まず、正常なHTTP GETリクエストをファジング対象に送信します。Webサーバからは正常な応答が返ってきます。(図1)

図1 正常なHTTPリクエスト
【図1】正常なHTTPリクエスト

次に、リクエスト行に「aAaAaA...」という異常な文字列(ファズ)を含むHTTP GETリクエストをファジング対象へ送信します。(①ファズの生成、②ファズの送信)すると、それを受信したWebサーバは何も応答を返しませんでした。(図2)

図2 異常なHTTPリクエスト(ファズ)
【図2】異常なHTTPリクエスト

ファジングツールはWebサーバからの応答を待っていますが、ファジングツールにはWebサーバがどういう状態なのかわかりません。Webサーバが、異常な文字列を含むリクエストを破棄したかもしれませんし、クラッシュしているかもしれません。そこで、ファジングツールから死活監視のパケットを送信します。(③ファジング対象の挙動・死活監視)この例では、死活監視のために正常なHTTPGETリクエストを送信しています。Webサーバが正常に動作していれば、HTTPレスポンスを返すはずです。しかし応答を返さなかったので、Webサーバはクラッシュしたと判断できます。(図3)ファジングツールは、このテストケースを”失敗”と判定します。(図4)

図3 ファジング対象の死活監視
【図3】ファジング対象の死活監視

図4 ファジングツールでの測定結果
【図4】ファジングツールでの測定結果

試験者は失敗したテスト結果を分析し、対象機器に修正を施します。このようなテストを繰り返し行うことで対象機器のバグや脆弱性を削減でき、製品の品質を向上させることができます。また、テストは自動で行われるため、その労力や費用を抑えることもできます。

参考文献:
独立行政法人 情報処理推進機構 セキュリティセンター 「IPA ファジング活用の手引き」
http://www.ipa.go.jp/security/vuln/fuzzing.html
株式会社 技術評論社 「ソフトウェアの脆弱性検出におけるファジングの活用」
http://gihyo.jp/dev/feature/01/fuzzing

事例紹介に関するお問い合わせ

phone03-3245-1250