(57)【特許請求の範囲】
【請求項１】
テストデータを作成するテストデータ作成方法であって、コンピュータが、
記憶部から正常データを取得し、
前記正常データの全ての値を異常値に置き換えた異常データを作成し、
前記異常データの所定の箇所を前記正常データに復元して前記テストデータを作成する際に、前記テストデータを作成する度に復元する前記箇所を増やすテストデータ作成方法。
【請求項２】
該コンピュータは、
前記復元された前記箇所を示す値と、複数の値を取り得る前記異常値とを含み、前記テストデータの作成に用いられるテスト情報を前記記憶部から取得し、
前記テスト情報に複数の前記異常値が含まれる場合に、前記正常データの全ての値をそれぞれの前記異常値に置き換えた異常データを作成する請求項１記載のテストデータ作成方法。
【請求項３】
前記テスト情報は、前記異常データを前記正常データへ復元する際の単位データの先頭の位置を示す値を含み、
該コンピュータが、
前記テストデータを作成する度に、前記単位データの先頭の位置を前記異常データの先頭からずらす請求項２記載のテストデータ作成方法。
【請求項４】
該コンピュータが、
前記異常データの先頭から前記単位データの最後の位置までを前記正常データに復元する請求項３記載のテストデータ作成方法。
【請求項５】
前記テスト情報に複数の前記異常値が含まれる場合に、
該コンピュータが、
前記正常データの全ての値を第１の異常値に置き変えた第１の異常データを作成し、前記テストデータを作成する度に前記第１の異常データにおける前記箇所を増やし、
次に前記正常データの全ての値を第２の異常値に置き変えた第２の異常データを作成し、前記テストデータを作成する度に前記第２の異常データにおける前記箇所を増やす請求項２乃至４の何れか一項に記載のテストデータ作成方法。
【請求項６】
前記正常データは、
オフセットが複数箇所に存在する請求項１乃至５の何れか一項に記載のテストデータ作成方法。
【請求項７】
記憶部から正常データを取得する処理と、
前記正常データの全ての値を異常値に置き換えた異常データを作成する処理と、
前記異常データの所定の箇所を前記正常データに復元してテストデータを作成する際に、前記テストデータを作成する度に復元する前記箇所を増やす処理と、をコンピュータに実行させるテストデータ作成プログラム。
【請求項８】
正常データが記憶された記憶部と、
前記記憶部から前記正常データを取得する取得部と、
前記正常データの全ての値を異常値に置き換えた異常データを作成する異常データ作成部と、
前記異常データの所定の箇所を前記正常データに復元してテストデータを作成する際に、前記テストデータを作成する度に復元する前記箇所を増やすテストデータ作成部と、を有するテストデータ作成装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ファジングにおけるテストデータを作成するテストデータ作成方法、テストデータ作成プログラム、テストデータ作成装置に関する。
【背景技術】
【０００２】
近年、ファジングと呼ばれるソフトウェアの脆弱性を検出するためのテスト手法が知られている。ファジングとは、テスト対象プログラムに何種類もの予測不可能なテストデータを与えることで意図的に例外を発生させ、その例外の挙動を確認するという方法である。
【０００３】
ファジングのひとつの手法として、例えば正常なテストデータを部分的に変異させた何種類もの異常なテストデータを生成し、異常なテストデータをテスト対象プログラムに与える方法が知られている。また例えばソフトウェアの機能別に上述のファジングを行う方法が知られている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００９−１１６８４７号公報
【非特許文献】
【０００５】
【非特許文献１】ファジング:ブルートフォースによる脆弱性発見手法，著者：MichaelSutton,Adam Greene,Pedram Amini,園田道夫,(株)ドキュメントシステム,伊藤裕之  出版社：毎日コミュニケーションズ
【発明の概要】
【発明が解決しようとする課題】
【０００６】
前記背景技術で述べた方法では、ソフトウェアの脆弱性を検出するまでに必要となるテストの回数が膨大になりやすい。
【０００７】
本発明の一実施例では、ソフトウェアの脆弱性の検出に必要なテスト回数を減らすことが可能なテストデータ作成方法、テストデータ作成プログラム及びテストデータ作成装置を提供することを目的としている。
【課題を解決するための手段】
【０００８】
開示の一実施例は、テストデータを作成するテストデータ作成方法であって、該コンピュータが、記憶部から正常データを取得し、前記正常データの全ての値を異常値に置き換えた異常データを作成し、前記異常データの所定の箇所を前記正常データに復元して前記テストデータを作成する際に、前記テストデータを作成する度に復元する前記箇所を増やす方法に関する。
【０００９】
上記手順を実行するプログラム、上記手順を実現する機能部を有する装置とすることもできる。
【発明の効果】
【００１０】
ソフトウェアの脆弱性の検出に必要なテストの回数を減らすことができる。
【図面の簡単な説明】
【００１１】
【図１】第１の実施例の概要を説明する図である。
【図２】第１の実施例のテストデータ作成装置のハードウェア構成の一例を示す図である。
【図３】第１の実施例のテストデータ作成装置の機能構成の例を説明する図である。
【図４】第１の実施例のテスト情報保存部に保存されたテスト情報の一例を示す図である。
【図５】第１の実施例の正常ファイル保存部に保存された正常ファイルの一例を示す図である。
【図６】第１の実施例のテストデータ作成装置の動作を説明するフローチャートである。
【図７】第１の実施例の次テストファイル作成部によるテストファイルの作成を具体的に説明する図である。
【図８】第１の実施例のテスト結果保存部に保存されたテスト結果の一例を示す図である。
【図９】第１の実施例の効果を説明するための第１の比較例を説明する図である。
【図１０】第２の実施例のテスト情報保存部に保存されたテスト情報の例を示す図である。
【図１１】第２の実施例のテストデータ作成装置の動作を説明するフローチャートである。
【図１２】第２の実施例の次テストファイル作成部によるテストファイルの作成を具体的に説明する図である。
【図１３】第２の実施例のテスト結果保存部に保存されたテスト結果の一例を示す図である。
【発明を実施するための形態】
【００１２】
（第１の実施例）
以下に図面を参照して第１の実施例について説明する。図１は、第１の実施例の概要を説明する図である。
【００１３】
本実施例のテストデータ作成装置１００は、ファジングを用いたテスト対象プログラムのテストにおいて使用するテストデータを作成する。ファジングとは、テスト対象プログラムに何種類もの予測不可能なテストデータを与えることで意図的に例外を発生させ、その例外の挙動を確認する方法である。
【００１４】
本実施例のテストデータ作成装置１００は、正常テストデータの全ての値を予め与えられた異常値に置き換えた後に、徐々に正常テストデータに復元するように複数パターンの異常テストデータを作成する。具体的には本実施例のテストデータ作成装置１００は、正常テストデータの全ての値を予め与えられた異常値に置き換えた異常テストデータを作成する。そしてテストデータ作成装置１００は、異常テストデータにおいて正常テストデータの対応する箇所の値（以下、正常値）に置き換える箇所を増やしながら複数パターンの異常テストデータを作成する。
【００１５】
正常テストデータは、例えばテスト対象プログラムに入力される入力データとして予め得られるデータである。異常テストデータは、テスト対象プログラムに与えられ、テスト対象プログラムが実行される。
【００１６】
図１の例では、異常値を正常値へ置き換える際の単位データを４バイトとし、正常値へ置き換えられる箇所を増やしながら異常テストデータを作成する。異常テストデータ１１は、先頭から４バイト目までの箇所１の値が正常テストデータ１０において箇所１と対応する箇所の値と置き換えられており、５バイト目以降の値が全て異常値（0xFFFFFFFF）である。
【００１７】
異常テストデータ１２は、先頭から２バイト目から５バイト目までの箇所２の値が、正常テストデータ１０において箇所２と対応する箇所の値と置き換えられており、６バイト目以降の値が全て異常値である。また異常テストデータ１２では、先頭の値も正常テストデータ１０の対応する箇所の値と置き換えられている。
【００１８】
異常テストデータＭは、先頭から９バイト目から１２バイト目までの箇所ｍの値が正常テストデータ１０において対応する箇所の値と置き換えられており、１３バイト目以降の値が全て異常値である。また異常テストデータＭでは、先頭から箇所ｍまでの値も正常テストデータ１０の対応する箇所の値に置き換えられている。
【００１９】
すなわち本実施例では、異常テストデータにおいて正常値に置き換えられる箇所を、異常テストデータの先頭から単位データ毎に１バイトずつずらす。また本実施例では、テストデータを作成する度に、異常テストデータの先頭から単位データの最後の値までの異常値を正常値と置き換える。
【００２０】
単位データの先頭の位置は、後述するように異常テストデータが作成される度にインクリメントされて記憶される。本実施例のテストデータ作成装置１００では、単位データの先頭を異常テストデータの先頭から順次ずらし、且つ単位データの先頭の位置を記憶することで、異常テストデータがどの箇所まで正常値に置き換えられているか判断することが可能となる。また本実施例では、異常テストデータの先頭から単位データの最後の値までの異常値を正常値に置き換えることで、異常テストデータを徐々に正常テストデータに近づけるように復元できる。
【００２１】
ところで通常のプログラムは、異常値が含まれる割合の高いデータが入力された場合に実行を拒否するチェック機能を有している。したがって本実施例でも、異常値が含まれる割合が高い異常テストデータが入力された場合、テスト対象プログラムは実行されず、テスト対象プログラムに含まれる脆弱なコードに到達しない。
【００２２】
本実施例はこのプログラムのチェック機能に着目したものであり、全て異常値の異常データを１バイトずつ正常値に復元した異常テストデータを、順次テスト対象プログラムに入力する。本実施例では、異常テストデータの入力を開始した後にテスト対象プログラムが実行されたとき、テスト対象プログラムの処理がテスト対象プログラムに含まれる脆弱なコードに到達したものとする。
【００２３】
テスト対象プログラムにおいて脆弱なコードが実行されると、テスト結果がエラーとなる。本実施例では、このテスト結果に基づき、テスト対象プログラムに潜む脆弱性を検出する。本実施例では、例えばテスト対象プログラムが実行され且つ実行結果がエラーとなった場合に、脆弱性が有ると判断する。
【００２４】
図１の例では、異常テストデータ１１と異常テストデータ１２は、テスト対象プログラムのチェック機能により、異常値が含まれる割合が高い異常テストデータと判断される。よってテスト対象プログラムは、異常テストデータ１１と異常テストデータ１２が入力された場合は実行されない。
【００２５】
異常テストデータＭは、異常テストデータ１２よりも正常テストデータに近くなるように復元されている。このため異常テストデータＭは、異常値が含まれる割合が高い異常テストデータと判断されず、テスト対象プログラムは異常テストデータＭが入力された場合実行される。しかし異常テストデータＭでは、正常データ１０に含まれるオフセットの値が異常値であるため、テスト対象プログラムの実行結果はエラーとなる。すなわちテスト結果はエラーとなる。
【００２６】
よって本実施例では、異常テストデータＭを入力してテスト対象プログラムを実行したとき、テスト対象プログラムの処理がテスト対象プログラムに含まれる脆弱なコードに到達したものと判断される。そして本実施例では、テスト結果がエラーであるため、テスト対象プログラムは脆弱性を有すると判断される。
【００２７】
本実施例では、例えば正常テストデータ１０のようにオフセットを複数含む場合において、上記の手法でテストデータを作成することで、テスト対象プログラムの処理が脆弱なコードに到達するまでのテストの回数を減らすことができる。すなわち本実施例では、テスト対象プログラムの脆弱性の有無を検出するためのテストの回数を減らすことができる。
【００２８】
また本実施例では、正常テストデータに整数値や文字列、条件値、オフセット等が複数存在する場合に、テスト対象プログラムの処理が脆弱なコードに到達するまでのテストの回数を減らすことができる。
【００２９】
また本実施例における脆弱なコードとは、例えば入力データによってはバッファオーバーフローを引き起こすコードや、プログラムの実行を停止させるコード等である。
【００３０】
以下に本実施例のテストデータ作成装置１００について説明する。図２は、第１の実施例のテストデータ作成装置のハードウェア構成の一例を示す図である。
【００３１】
図２において、テストデータ作成装置１００は、コンピュータによって制御される装置であって、ＣＰＵ（Central Processing Unit）２１と、メモリユニット２２と、表示ユニット２３と、入力ユニット２４と、記憶装置２５と、ドライバ装置２６と、通信ユニット２７とを含む。テストデータ作成装置１００において、ＣＰＵ２１と各ユニット、各装置は、システムバスＢにより接続される。
【００３２】
ＣＰＵ２１は、メモリユニット１２に格納されたプログラムに従ってテストデータ作成装置１００を制御する。メモリユニット２２は、ＲＡＭ（Random Access Memory）及びＲＯＭ（Read-Only Memory）等を有し、ＣＰＵ２１にて実行されるプログラム、ＣＰＵ２１での処理に必要なデータ、ＣＰＵ２１での処理にて得られたデータ等を格納する。またメモリユニット１２の一部の領域は、ＣＰＵ２１での処理に利用されるワークエリアとして割り付けられている。
【００３３】
表示ユニット２３は、ＣＰＵ２１の制御のもとに必要な各種情報を表示する。入力ユニット２４は、マウス、キーボード等を有し、利用者がテストデータ作成装置１００が処理を行なうための必要な各種情報を入力するために用いられる。
【００３４】
記憶装置２５は、例えば、ハードディスクユニットにより実現され、各種処理を実行するプログラム等のデータを格納する。
【００３５】
テストデータ作成装置１００によって行われる方法での処理を実現するプログラムは、例えば、ＣＤ−ＲＯＭ（Compact Disk Read-Only Memory）等の記憶媒体１８によってテストデータ作成装置１００に提供される。即ち、プログラムが保存された記憶媒体２８がドライバ装置２６にセットされると、ドライバ装置２６が記憶媒体２８からプログラムを読み出し、その読み出されたプログラムがシステムバスＢを介して記憶装置２５にインストールされる。そして、プログラムが起動されると、記憶装置２５にインストールされたプログラムに従ってＣＰＵ２１が処理を開始する。
【００３６】
尚、プログラムを格納する媒体としてＣＤ−ＲＯＭに限定するものではなく、コンピュータが読み取り可能な媒体であればよい。テストデータ作成装置１００が外部とのネットワーク通信を行う場合には、テストデータ作成装置１００による処理を実現するプログラムを通信ユニット２７によってネットワークを介してダウンロードし、記憶装置２５にインストールするようにしても良い。また、テストデータ作成装置１００が外部記憶装置との接続を行うＵＳＢ（Universal Serial Bus）等のインタフェースを有する場合には、ＵＳＢ接続によって外部記憶媒体からプログラムを読み込んでもよい。
【００３７】
図３は、第１の実施例のテストデータ作成装置の機能構成の例を説明する図である。
【００３８】
本実施例では、例えばテスト対象プログラムを画像ビューアアプリケーションとし、テスト対象プログラムに入力されるテストデータを画像ファイル（以下、テストファイル）として説明する。
【００３９】
本実施例のテストデータ作成装置１００は、テスト実行部１１０、次テストデータ作成部１２０、テスト対象監視部１３０、テスト結果記録部１４０、記憶部１５０を有する。上記各部の機能は、メモリユニット２２に格納されたテストデータ作成プログラムがＣＰＵ２１を動作させることで実現される。
【００４０】
テスト実行部１１０は、次テストファイル作成部１２０により作成されたテストファイルをテスト対象プログラムＰ１に入力データとして与え、テスト対象プログラムＰ１を実行させる。次テストファイル作成部１２０は、テスト対象プログラムＰ１の入力データとなるテストファイルを作成する。次テストファイル作成部１２０の詳細は後述する。
【００４１】
テスト対象監視部１３０は、テストファイルを入力データとしてテスト対象プログラムＰ１を実行したときのテスト対象プログラムＰ１の挙動を監視する。またテスト対象監視部１３０は、テスト対象プログラムＰ１の出力結果を解析する。本実施例のテスト対象監視部１３０は、例えばテストデータ作成装置１００にインストールされたＯＳ（Operating System）の機能の一部であっても良い。テスト対象監視部１３０は、監視の結果や解析の結果をテスト結果記録部１４０へ渡す。
【００４２】
テスト結果記録部１４０は、テスト対象監視部１３０から渡されたテスト結果を後述するテスト結果保存部１５３に保存する。
【００４３】
尚テスト対象プログラムＰ１は、テストデータ作成装置１００に予めインストールされていても良い。
【００４４】
またテスト対象プログラムＰ１は、例えばテストデータ作成装置１００以外の外部装置にインストールされていても良い。この場合テスト対象監視部１３０も外部装置に含まれていても良い。この場合テストデータ作成装置１００は、外部装置と適切な方法で接続されており、テスト実行部１１０から外部装置へテストファイルが送信され、テスト結果記録部１４０が外部装置からテスト結果を受信しても良い。
【００４５】
またテストデータ作成装置１００は、外部装置からテスト対象プログラムＰ１をダウンロードしても良い。さらにテストデータ作成装置１００は、テスト対象プログラムＰ１が記憶媒体に記憶されている場合には、この記憶媒体からテスト対象プログラムＰ１を読み出してインストールしても良い。
【００４６】
記憶部１５０は、例えばメモリユニット２２内に設けられている。記憶部１５０は、テスト情報保存部１５１、正常ファイル保存部１５２、テスト結果保存部１５３を有する。テスト情報保存部１５１は、テスト情報が保存された記憶領域である。正常ファイル保存部１５２は、正常ファイルが保存された記憶領域である。テスト結果保存部１５３は、テスト結果が保存された記憶領域である。
【００４７】
以下に、次テストファイル作成部１２０の詳細を説明する。正常ファイル取得部１２１、異常ファイル作成部１２２、テストファイル作成部１２３、テスト情報書換部１２４を有する。正常ファイル取得部１２１は、記憶部１５０の正常ファイル保存部１５２から正常ファイルを取得する。
【００４８】
異常ファイル作成部１２２は、テスト情報保存部１５１に保存されたテスト情報を取得し、正常ファイルに基づき異常ファイルを作成する。テストファイル作成部１２３は、異常ファイルを基に、次に実行されるテスト対象プログラムＰ１のテストに使用するテストファイルを作成する。作成されたテストファイルは、テスト実行部１１０を介してテスト対象プログラムＰ１へ入力される。テスト情報書換部１２４は、テストファイル作成後にテスト情報を書き換える。次テストファイル作成部１２０によるテストファイルの作成の詳細は後述する。
【００４９】
以下に図４を参照してテスト情報保存部１５１に保存されたテスト情報について説明する。図４は、第１の実施例のテスト情報保存部に保存されたテスト情報の一例を示す図である。
【００５０】
図４に示すテスト情報４０Ａには、テスト対象プログラムのパス、正常ファイルのパス、正常ファイルの長さ、異常データのリスト、次テストの復元済み箇所が含まれる。
【００５１】
異常データのリストとは、異常データの種類を示す。本実施例では、異常データの種類は１種類とした。次テストの復元済みの箇所とは、次にテストファイルを作成する際に、異常ファイルにおいて正常ファイルの値と置き換え始める箇所を示す。言い換えれば本実施例の次テストの復元済みの箇所は、異常ファイルにおける単位データの先頭の位置を示す値である。尚このとき異常ファイルでは、次テストの復元済みの箇所までは正常ファイルの値に置き換えられ、復元されることを前提とする。
【００５２】
図４では、テスト対象プログラムのパスを「C:\\target\\SampleViewer.exe」とし、正常ファイルのパスを「C:\\target\\sample.jpg」とした。また図４では、正常ファイルの長さを「５６３４」とし、異常データのリストを「0xffff」、次テストの復元済みの箇所を「１」とした。尚図４に示すテスト情報４０Ａは、テストデータ作成開始時の初期状態を示している。テスト情報４０Ａでは、テストデータが作成される度に、次テストの復元済みの箇所の値が書き換えられる。
【００５３】
次に図５を参照して正常ファイル保存部１５２に保存された正常ファイルについて説明する。図５は、第１の実施例の正常ファイル保存部に保存された正常ファイルの一例を示す図である。
【００５４】
図５に示す正常ファイル５０は、テスト対象プログラムＰ１の入力データとして予め与えられたデータである。本実施例の正常ファイル５０では、２つの離れた箇所にある２バイトのフィールドが連結されることで、４バイトのオフセットとして解釈されるものとした。図５では、２箇所に分けられたオフセットをそれぞれオフセット１、オフセット２とした。尚正常ファイル５０は、正常ファイル５０がテスト対象プログラムＰ１に与えられたとき、テスト対象プログラムＰ１が予測された動作をすることが予め判明しているデータであれば良い。また本実施例では、オフセットが２箇所に分けられたものとしたが、これに限定されない。オフセットは３箇所以上に分けられていても良い。
【００５５】
次に図６を参照して本実施例のテストデータ作成装置１００の動作を説明する。図６は、第１の実施例のテストデータ作成装置の動作を説明するフローチャートである。
【００５６】
本実施例のテストデータ作成装置１００において、テスト対象プログラムＰ１のテスト開始が指示されると、異常ファイルの最後のバイトまで正常値に復元したか否かを判断する（ステップＳ６０１）。具体的にはテストデータ作成装置１００は、次テストファイル作成部１２０により、テスト情報保存部１５１に保存されたテスト情報から、正常ファイルの長さの値と次テストの復元済みの箇所の値を取得する。次に次テストファイル作成部１２０は、取得した正常ファイルの長さの値より、次テストの復元済みの箇所の値の方が大きいか否かを判断する。次テストの復元済みの箇所の値が正常ファイルの長さの値以下である場合、次テストファイル作成部１２０は、異常ファイルの最後のバイトまで正常値に復元されていないと判断する。
【００５７】
正常ファイルの長さの値よりも、次テストの復元済みの箇所の値の方が大きい場合、次テストファイル作成部１２０は、異常ファイルの最後のバイトまで正常値に復元されたと判断し、処理を終了する。
【００５８】
ステップＳ６０１において異常ファイルの最後のバイトまで正常値に復元されていないと判断された場合、次テストファイル作成部１２０は、正常ファイル取得部１２１により正常ファイルを取得する（ステップＳ６０２）。具体的には次テストファイル作成部１２０は、テスト情報保存部１５１に保存されたテスト情報４０Ａから正常ファイルのパスを取得し、正常ファイル保存部１５２に保存された正常ファイル５０を取得する。
【００５９】
続いて次テストファイル作成部１２０は、異常ファイル作成部１２２により、異常ファイルを作成する（ステップＳ６０３）。具体的には異常ファイル作成部１２２は、テスト情報４０Ａの異常データのリストから異常データを取得する。そして異常ファイル作成部１２２は、取得した正常ファイル５０の長さを基に、正常ファイル５０の先頭から最後まで異常データで埋め尽くされた同じ長さのファイルを作成し、異常ファイルとする。
【００６０】
尚本実施例では、例えば正常ファイル５０の長さが異常データのバイト数の整数倍でない場合、正常ファイル５０の長さを超える部分は捨てる。また異常データのバイトオーダは、ビッグエンディアンやリトルエンディアン等のどのような方式でもよいが、方式が予め決められているものとした。
【００６１】
続いて次テストファイル作成部１２０は、テストファイル作成部１２３により、次のテストで用いられるテストファイルを作成する（ステップＳ６０４）。具体的にテストファイル作成部１２３は、テスト情報４０Ａから次テストの復元済みの箇所の値を取得する。そしてテストファイル作成部１２３は、作成された異常ファイルに対し、先頭から次テストの復元済みの箇所までを正常ファイルの内容に置き換える。さらにテストファイル作成部１２３は、次テストの復元済みの箇所の値から所定バイトを正常ファイルの対応箇所の内容に置き換え、テストファイルとする。
【００６２】
続いて次テストファイル作成部１２０は、テスト情報書換部１２４により、テスト情報４０Ａの書き換えを行う（ステップＳ６０５）。具体的にはテスト情報書換部１２４は、テスト情報４０Ａの次テストの復元済みの箇所の値をインクリメントする。次テストの復元済みの箇所の値をインクリメントすることで、次にテストファイルを作成する際に、正常値と置き換えられる箇所を増やすようにテストファイルを作成することができる。
【００６３】
続いてテストデータ作成装置１００は、テスト実行部１１０により、次テストファイル作成部１２０により作成されたテストファイルをテスト対象プログラムＰ１に与え、テスト対象プログラムＰ１を実行させる（ステップＳ６０６）。続いてテストデータ作成装置１００は、テスト対象監視部１３０によりテスト対象プログラムＰ１の挙動を監視し、テスト結果記録部１４０によりテスト結果をテスト結果保存部１５３へ保存する（ステップＳ６０７）。
【００６４】
以下に図７を参照して本実施例の次テストファイル作成部１２０によるテストファイルの作成について具体的に説明する。
【００６５】
図７は、第１の実施例の次テストファイル作成部によるテストファイルの作成を具体的に説明する図である。図７の例では、単位データを４バイトとし、異常ファイルにおいて正常データに復元される箇所を１バイトずつ広げ、正常ファイル５０に近づける場合を示している。尚本実施例では単位データを４バイトとしたが、これに限定されない。本実施例では、例えば単位データを３バイトとして正常ファイル５０に復元しても良いし、単位データを５バイトとして正常ファイル５０に復元しても良い。
【００６６】
図７に示す異常ファイル７０は、異常ファイル作成部１２２により作成されるものであり、全ての値がテスト情報４０Ａの異常データのリストに含まれる異常データに置き換えられている。
【００６７】
本実施例のテストファイル作成部１２３は、異常ファイル７０を基に、テストファイルを作成する。テストファイル作成部１２３は、テスト情報４０Ａの次テストの復元済みの箇所を参照する。このとき次テストの復元済みの箇所の値は１である。箇所の値は、単位データの先頭が異常ファイルの先頭からの何バイト目かを示す値である。よってテストファイル作成部１２３は、異常ファイル７０の先頭（１バイト目）から４バイト目までの値を正常ファイル５０の先頭から４バイト目までの値に置き換えたテストファイルＴＦ１を作成する。
【００６８】
テストファイルＴＦ１を作成すると、次テストファイル作成部１２０は、テスト情報書換部１２４により、次テストの復元済みの箇所の値をインクリメントする。
【００６９】
テストファイルＴＦ１は、テスト実行部１１０に渡され、テスト対象プログラムＰ１の入力データとなる。
【００７０】
続いて次テストファイル作成部１２０は、次テストの復元済みの箇所の値と正常ファイルの長さの値とを比較する。正常ファイルの長さの値は５６３４であり、次テストの復元済みの箇所の値は２である。よって次テストファイル作成部１２０は、異常ファイル７０の最後のバイトまで正常ファイルの値に復元されていないと判断し、次のテストファイルの作成を開始する。
【００７１】
テストファイル作成部１２３は、テスト情報４０Ａの次テストの復元済みの箇所を参照する。このとき次テストの復元済みの箇所の値はインクリメントされているため、２である。よってテストファイル作成部１２３は、異常ファイル７０の２バイト目から５バイト目までの値を正常ファイル５０の２バイト目から５バイト目までの値に置き換えたテストファイルＴＦ２を作成する。
【００７２】
尚テストファイル作成部１２３は、異常ファイル７０の先頭から次テストの復元済みの箇所までの値も正常ファイルの値に置き換える。よってテストファイルＴＦ２では、異常ファイル７０の先頭から５バイト目までが正常ファイル５０の先頭から５バイト目の値に置き換えられている。テストファイルＴＦ２は、テスト対象プログラムＰ１の入力データとなる。
【００７３】
同様に作成されたテストファイルＴＦＭは、異常ファイルの先頭からオフセット１までの値とオフセット１の一部の値と、が正常ファイルの対応する箇所の値に置き換えられている。
【００７４】
以上のようにテストファイル作成部１２３は、テストファイルＴＦ１，ＴＦ２，・・・，ＴＦＭ，・・・，ＴＦＮを順次作する。テスト実行部１１０はテストファイルが作成される度にテストファイルをテスト対象プログラムＰ１に与えてテストを実行する。ここでＮ＝正常ファイルの長さである。
【００７５】
作成されたテストファイルは順次テスト対象プログラムＰ１に入力されるが、テスト対象プログラムＰ１は、異常データの割合が高いテストファイルが入力された際はチェック機能により実行を拒否する。例えばテストファイルＴＦ１、ＴＦ２がテスト対象プログラムＰ１に入力された場合、テスト対象プログラムＰ１はテストファイルに含まれる異常データの割合が高いと判断し、実行を拒否する。
【００７６】
これに対し、テストファイルＴＦＭがテスト対象プログラムＰ１に入力された場合、正常ファイルの値と置き換えられた箇所が増えたため、チェック機能によるチェックを通過しテスト対象プログラムＰ１が実行される。
【００７７】
本実施例では、例えばテスト対象プログラムＰ１が実行され、且つテスト対象監視部１４０によりテスト結果にエラーが検出されたとき、テスト対象プログラムＰ１に含まれる脆弱なコードに到達し、脆弱なコードが実行されたものと判断する。
【００７８】
図７の例では、テストファイルＴＦＭがテスト対象プログラムＰ１に入力されると、テスト対象プログラムＰ１は実行され、且つテスト結果はエラーとなる。したがって図７の例では、テストファイルＴＦＭが入力されたとき、テスト対象プログラムＰ１の処理がテスト対象プログラムＰ１に含まれる脆弱なコードに到達したことになる。尚エラーとは、例えばテスト対象プログラムＰ１が予測される振る舞いとは異なる振る舞いをすることである。
【００７９】
図８は、第１の実施例のテスト結果保存部に保存されたテスト結果の一例を示す図である。
【００８０】
図８に示すテスト結果８０には、テストファイルの番号、テストファイルの作成に用いられた異常データの値、復元済みのオフセット、テスト結果が含まれる。
【００８１】
テストファイルＴＦ１を入力データとしてテスト対象プログラムＰ１を実行した場合、テストファイルの番号はＴＦ１、異常データの値はテスト情報４０Ａから取得した0xffffとなる。また復元済みオフセットは、テストファイルＴＦ１ではオフセット１もオフセット２も復元されていないため、「なし」となる。テスト結果は、「問題なし」となる。テストファイルＴＦ１に対するテスト結果は、テスト対象プログラムＰ１の実行の拒否であるが、これはテスト対象プログラムＰ１の動作として予測される動作であるため、「問題なし」とされる。
【００８２】
テストファイルＴＦＭを入力データとしてテスト対象プログラムＰ１を実行した場合、テストファイルの番号はＴＦＭ、異常データの値はテスト情報４０Ａから取得した0xffffとなる。また復元済みオフセットは、テストファイルＴＦＭではオフセット１の一部が復元されているため「１」、テスト結果は、「例外発生」となる。テストファイルＴＦＭに対するテスト結果は、テスト対象プログラムＰ１は実行されたもののエラーが発生したため、テスト対象プログラムＰ１の動作として予測されない動作をしたと判断され、「例外発生」となる。
【００８３】
テストファイルＴＦＮは、次テストファイル作成部１２０により最後に作成されるテストファイルである。テストファイルＴＦＮでは、異常ファイルの最後のバイト以外が正常ファイルの値に置き換えられたものである。よって復元済みオフセットはオフセット１、２となる。またテストファイルＦＴＮでは殆どが正常ファイル５０と置き換えられているため、テスト対象プログラムＰ１の実行結果は「問題なし」となる。
【００８４】
尚本実施例では、Ｎは、テストファイル作成部１２０により作成されるテストファイルの数となる。本実施例では、Ｎ＝正常ファイル５０の長さの値となる。本実施例では正常ファイル５０の長さは５６３４である。よって本実施例では、次テストファイル作成部１２０により最後に作成されるテストファイルの数は、５６３４個となる。
【００８５】
すなわち本実施例では、テストファイル数は正常ファイルの長さと同数であり、正常ファイルに含まれるオフセットの数に依存しない。
【００８６】
以下に図９を参照して、本実施例の効果を説明する。図９は、第１の実施例の効果を説明するための第１の比較例を説明する図である。
【００８７】
図９では正常ファイル５０の値を先頭から４バイト単位で異常データに置き換える例を示している。図９では、正常ファイル５０に含まれる２箇所のオフセット１とオフセット２の両方又は一部が異常データとなったとき、テスト結果がエラーとなるものとして説明する。
【００８８】
図９において、テストファイル９１−１は正常ファイル５０の先頭から４バイト目までが異常データに置き換えられたものである。テストファイル９１−２では、先頭から５バイト目までが異常データに置き換えられたものである。テストファイル９１−２は、テストファイル９１−１の次のテストでテスト対象プログラムＰ１に入力されるテストファイルである。
【００８９】
テストファイル９２−１は、正常ファイルの２バイト目から５バイト目までを異常データに置き換えたものである。テストファイル９２−２は、テストファイル９２−１の次のテストでテスト対象プログラムＰ１に入力されるテストファイルである。テストファイル９２−２では、２バイト目から６バイト目までが異常データに置き換えられたものである。
【００９０】
図９の例では、このようにして異常データを含むテストファイルを作成する。この方法では、オフセット１とオフセット２に起因する脆弱性を検出するために必要なテストファイルの数は、オフセット１のファイル中の箇所×オフセット２のファイル中の箇所となる。
【００９１】
この場合に、例えばオフセット１とオフセット２が、正常ファイル５０の最後に位置すると仮定すると、テストファイルの数は、正常ファイルの長さの２乗となる。
【００９２】
また、正常ファイルにオフセットがｎ箇所にあった場合には、テストファイルの数は、正常ファイルの長さのｎ乗となり、テストファイル数が膨大となる。
【００９３】
これに対し、本実施例では、全ての値が異常値に置き換えられた異常ファイルを正常ファイルに復元していくため、オフセット１とオフセット２は最初から脆弱性を引き起こす異常データとなっている。したがって本実施例では、必要なテストファイル数はオフセットの数に依存せず、正常ファイルの長さとなる。
【００９４】
よって本実施例では、例えばテストファイルにオフセットや整数値、条件値等が複数含まれる場合に、脆弱なコードに到達するまでのテストファイルの数を大幅に減らすことができ、テスト回数を減らすことができる。また本実施例では、テスト情報の正常ファイルの長さから、作成されるテストファイルの数を求めることができる。
【００９５】
（第２の実施例）
以下に図面を参照して第２の実施例について説明する。第２の実施例は、異常データが複数存在する場合の例である。以下の第２の実施例の説明では、第１の実施例と同様の機能を有するものには第１の実施例の説明で用いた符号と同様の符号を付与し、その説明を省略する。
【００９６】
図１０は、第２の実施例のテスト情報保存部に保存されたテスト情報の例を示す図である。
【００９７】
図１０に示すテスト情報４０Ｂには、テスト対象プログラムのパス、正常ファイルのパス、正常ファイルの長さ、異常データのリスト、異常データの数、次テストの復元済み箇所、次テストの異常データの番号が含まれる。
【００９８】
異常データのリストは異常データの種類を示し、異常データの数は異常データのリストに含まれる異常データの数である。本実施例では、異常データの種類は２種類であるため、異常データの数は２である。
【００９９】
次テストの異常データの番号は、次のテストで使用される異常データの番号である。本実施例では、例えば異常データ１である0xffffを異常データとしてテストファイルを作成し、次に異常データ２である0x7fffを異常データとしてテストファイルを作成する。次テストの異常データの番号は、異常データとして用いる値に対応した番号となるようにテスト情報書換部１２４により書き換えられる。
【０１００】
尚本実施例では、異常データを0xffffと0x7fffの２種類としたが、これに限定されるものでなく、他の値であっても良い。また異常データの数も、任意であって良い。また図１１に示すテスト情報４０Ｂは、テストデータ作成開始時の初期状態を示している。
【０１０１】
以下に図１１を参照して本実施例のテストデータ作成装置１００の動作を説明する。図１１は、第２の実施例のテストデータ作成装置の動作を説明するフローチャートである。
【０１０２】
本実施例のテストデータ作成装置１００において、テスト対象プログラムＰ１のテスト開始が指示されると、異常ファイルの最後のバイトまで正常値に復元したか否かを判断する（ステップＳ１１０１）。ステップＳ１０１１において最後のバイトまで復元した場合、テストデータ作成装置１００は、処理を終了する。
【０１０３】
ステップＳ１１０１において最後のバイトまで復元されていない場合、次テストファイル作成部１２０は、テスト情報書換部１２４によりテスト情報４０Ｂの次テストの異常データの番号を１にする（ステップＳ１１０２）。
【０１０４】
続いて次テストファイル作成部１２０は、テスト情報４０Ｂの異常データのリストに含まれる全ての異常データを用いてテスト対象プログラムＰ１のテストを行ったか否かを判断する（ステップＳ１１０３）。具体的には次テストファイル作成部１２０は、テスト情報４０Ｂから異常データの数の値と次テストの異常データの番号の値を取得する。そして異常データの数の値が次テストの異常データの番号以上であれば、現在の復元済みの箇所において全ての異常データを用いたテストが完了したと判断する。
【０１０５】
ステップＳ１１０３において全ての異常データを用いたテストが完了した場合、ステップＳ１１１０へ進む。ステップＳ１１１０の処理は、図６のステップＳ６０５の処理と同様であるから説明を省略する。
【０１０６】
ステップＳ１１０３において全ての異常データを用いたテストが完了していないと判断された場合、次テストファイル作成部１２０は、正常ファイル取得部１２１により正常ファイル５０を取得する（ステップＳ１１０４）。
【０１０７】
ステップＳ１１０４〜ステップＳ１１０６までの処理は、図６のステップＳ６０２〜ステップＳ６０４までの処理と同様であるから説明を省略する。
【０１０８】
続いてテスト情報書換部１２４は、テスト情報４０Ｂの次テストの異常データの番号の値をインクリメントする（ステップＳ１１０５）。
【０１０９】
ステップＳ１１０８とステップＳ１１０９の処理は、図６のステップＳ６０６とステップＳ６０７の処理と同様であるから説明を省略する。
【０１１０】
ステップＳ１１０９においてテスト結果記録部１４０がテスト結果をテスト結果保存部１５３に記録すると、次テストファイル作成部１２０はステップＳ１１０３へ戻る。
【０１１１】
本実施例では、以上のようにテストデータを作成し、テスト対象プログラムＰ１のテストを実行することで、同一の箇所で複数の異常データによるテストを実行した後に、次の箇所のテストを行う。
【０１１２】
以下に図１２を参照して本実施例の次テストファイル作成部１２０によるテストファイルの作成について具体的に説明する。
【０１１３】
図１２は、第２の実施例の次テストファイル作成部によるテストファイルの作成を具体的に説明する図である。
【０１１４】
図１２に示すテストファイルＴＦ１１は、異常データ１を用いた異常ファイルから作成されるテストファイルである。図１２の例では、単位データを４バイトとして正常ファイル５０に復元していく例であり、テストファイルＴＦ１１では、異常ファイルを先頭から４バイト目までを示す箇所１が正常ファイル５０の対応する値に置き換えられている。箇所１は、テスト情報４０Ｂにおける次テストの復元済みの箇所を示す。
【０１１５】
テストファイルＴＦ１２は、異常データ２を用いた異常ファイルから作成されるテストファイルである。テストファイルＴＦ１２は、テストファイルＴＦ１１の次に作成される。
【０１１６】
テストファイルＴＦ１２が作成されると、テスト情報４０Ｂの異常データのリストに含まれる全ての異常データを用いてテストファイルを作成したことになる。したがって次テスト情報書換部１２４は、テスト情報４０Ｂの次テストの復元済みの箇所の値をインクリメントして２とし、次テストの異常データの番号を１に戻す。
【０１１７】
続いて次テストファイル作成部１２０は、次テストの復元済みの箇所２、次テストの異常データの番号を１としたテスト情報４０Ｂに基づきテストファイルＴＦ１３を作成する。
テストファイルＴＦ１３は、異常データ１を用いた異常ファイルを２バイト目から５バイト目までを示す箇所２が正常ファイル５０の対応する値に置き換えられている。またテストファイルＴＦ１３では、異常ファイルの先頭のバイトも正常ファイルの値に置き換えられている。
【０１１８】
テストファイルＴＦ１４は、異常データ２を用いた異常ファイルから作成されるテストファイルである。テストファイルＴＦ１４は、テストファイルＴＦ１３の次に作成される。
【０１１９】
本実施例では、このようにテストファイルにおける同一の箇所を複数の異常データに置き換えてテストを実行できる。よって、例えばテストファイルにおいて異常データとする箇所に着目してテストを行う場合等に、テストファイルの数をより少なくすることができる。
【０１２０】
図１３は、第２の実施例のテスト結果保存部に保存されたテスト結果の一例を示す図である。
【０１２１】
図１３のテスト結果８１において、テストファイルＴＦ１１を入力データとしてテスト対象プログラムＰ１を実行した場合、テストファイルの番号はＴＦ１１、異常データの値はテスト情報４０Ｂから取得した番号１の異常データ0xffffとなる。また復元済みオフセットは、テストファイルＴＦ１１ではオフセット１もオフセット２も復元されていないため、「なし」となる。テスト結果は、「問題なし」となる。
【０１２２】
テストファイルＴＦ１２を入力データとしてテスト対象プログラムＰ１を実行した場合、テストファイルの番号はＴＦ１２、異常データの値はテスト情報４０Ｂから取得した番号２の異常データ0x7fffとなる。また復元済みオフセットは、テストファイルＴＦ１２ではオフセット１もオフセット２も復元されていないため、「なし」となる。テスト結果は、「問題なし」となる。
【０１２３】
またテストファイルＴＦＭ−１を入力データとしてテスト対象プログラムＰ１を実行した場合、テストファイルの番号はＴＦＭ−１、異常データの値はテスト情報４０Ｂから取得した番号１の異常データ0xffffとなる。テストファイルＴＦＭ−１ではオフセット１が復元されており、テスト結果は「問題なし」である。
【０１２４】
またテストファイルＴＦＭ−２を入力データとしてテスト対象プログラムＰ１を実行した場合、テストファイルの番号はＴＦＭ−２、異常データの値はテスト情報４０Ｂから取得した番号２の異常データ0x7fffとなる。テストファイルＴＦＭ２ではオフセット１が復元されており、テスト結果は「例外発生」である。この場合、異常データを0x7fffとすることで、テスト対象プログラムＰ１における脆弱なコードに到達したことになる。
【０１２５】
テストファイルＴＦＮ１を入力データとしてテスト対象プログラムＰ１を実行した場合、テストファイルの番号はＴＦＮ−１、異常データの値はテスト情報４０Ｂから取得した番号１の異常データ0xffffとなる。テストファイルＴＦＮ−１ではオフセット１とオフセット２が復元されており、テスト結果は「問題なし」である。
【０１２６】
テストファイルＴＦＮ２を入力データとしてテスト対象プログラムＰ１を実行した場合、テストファイルの番号はＴＦＮ−２、異常データの値はテスト情報４０Ｂから取得した番号２の異常データ0x7fffとなる。テストファイルＴＦＮ−２ではオフセット１とオフセット２が復元されており、テスト結果は「問題なし」である。
【０１２７】
本実施例では、Ｎ＝正常ファイル５０の長さの値である。よって本実施例の方法によりテストファイルを作成した場合、テストファイルの数は、正常ファイル５０におけるオフセットの数や箇所に依存せず、Ｎ（正常ファイルの長さ）×２（異常データの数）となる。
【０１２８】
これに対し、図９で説明した方法でテストファイルを作成すると、テストファイル数は、（異常データの数）×（オフセット１の正常ファイル中の箇所×オフセット２の正常ファイル中の箇所）２となる。
【０１２９】
すなわち図９の方法では、正常ファイル５０におけるオフセットの数や箇所に依存してテストファイル数が増える。図９方法では、例えばオフセットの数が多く、箇所が正常ファイルの後ろのバイトであるほどテストファイル数は増え、膨大な数となる。
【０１３０】
以上のように、本実施例の方法によりテストファイルを作成することで、テスト対象プログラムＰ１に含まれる脆弱なコードに到達するまでのテストファイル数を減らすことができる。すなわち本実施例ではテスト回数を減らすことができる。また本実施例では、テスト情報の正常ファイルの長さから、作成されるテストファイルの数を求めることができる。
【０１３１】
尚以上に説明した各実施例では、テストデータを作成する度にテストを実行するものとしたが、これに限定されない。例えばテストデータ作成装置は、先に全てのテストデータを作成してメモリユニットに保持しておき、テストを実行する際にメモリユニットからテストデータを読み出してテストを行っても良い。
【０１３２】
本発明の実施例は、以下に記載する付記が考えられる。
（付記１）
コンピュータがファジングにおけるテストデータを作成するテストデータ作成方法であって、該コンピュータが、
記憶部から正常データを取得し、
前記正常データの全ての値を異常値に置き換えた異常データを作成し、
前記異常データの所定の箇所を前記正常データに復元して前記テストデータを作成する際に、前記テストデータを作成する度に復元する前記箇所を増やすテストデータ作成方法。
（付記２）
該コンピュータは、
前記復元された前記箇所を示す値と複数の値を取り得る前記異常値とを含み、前記テストデータの作成に用いられるテスト情報を前記記憶部から取得し、
前記テスト情報に複数の前記異常値が含まれる場合に、前記正常データの全ての値をそれぞれの前記異常値に置き換えた異常データを作成する付記１記載のテストデータ作成方法。
（付記３）
前記テスト情報は、前記異常データを前記正常データへ復元する際の単位データの先頭の位置を示す値を含み、
該コンピュータが、
前記テストデータを作成する度に、前記単位データの先頭の位置を前記異常データの先頭からずらす付記２記載のテストデータ作成方法。
（付記４）
該コンピュータが、
前記異常データの先頭から前記単位データの最後の位置までを前記正常データに復元する付記３記載のテストデータ作成方法。
（付記５）
該コンピュータが、
前記テストデータを作成する度に前記テスト情報の前記単位データの先頭の位置を示す値をインクリメントさせる付記３又は４記載のテストデータ作成方法。
（付記６）
前記テスト情報は、前記正常データの長さを示す値を含み、
該コンピュータが、
前記単位データの先頭の位置を示す値が前記正常データの長さを示す値よりも大きくなるまで前記テストデータを作成する付記２乃至５の何れか一項に記載のテストデータ作成方法。
（付記７）
前記テスト情報に複数の前記異常値が含まれる場合に、
該コンピュータが、
前記正常データの全ての値を第１の異常値に置き変えた第１の異常データを作成し、前記テストデータを作成する度に前記第１の異常データにおける前記箇所を増やし、
次に前記正常データの全ての値を第２の異常値に置き変えた第２の異常データを作成し、前記テストデータを作成する度に前記第２の異常データにおける前記箇所を増やす付記２乃至５の何れか一項に記載のテストデータ作成方法。
（付記８）
前記テスト情報は、前記複数の前記異常値のリストと、前記リストにおける前記異常値の番号とを含み、
該コンピュータが、
前記正常データの全ての値を前記リストにおいて前記番号と対応した前記異常値に置き換える付記７記載のテストデータ作成方法。
（付記９）
該コンピュータが、
前記リストに含まれる全ての前記異常値に前記正常データの全ての値を置き換えた後に、前記単位データの先頭の位置を示す値をインクリメントさせる付記８記載のテストデータ作成方法。
（付記１０）
前記正常データは、
オフセットが複数箇所に存在する付記１乃至９の何れか一項に記載のテストデータ作成方法。
（付記１１）
記憶部から正常データを取得する処理と、
前記正常データの全ての値を異常値に置き換えた異常データを作成する処理と、
前記異常データの所定の箇所を前記正常データに復元して前記テストデータを作成する際に、前記テストデータを作成する度に復元する前記箇所を増やす処理と、をコンピュータに実行させるテストデータ作成プログラム。
（付記１２）
正常データが記憶された記憶部と、
前記記憶部から前記正常データを取得する取得部と、
前記正常データの全ての値を異常値に置き換えた異常データを作成する異常データ作成部と、
前記異常データの所定の箇所を前記正常データに復元して前記テストデータを作成する際に、前記テストデータを作成する度に復元される前記箇所を増やすテストデータ作成部と、を有するテストデータ作成装置。
【符号の説明】
【０１３３】
１００  テストデータ作成装置
１１０  テスト実行部
１２０  次テストファイル作成部
１２１  正常ファイル取得部
１２２  異常ファイル作成部
１２３  テストファイル作成部
１２４  テスト情報書換部
１３０  テスト対象監視部
１４０  テスト結果記録部
１５０  記憶部
１５１  テスト情報保存部
１５２  正常ファイル保存部
１５３  テスト結果保存部
【図１】
0005906855.tif 000002
【図２】
0005906855.tif 000003
【図３】
0005906855.tif 000004
【図４】
0005906855.tif 000005
【図５】
0005906855.tif 000006
【図６】
0005906855.tif 000007
【図７】
0005906855.tif 000008
【図８】
0005906855.tif 000009
【図９】
0005906855.tif 000010
【図１０】
0005906855.tif 000011
【図１１】
0005906855.tif 000012
【図１２】
0005906855.tif 000013
【図１３】
0005906855.tif 000014