(第1の実施例)
以下に図面を参照して第1の実施例について説明する。図1は、第1の実施例の概要を説明する図である。
本実施例のテストデータ作成装置100は、ファジングを用いたテスト対象プログラムのテストにおいて使用するテストデータを作成する。ファジングとは、テスト対象プログラムに何種類もの予測不可能なテストデータを与えることで意図的に例外を発生させ、その例外の挙動を確認する方法である。
本実施例のテストデータ作成装置100は、正常テストデータの全ての値を予め与えられた異常値に置き換えた後に、徐々に正常テストデータに復元するように複数パターンの異常テストデータを作成する。具体的には本実施例のテストデータ作成装置100は、正常テストデータの全ての値を予め与えられた異常値に置き換えた異常テストデータを作成する。そしてテストデータ作成装置100は、異常テストデータにおいて正常テストデータの対応する箇所の値(以下、正常値)に置き換える箇所を増やしながら複数パターンの異常テストデータを作成する。
正常テストデータは、例えばテスト対象プログラムに入力される入力データとして予め得られるデータである。異常テストデータは、テスト対象プログラムに与えられ、テスト対象プログラムが実行される。
図1の例では、異常値を正常値へ置き換える際の単位データを4バイトとし、正常値へ置き換えられる箇所を増やしながら異常テストデータを作成する。異常テストデータ11は、先頭から4バイト目までの箇所1の値が正常テストデータ10において箇所1と対応する箇所の値と置き換えられており、5バイト目以降の値が全て異常値(0xFFFFFFFF)である。
異常テストデータ12は、先頭から2バイト目から5バイト目までの箇所2の値が、正常テストデータ10において箇所2と対応する箇所の値と置き換えられており、6バイト目以降の値が全て異常値である。また異常テストデータ12では、先頭の値も正常テストデータ10の対応する箇所の値と置き換えられている。
異常テストデータMは、先頭から9バイト目から12バイト目までの箇所mの値が正常テストデータ10において対応する箇所の値と置き換えられており、13バイト目以降の値が全て異常値である。また異常テストデータMでは、先頭から箇所mまでの値も正常テストデータ10の対応する箇所の値に置き換えられている。
すなわち本実施例では、異常テストデータにおいて正常値に置き換えられる箇所を、異常テストデータの先頭から単位データ毎に1バイトずつずらす。また本実施例では、テストデータを作成する度に、異常テストデータの先頭から単位データの最後の値までの異常値を正常値と置き換える。
単位データの先頭の位置は、後述するように異常テストデータが作成される度にインクリメントされて記憶される。本実施例のテストデータ作成装置100では、単位データの先頭を異常テストデータの先頭から順次ずらし、且つ単位データの先頭の位置を記憶することで、異常テストデータがどの箇所まで正常値に置き換えられているか判断することが可能となる。また本実施例では、異常テストデータの先頭から単位データの最後の値までの異常値を正常値に置き換えることで、異常テストデータを徐々に正常テストデータに近づけるように復元できる。
ところで通常のプログラムは、異常値が含まれる割合の高いデータが入力された場合に実行を拒否するチェック機能を有している。したがって本実施例でも、異常値が含まれる割合が高い異常テストデータが入力された場合、テスト対象プログラムは実行されず、テスト対象プログラムに含まれる脆弱なコードに到達しない。
本実施例はこのプログラムのチェック機能に着目したものであり、全て異常値の異常データを1バイトずつ正常値に復元した異常テストデータを、順次テスト対象プログラムに入力する。本実施例では、異常テストデータの入力を開始した後にテスト対象プログラムが実行されたとき、テスト対象プログラムの処理がテスト対象プログラムに含まれる脆弱なコードに到達したものとする。
テスト対象プログラムにおいて脆弱なコードが実行されると、テスト結果がエラーとなる。本実施例では、このテスト結果に基づき、テスト対象プログラムに潜む脆弱性を検出する。本実施例では、例えばテスト対象プログラムが実行され且つ実行結果がエラーとなった場合に、脆弱性が有ると判断する。
図1の例では、異常テストデータ11と異常テストデータ12は、テスト対象プログラムのチェック機能により、異常値が含まれる割合が高い異常テストデータと判断される。よってテスト対象プログラムは、異常テストデータ11と異常テストデータ12が入力された場合は実行されない。
異常テストデータMは、異常テストデータ12よりも正常テストデータに近くなるように復元されている。このため異常テストデータMは、異常値が含まれる割合が高い異常テストデータと判断されず、テスト対象プログラムは異常テストデータMが入力された場合実行される。しかし異常テストデータMでは、正常データ10に含まれるオフセットの値が異常値であるため、テスト対象プログラムの実行結果はエラーとなる。すなわちテスト結果はエラーとなる。
よって本実施例では、異常テストデータMを入力してテスト対象プログラムを実行したとき、テスト対象プログラムの処理がテスト対象プログラムに含まれる脆弱なコードに到達したものと判断される。そして本実施例では、テスト結果がエラーであるため、テスト対象プログラムは脆弱性を有すると判断される。
本実施例では、例えば正常テストデータ10のようにオフセットを複数含む場合において、上記の手法でテストデータを作成することで、テスト対象プログラムの処理が脆弱なコードに到達するまでのテストの回数を減らすことができる。すなわち本実施例では、テスト対象プログラムの脆弱性の有無を検出するためのテストの回数を減らすことができる。
また本実施例では、正常テストデータに整数値や文字列、条件値、オフセット等が複数存在する場合に、テスト対象プログラムの処理が脆弱なコードに到達するまでのテストの回数を減らすことができる。
また本実施例における脆弱なコードとは、例えば入力データによってはバッファオーバーフローを引き起こすコードや、プログラムの実行を停止させるコード等である。
以下に本実施例のテストデータ作成装置100について説明する。図2は、第1の実施例のテストデータ作成装置のハードウェア構成の一例を示す図である。
図2において、テストデータ作成装置100は、コンピュータによって制御される装置であって、CPU(Central Processing Unit)21と、メモリユニット22と、表示ユニット23と、入力ユニット24と、記憶装置25と、ドライバ装置26と、通信ユニット27とを含む。テストデータ作成装置100において、CPU21と各ユニット、各装置は、システムバスBにより接続される。
CPU21は、メモリユニット12に格納されたプログラムに従ってテストデータ作成装置100を制御する。メモリユニット22は、RAM(Random Access Memory)及びROM(Read-Only Memory)等を有し、CPU21にて実行されるプログラム、CPU21での処理に必要なデータ、CPU21での処理にて得られたデータ等を格納する。またメモリユニット12の一部の領域は、CPU21での処理に利用されるワークエリアとして割り付けられている。
表示ユニット23は、CPU21の制御のもとに必要な各種情報を表示する。入力ユニット24は、マウス、キーボード等を有し、利用者がテストデータ作成装置100が処理を行なうための必要な各種情報を入力するために用いられる。
記憶装置25は、例えば、ハードディスクユニットにより実現され、各種処理を実行するプログラム等のデータを格納する。
テストデータ作成装置100によって行われる方法での処理を実現するプログラムは、例えば、CD−ROM(Compact Disk Read-Only Memory)等の記憶媒体18によってテストデータ作成装置100に提供される。即ち、プログラムが保存された記憶媒体28がドライバ装置26にセットされると、ドライバ装置26が記憶媒体28からプログラムを読み出し、その読み出されたプログラムがシステムバスBを介して記憶装置25にインストールされる。そして、プログラムが起動されると、記憶装置25にインストールされたプログラムに従ってCPU21が処理を開始する。
尚、プログラムを格納する媒体としてCD−ROMに限定するものではなく、コンピュータが読み取り可能な媒体であればよい。テストデータ作成装置100が外部とのネットワーク通信を行う場合には、テストデータ作成装置100による処理を実現するプログラムを通信ユニット27によってネットワークを介してダウンロードし、記憶装置25にインストールするようにしても良い。また、テストデータ作成装置100が外部記憶装置との接続を行うUSB(Universal Serial Bus)等のインタフェースを有する場合には、USB接続によって外部記憶媒体からプログラムを読み込んでもよい。
図3は、第1の実施例のテストデータ作成装置の機能構成の例を説明する図である。
本実施例では、例えばテスト対象プログラムを画像ビューアアプリケーションとし、テスト対象プログラムに入力されるテストデータを画像ファイル(以下、テストファイル)として説明する。
本実施例のテストデータ作成装置100は、テスト実行部110、次テストデータ作成部120、テスト対象監視部130、テスト結果記録部140、記憶部150を有する。上記各部の機能は、メモリユニット22に格納されたテストデータ作成プログラムがCPU21を動作させることで実現される。
テスト実行部110は、次テストファイル作成部120により作成されたテストファイルをテスト対象プログラムP1に入力データとして与え、テスト対象プログラムP1を実行させる。次テストファイル作成部120は、テスト対象プログラムP1の入力データとなるテストファイルを作成する。次テストファイル作成部120の詳細は後述する。
テスト対象監視部130は、テストファイルを入力データとしてテスト対象プログラムP1を実行したときのテスト対象プログラムP1の挙動を監視する。またテスト対象監視部130は、テスト対象プログラムP1の出力結果を解析する。本実施例のテスト対象監視部130は、例えばテストデータ作成装置100にインストールされたOS(Operating System)の機能の一部であっても良い。テスト対象監視部130は、監視の結果や解析の結果をテスト結果記録部140へ渡す。
テスト結果記録部140は、テスト対象監視部130から渡されたテスト結果を後述するテスト結果保存部153に保存する。
尚テスト対象プログラムP1は、テストデータ作成装置100に予めインストールされていても良い。
またテスト対象プログラムP1は、例えばテストデータ作成装置100以外の外部装置にインストールされていても良い。この場合テスト対象監視部130も外部装置に含まれていても良い。この場合テストデータ作成装置100は、外部装置と適切な方法で接続されており、テスト実行部110から外部装置へテストファイルが送信され、テスト結果記録部140が外部装置からテスト結果を受信しても良い。
またテストデータ作成装置100は、外部装置からテスト対象プログラムP1をダウンロードしても良い。さらにテストデータ作成装置100は、テスト対象プログラムP1が記憶媒体に記憶されている場合には、この記憶媒体からテスト対象プログラムP1を読み出してインストールしても良い。
記憶部150は、例えばメモリユニット22内に設けられている。記憶部150は、テスト情報保存部151、正常ファイル保存部152、テスト結果保存部153を有する。テスト情報保存部151は、テスト情報が保存された記憶領域である。正常ファイル保存部152は、正常ファイルが保存された記憶領域である。テスト結果保存部153は、テスト結果が保存された記憶領域である。
以下に、次テストファイル作成部120の詳細を説明する。正常ファイル取得部121、異常ファイル作成部122、テストファイル作成部123、テスト情報書換部124を有する。正常ファイル取得部121は、記憶部150の正常ファイル保存部152から正常ファイルを取得する。
異常ファイル作成部122は、テスト情報保存部151に保存されたテスト情報を取得し、正常ファイルに基づき異常ファイルを作成する。テストファイル作成部123は、異常ファイルを基に、次に実行されるテスト対象プログラムP1のテストに使用するテストファイルを作成する。作成されたテストファイルは、テスト実行部110を介してテスト対象プログラムP1へ入力される。テスト情報書換部124は、テストファイル作成後にテスト情報を書き換える。次テストファイル作成部120によるテストファイルの作成の詳細は後述する。
以下に図4を参照してテスト情報保存部151に保存されたテスト情報について説明する。図4は、第1の実施例のテスト情報保存部に保存されたテスト情報の一例を示す図である。
図4に示すテスト情報40Aには、テスト対象プログラムのパス、正常ファイルのパス、正常ファイルの長さ、異常データのリスト、次テストの復元済み箇所が含まれる。
異常データのリストとは、異常データの種類を示す。本実施例では、異常データの種類は1種類とした。次テストの復元済みの箇所とは、次にテストファイルを作成する際に、異常ファイルにおいて正常ファイルの値と置き換え始める箇所を示す。言い換えれば本実施例の次テストの復元済みの箇所は、異常ファイルにおける単位データの先頭の位置を示す値である。尚このとき異常ファイルでは、次テストの復元済みの箇所までは正常ファイルの値に置き換えられ、復元されることを前提とする。
図4では、テスト対象プログラムのパスを「C:\\target\\SampleViewer.exe」とし、正常ファイルのパスを「C:\\target\\sample.jpg」とした。また図4では、正常ファイルの長さを「5634」とし、異常データのリストを「0xffff」、次テストの復元済みの箇所を「1」とした。尚図4に示すテスト情報40Aは、テストデータ作成開始時の初期状態を示している。テスト情報40Aでは、テストデータが作成される度に、次テストの復元済みの箇所の値が書き換えられる。
次に図5を参照して正常ファイル保存部152に保存された正常ファイルについて説明する。図5は、第1の実施例の正常ファイル保存部に保存された正常ファイルの一例を示す図である。
図5に示す正常ファイル50は、テスト対象プログラムP1の入力データとして予め与えられたデータである。本実施例の正常ファイル50では、2つの離れた箇所にある2バイトのフィールドが連結されることで、4バイトのオフセットとして解釈されるものとした。図5では、2箇所に分けられたオフセットをそれぞれオフセット1、オフセット2とした。尚正常ファイル50は、正常ファイル50がテスト対象プログラムP1に与えられたとき、テスト対象プログラムP1が予測された動作をすることが予め判明しているデータであれば良い。また本実施例では、オフセットが2箇所に分けられたものとしたが、これに限定されない。オフセットは3箇所以上に分けられていても良い。
次に図6を参照して本実施例のテストデータ作成装置100の動作を説明する。図6は、第1の実施例のテストデータ作成装置の動作を説明するフローチャートである。
本実施例のテストデータ作成装置100において、テスト対象プログラムP1のテスト開始が指示されると、異常ファイルの最後のバイトまで正常値に復元したか否かを判断する(ステップS601)。具体的にはテストデータ作成装置100は、次テストファイル作成部120により、テスト情報保存部151に保存されたテスト情報から、正常ファイルの長さの値と次テストの復元済みの箇所の値を取得する。次に次テストファイル作成部120は、取得した正常ファイルの長さの値より、次テストの復元済みの箇所の値の方が大きいか否かを判断する。次テストの復元済みの箇所の値が正常ファイルの長さの値以下である場合、次テストファイル作成部120は、異常ファイルの最後のバイトまで正常値に復元されていないと判断する。
正常ファイルの長さの値よりも、次テストの復元済みの箇所の値の方が大きい場合、次テストファイル作成部120は、異常ファイルの最後のバイトまで正常値に復元されたと判断し、処理を終了する。
ステップS601において異常ファイルの最後のバイトまで正常値に復元されていないと判断された場合、次テストファイル作成部120は、正常ファイル取得部121により正常ファイルを取得する(ステップS602)。具体的には次テストファイル作成部120は、テスト情報保存部151に保存されたテスト情報40Aから正常ファイルのパスを取得し、正常ファイル保存部152に保存された正常ファイル50を取得する。
続いて次テストファイル作成部120は、異常ファイル作成部122により、異常ファイルを作成する(ステップS603)。具体的には異常ファイル作成部122は、テスト情報40Aの異常データのリストから異常データを取得する。そして異常ファイル作成部122は、取得した正常ファイル50の長さを基に、正常ファイル50の先頭から最後まで異常データで埋め尽くされた同じ長さのファイルを作成し、異常ファイルとする。
尚本実施例では、例えば正常ファイル50の長さが異常データのバイト数の整数倍でない場合、正常ファイル50の長さを超える部分は捨てる。また異常データのバイトオーダは、ビッグエンディアンやリトルエンディアン等のどのような方式でもよいが、方式が予め決められているものとした。
続いて次テストファイル作成部120は、テストファイル作成部123により、次のテストで用いられるテストファイルを作成する(ステップS604)。具体的にテストファイル作成部123は、テスト情報40Aから次テストの復元済みの箇所の値を取得する。そしてテストファイル作成部123は、作成された異常ファイルに対し、先頭から次テストの復元済みの箇所までを正常ファイルの内容に置き換える。さらにテストファイル作成部123は、次テストの復元済みの箇所の値から所定バイトを正常ファイルの対応箇所の内容に置き換え、テストファイルとする。
続いて次テストファイル作成部120は、テスト情報書換部124により、テスト情報40Aの書き換えを行う(ステップS605)。具体的にはテスト情報書換部124は、テスト情報40Aの次テストの復元済みの箇所の値をインクリメントする。次テストの復元済みの箇所の値をインクリメントすることで、次にテストファイルを作成する際に、正常値と置き換えられる箇所を増やすようにテストファイルを作成することができる。
続いてテストデータ作成装置100は、テスト実行部110により、次テストファイル作成部120により作成されたテストファイルをテスト対象プログラムP1に与え、テスト対象プログラムP1を実行させる(ステップS606)。続いてテストデータ作成装置100は、テスト対象監視部130によりテスト対象プログラムP1の挙動を監視し、テスト結果記録部140によりテスト結果をテスト結果保存部153へ保存する(ステップS607)。
以下に図7を参照して本実施例の次テストファイル作成部120によるテストファイルの作成について具体的に説明する。
図7は、第1の実施例の次テストファイル作成部によるテストファイルの作成を具体的に説明する図である。図7の例では、単位データを4バイトとし、異常ファイルにおいて正常データに復元される箇所を1バイトずつ広げ、正常ファイル50に近づける場合を示している。尚本実施例では単位データを4バイトとしたが、これに限定されない。本実施例では、例えば単位データを3バイトとして正常ファイル50に復元しても良いし、単位データを5バイトとして正常ファイル50に復元しても良い。
図7に示す異常ファイル70は、異常ファイル作成部122により作成されるものであり、全ての値がテスト情報40Aの異常データのリストに含まれる異常データに置き換えられている。
本実施例のテストファイル作成部123は、異常ファイル70を基に、テストファイルを作成する。テストファイル作成部123は、テスト情報40Aの次テストの復元済みの箇所を参照する。このとき次テストの復元済みの箇所の値は1である。箇所の値は、単位データの先頭が異常ファイルの先頭からの何バイト目かを示す値である。よってテストファイル作成部123は、異常ファイル70の先頭(1バイト目)から4バイト目までの値を正常ファイル50の先頭から4バイト目までの値に置き換えたテストファイルTF1を作成する。
テストファイルTF1を作成すると、次テストファイル作成部120は、テスト情報書換部124により、次テストの復元済みの箇所の値をインクリメントする。
テストファイルTF1は、テスト実行部110に渡され、テスト対象プログラムP1の入力データとなる。
続いて次テストファイル作成部120は、次テストの復元済みの箇所の値と正常ファイルの長さの値とを比較する。正常ファイルの長さの値は5634であり、次テストの復元済みの箇所の値は2である。よって次テストファイル作成部120は、異常ファイル70の最後のバイトまで正常ファイルの値に復元されていないと判断し、次のテストファイルの作成を開始する。
テストファイル作成部123は、テスト情報40Aの次テストの復元済みの箇所を参照する。このとき次テストの復元済みの箇所の値はインクリメントされているため、2である。よってテストファイル作成部123は、異常ファイル70の2バイト目から5バイト目までの値を正常ファイル50の2バイト目から5バイト目までの値に置き換えたテストファイルTF2を作成する。
尚テストファイル作成部123は、異常ファイル70の先頭から次テストの復元済みの箇所までの値も正常ファイルの値に置き換える。よってテストファイルTF2では、異常ファイル70の先頭から5バイト目までが正常ファイル50の先頭から5バイト目の値に置き換えられている。テストファイルTF2は、テスト対象プログラムP1の入力データとなる。
同様に作成されたテストファイルTFMは、異常ファイルの先頭からオフセット1までの値とオフセット1の一部の値と、が正常ファイルの対応する箇所の値に置き換えられている。
以上のようにテストファイル作成部123は、テストファイルTF1,TF2,・・・,TFM,・・・,TFNを順次作する。テスト実行部110はテストファイルが作成される度にテストファイルをテスト対象プログラムP1に与えてテストを実行する。ここでN=正常ファイルの長さである。
作成されたテストファイルは順次テスト対象プログラムP1に入力されるが、テスト対象プログラムP1は、異常データの割合が高いテストファイルが入力された際はチェック機能により実行を拒否する。例えばテストファイルTF1、TF2がテスト対象プログラムP1に入力された場合、テスト対象プログラムP1はテストファイルに含まれる異常データの割合が高いと判断し、実行を拒否する。
これに対し、テストファイルTFMがテスト対象プログラムP1に入力された場合、正常ファイルの値と置き換えられた箇所が増えたため、チェック機能によるチェックを通過しテスト対象プログラムP1が実行される。
本実施例では、例えばテスト対象プログラムP1が実行され、且つテスト対象監視部140によりテスト結果にエラーが検出されたとき、テスト対象プログラムP1に含まれる脆弱なコードに到達し、脆弱なコードが実行されたものと判断する。
図7の例では、テストファイルTFMがテスト対象プログラムP1に入力されると、テスト対象プログラムP1は実行され、且つテスト結果はエラーとなる。したがって図7の例では、テストファイルTFMが入力されたとき、テスト対象プログラムP1の処理がテスト対象プログラムP1に含まれる脆弱なコードに到達したことになる。尚エラーとは、例えばテスト対象プログラムP1が予測される振る舞いとは異なる振る舞いをすることである。
図8は、第1の実施例のテスト結果保存部に保存されたテスト結果の一例を示す図である。
図8に示すテスト結果80には、テストファイルの番号、テストファイルの作成に用いられた異常データの値、復元済みのオフセット、テスト結果が含まれる。
テストファイルTF1を入力データとしてテスト対象プログラムP1を実行した場合、テストファイルの番号はTF1、異常データの値はテスト情報40Aから取得した0xffffとなる。また復元済みオフセットは、テストファイルTF1ではオフセット1もオフセット2も復元されていないため、「なし」となる。テスト結果は、「問題なし」となる。テストファイルTF1に対するテスト結果は、テスト対象プログラムP1の実行の拒否であるが、これはテスト対象プログラムP1の動作として予測される動作であるため、「問題なし」とされる。
テストファイルTFMを入力データとしてテスト対象プログラムP1を実行した場合、テストファイルの番号はTFM、異常データの値はテスト情報40Aから取得した0xffffとなる。また復元済みオフセットは、テストファイルTFMではオフセット1の一部が復元されているため「1」、テスト結果は、「例外発生」となる。テストファイルTFMに対するテスト結果は、テスト対象プログラムP1は実行されたもののエラーが発生したため、テスト対象プログラムP1の動作として予測されない動作をしたと判断され、「例外発生」となる。
テストファイルTFNは、次テストファイル作成部120により最後に作成されるテストファイルである。テストファイルTFNでは、異常ファイルの最後のバイト以外が正常ファイルの値に置き換えられたものである。よって復元済みオフセットはオフセット1、2となる。またテストファイルFTNでは殆どが正常ファイル50と置き換えられているため、テスト対象プログラムP1の実行結果は「問題なし」となる。
尚本実施例では、Nは、テストファイル作成部120により作成されるテストファイルの数となる。本実施例では、N=正常ファイル50の長さの値となる。本実施例では正常ファイル50の長さは5634である。よって本実施例では、次テストファイル作成部120により最後に作成されるテストファイルの数は、5634個となる。
すなわち本実施例では、テストファイル数は正常ファイルの長さと同数であり、正常ファイルに含まれるオフセットの数に依存しない。
以下に図9を参照して、本実施例の効果を説明する。図9は、第1の実施例の効果を説明するための第1の比較例を説明する図である。
図9では正常ファイル50の値を先頭から4バイト単位で異常データに置き換える例を示している。図9では、正常ファイル50に含まれる2箇所のオフセット1とオフセット2の両方又は一部が異常データとなったとき、テスト結果がエラーとなるものとして説明する。
図9において、テストファイル91−1は正常ファイル50の先頭から4バイト目までが異常データに置き換えられたものである。テストファイル91−2では、先頭から5バイト目までが異常データに置き換えられたものである。テストファイル91−2は、テストファイル91−1の次のテストでテスト対象プログラムP1に入力されるテストファイルである。
テストファイル92−1は、正常ファイルの2バイト目から5バイト目までを異常データに置き換えたものである。テストファイル92−2は、テストファイル92−1の次のテストでテスト対象プログラムP1に入力されるテストファイルである。テストファイル92−2では、2バイト目から6バイト目までが異常データに置き換えられたものである。
図9の例では、このようにして異常データを含むテストファイルを作成する。この方法では、オフセット1とオフセット2に起因する脆弱性を検出するために必要なテストファイルの数は、オフセット1のファイル中の箇所×オフセット2のファイル中の箇所となる。
この場合に、例えばオフセット1とオフセット2が、正常ファイル50の最後に位置すると仮定すると、テストファイルの数は、正常ファイルの長さの2乗となる。
また、正常ファイルにオフセットがn箇所にあった場合には、テストファイルの数は、正常ファイルの長さのn乗となり、テストファイル数が膨大となる。
これに対し、本実施例では、全ての値が異常値に置き換えられた異常ファイルを正常ファイルに復元していくため、オフセット1とオフセット2は最初から脆弱性を引き起こす異常データとなっている。したがって本実施例では、必要なテストファイル数はオフセットの数に依存せず、正常ファイルの長さとなる。
よって本実施例では、例えばテストファイルにオフセットや整数値、条件値等が複数含まれる場合に、脆弱なコードに到達するまでのテストファイルの数を大幅に減らすことができ、テスト回数を減らすことができる。また本実施例では、テスト情報の正常ファイルの長さから、作成されるテストファイルの数を求めることができる。
(第2の実施例)
以下に図面を参照して第2の実施例について説明する。第2の実施例は、異常データが複数存在する場合の例である。以下の第2の実施例の説明では、第1の実施例と同様の機能を有するものには第1の実施例の説明で用いた符号と同様の符号を付与し、その説明を省略する。
図10は、第2の実施例のテスト情報保存部に保存されたテスト情報の例を示す図である。
図10に示すテスト情報40Bには、テスト対象プログラムのパス、正常ファイルのパス、正常ファイルの長さ、異常データのリスト、異常データの数、次テストの復元済み箇所、次テストの異常データの番号が含まれる。
異常データのリストは異常データの種類を示し、異常データの数は異常データのリストに含まれる異常データの数である。本実施例では、異常データの種類は2種類であるため、異常データの数は2である。
次テストの異常データの番号は、次のテストで使用される異常データの番号である。本実施例では、例えば異常データ1である0xffffを異常データとしてテストファイルを作成し、次に異常データ2である0x7fffを異常データとしてテストファイルを作成する。次テストの異常データの番号は、異常データとして用いる値に対応した番号となるようにテスト情報書換部124により書き換えられる。
尚本実施例では、異常データを0xffffと0x7fffの2種類としたが、これに限定されるものでなく、他の値であっても良い。また異常データの数も、任意であって良い。また図11に示すテスト情報40Bは、テストデータ作成開始時の初期状態を示している。
以下に図11を参照して本実施例のテストデータ作成装置100の動作を説明する。図11は、第2の実施例のテストデータ作成装置の動作を説明するフローチャートである。
本実施例のテストデータ作成装置100において、テスト対象プログラムP1のテスト開始が指示されると、異常ファイルの最後のバイトまで正常値に復元したか否かを判断する(ステップS1101)。ステップS1011において最後のバイトまで復元した場合、テストデータ作成装置100は、処理を終了する。
ステップS1101において最後のバイトまで復元されていない場合、次テストファイル作成部120は、テスト情報書換部124によりテスト情報40Bの次テストの異常データの番号を1にする(ステップS1102)。
続いて次テストファイル作成部120は、テスト情報40Bの異常データのリストに含まれる全ての異常データを用いてテスト対象プログラムP1のテストを行ったか否かを判断する(ステップS1103)。具体的には次テストファイル作成部120は、テスト情報40Bから異常データの数の値と次テストの異常データの番号の値を取得する。そして異常データの数の値が次テストの異常データの番号以上であれば、現在の復元済みの箇所において全ての異常データを用いたテストが完了したと判断する。
ステップS1103において全ての異常データを用いたテストが完了した場合、ステップS1110へ進む。ステップS1110の処理は、図6のステップS605の処理と同様であるから説明を省略する。
ステップS1103において全ての異常データを用いたテストが完了していないと判断された場合、次テストファイル作成部120は、正常ファイル取得部121により正常ファイル50を取得する(ステップS1104)。
ステップS1104〜ステップS1106までの処理は、図6のステップS602〜ステップS604までの処理と同様であるから説明を省略する。
続いてテスト情報書換部124は、テスト情報40Bの次テストの異常データの番号の値をインクリメントする(ステップS1105)。
ステップS1108とステップS1109の処理は、図6のステップS606とステップS607の処理と同様であるから説明を省略する。
ステップS1109においてテスト結果記録部140がテスト結果をテスト結果保存部153に記録すると、次テストファイル作成部120はステップS1103へ戻る。
本実施例では、以上のようにテストデータを作成し、テスト対象プログラムP1のテストを実行することで、同一の箇所で複数の異常データによるテストを実行した後に、次の箇所のテストを行う。
以下に図12を参照して本実施例の次テストファイル作成部120によるテストファイルの作成について具体的に説明する。
図12は、第2の実施例の次テストファイル作成部によるテストファイルの作成を具体的に説明する図である。
図12に示すテストファイルTF11は、異常データ1を用いた異常ファイルから作成されるテストファイルである。図12の例では、単位データを4バイトとして正常ファイル50に復元していく例であり、テストファイルTF11では、異常ファイルを先頭から4バイト目までを示す箇所1が正常ファイル50の対応する値に置き換えられている。箇所1は、テスト情報40Bにおける次テストの復元済みの箇所を示す。
テストファイルTF12は、異常データ2を用いた異常ファイルから作成されるテストファイルである。テストファイルTF12は、テストファイルTF11の次に作成される。
テストファイルTF12が作成されると、テスト情報40Bの異常データのリストに含まれる全ての異常データを用いてテストファイルを作成したことになる。したがって次テスト情報書換部124は、テスト情報40Bの次テストの復元済みの箇所の値をインクリメントして2とし、次テストの異常データの番号を1に戻す。
続いて次テストファイル作成部120は、次テストの復元済みの箇所2、次テストの異常データの番号を1としたテスト情報40Bに基づきテストファイルTF13を作成する。
テストファイルTF13は、異常データ1を用いた異常ファイルを2バイト目から5バイト目までを示す箇所2が正常ファイル50の対応する値に置き換えられている。またテストファイルTF13では、異常ファイルの先頭のバイトも正常ファイルの値に置き換えられている。
テストファイルTF14は、異常データ2を用いた異常ファイルから作成されるテストファイルである。テストファイルTF14は、テストファイルTF13の次に作成される。
本実施例では、このようにテストファイルにおける同一の箇所を複数の異常データに置き換えてテストを実行できる。よって、例えばテストファイルにおいて異常データとする箇所に着目してテストを行う場合等に、テストファイルの数をより少なくすることができる。
図13は、第2の実施例のテスト結果保存部に保存されたテスト結果の一例を示す図である。
図13のテスト結果81において、テストファイルTF11を入力データとしてテスト対象プログラムP1を実行した場合、テストファイルの番号はTF11、異常データの値はテスト情報40Bから取得した番号1の異常データ0xffffとなる。また復元済みオフセットは、テストファイルTF11ではオフセット1もオフセット2も復元されていないため、「なし」となる。テスト結果は、「問題なし」となる。
テストファイルTF12を入力データとしてテスト対象プログラムP1を実行した場合、テストファイルの番号はTF12、異常データの値はテスト情報40Bから取得した番号2の異常データ0x7fffとなる。また復元済みオフセットは、テストファイルTF12ではオフセット1もオフセット2も復元されていないため、「なし」となる。テスト結果は、「問題なし」となる。
またテストファイルTFM−1を入力データとしてテスト対象プログラムP1を実行した場合、テストファイルの番号はTFM−1、異常データの値はテスト情報40Bから取得した番号1の異常データ0xffffとなる。テストファイルTFM−1ではオフセット1が復元されており、テスト結果は「問題なし」である。
またテストファイルTFM−2を入力データとしてテスト対象プログラムP1を実行した場合、テストファイルの番号はTFM−2、異常データの値はテスト情報40Bから取得した番号2の異常データ0x7fffとなる。テストファイルTFM2ではオフセット1が復元されており、テスト結果は「例外発生」である。この場合、異常データを0x7fffとすることで、テスト対象プログラムP1における脆弱なコードに到達したことになる。
テストファイルTFN1を入力データとしてテスト対象プログラムP1を実行した場合、テストファイルの番号はTFN−1、異常データの値はテスト情報40Bから取得した番号1の異常データ0xffffとなる。テストファイルTFN−1ではオフセット1とオフセット2が復元されており、テスト結果は「問題なし」である。
テストファイルTFN2を入力データとしてテスト対象プログラムP1を実行した場合、テストファイルの番号はTFN−2、異常データの値はテスト情報40Bから取得した番号2の異常データ0x7fffとなる。テストファイルTFN−2ではオフセット1とオフセット2が復元されており、テスト結果は「問題なし」である。
本実施例では、N=正常ファイル50の長さの値である。よって本実施例の方法によりテストファイルを作成した場合、テストファイルの数は、正常ファイル50におけるオフセットの数や箇所に依存せず、N(正常ファイルの長さ)×2(異常データの数)となる。
これに対し、図9で説明した方法でテストファイルを作成すると、テストファイル数は、(異常データの数)×(オフセット1の正常ファイル中の箇所×オフセット2の正常ファイル中の箇所)2となる。
すなわち図9の方法では、正常ファイル50におけるオフセットの数や箇所に依存してテストファイル数が増える。図9方法では、例えばオフセットの数が多く、箇所が正常ファイルの後ろのバイトであるほどテストファイル数は増え、膨大な数となる。
以上のように、本実施例の方法によりテストファイルを作成することで、テスト対象プログラムP1に含まれる脆弱なコードに到達するまでのテストファイル数を減らすことができる。すなわち本実施例ではテスト回数を減らすことができる。また本実施例では、テスト情報の正常ファイルの長さから、作成されるテストファイルの数を求めることができる。
尚以上に説明した各実施例では、テストデータを作成する度にテストを実行するものとしたが、これに限定されない。例えばテストデータ作成装置は、先に全てのテストデータを作成してメモリユニットに保持しておき、テストを実行する際にメモリユニットからテストデータを読み出してテストを行っても良い。
本発明の実施例は、以下に記載する付記が考えられる。
(付記1)
コンピュータがファジングにおけるテストデータを作成するテストデータ作成方法であって、該コンピュータが、
記憶部から正常データを取得し、
前記正常データの全ての値を異常値に置き換えた異常データを作成し、
前記異常データの所定の箇所を前記正常データに復元して前記テストデータを作成する際に、前記テストデータを作成する度に復元する前記箇所を増やすテストデータ作成方法。
(付記2)
該コンピュータは、
前記復元された前記箇所を示す値と複数の値を取り得る前記異常値とを含み、前記テストデータの作成に用いられるテスト情報を前記記憶部から取得し、
前記テスト情報に複数の前記異常値が含まれる場合に、前記正常データの全ての値をそれぞれの前記異常値に置き換えた異常データを作成する付記1記載のテストデータ作成方法。
(付記3)
前記テスト情報は、前記異常データを前記正常データへ復元する際の単位データの先頭の位置を示す値を含み、
該コンピュータが、
前記テストデータを作成する度に、前記単位データの先頭の位置を前記異常データの先頭からずらす付記2記載のテストデータ作成方法。
(付記4)
該コンピュータが、
前記異常データの先頭から前記単位データの最後の位置までを前記正常データに復元する付記3記載のテストデータ作成方法。
(付記5)
該コンピュータが、
前記テストデータを作成する度に前記テスト情報の前記単位データの先頭の位置を示す値をインクリメントさせる付記3又は4記載のテストデータ作成方法。
(付記6)
前記テスト情報は、前記正常データの長さを示す値を含み、
該コンピュータが、
前記単位データの先頭の位置を示す値が前記正常データの長さを示す値よりも大きくなるまで前記テストデータを作成する付記2乃至5の何れか一項に記載のテストデータ作成方法。
(付記7)
前記テスト情報に複数の前記異常値が含まれる場合に、
該コンピュータが、
前記正常データの全ての値を第1の異常値に置き変えた第1の異常データを作成し、前記テストデータを作成する度に前記第1の異常データにおける前記箇所を増やし、
次に前記正常データの全ての値を第2の異常値に置き変えた第2の異常データを作成し、前記テストデータを作成する度に前記第2の異常データにおける前記箇所を増やす付記2乃至5の何れか一項に記載のテストデータ作成方法。
(付記8)
前記テスト情報は、前記複数の前記異常値のリストと、前記リストにおける前記異常値の番号とを含み、
該コンピュータが、
前記正常データの全ての値を前記リストにおいて前記番号と対応した前記異常値に置き換える付記7記載のテストデータ作成方法。
(付記9)
該コンピュータが、
前記リストに含まれる全ての前記異常値に前記正常データの全ての値を置き換えた後に、前記単位データの先頭の位置を示す値をインクリメントさせる付記8記載のテストデータ作成方法。
(付記10)
前記正常データは、
オフセットが複数箇所に存在する付記1乃至9の何れか一項に記載のテストデータ作成方法。
(付記11)
記憶部から正常データを取得する処理と、
前記正常データの全ての値を異常値に置き換えた異常データを作成する処理と、
前記異常データの所定の箇所を前記正常データに復元して前記テストデータを作成する際に、前記テストデータを作成する度に復元する前記箇所を増やす処理と、をコンピュータに実行させるテストデータ作成プログラム。
(付記12)
正常データが記憶された記憶部と、
前記記憶部から前記正常データを取得する取得部と、
前記正常データの全ての値を異常値に置き換えた異常データを作成する異常データ作成部と、
前記異常データの所定の箇所を前記正常データに復元して前記テストデータを作成する際に、前記テストデータを作成する度に復元される前記箇所を増やすテストデータ作成部と、を有するテストデータ作成装置。