"被監査プログラムの脆弱性を検出する脆弱性監査方法をコンピュータに実行させるための脆弱性監査プログラムであって、脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力ステップと、前記被監査プログラムを読み込み構文解析を行うプログラム入力ステップと、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡ステップと、前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定ステップと、前記脆弱性判定ステップによる判定が否である場合に、警告メッセージを生成し、画面又はファイルに出力する警告出力ステップと、をコンピュータに実行させるための脆弱性監査プログラム。請求項1に記載の脆弱性監査プログラムにおいて、前記判定ルールは、ライブラリ関数における脆弱な引数の定義を含むことを特徴とする脆弱性監査プログラム。請求項1に記載の脆弱性監査プログラムにおいて、前記変数管理ステップにより管理される変数は、前記値が外部から入力される変数と、前記値が外部から入力される変数が関数等で処理された結果の変数を含むことを特徴とする脆弱性監査プログラム。被監査プログラムの脆弱性を検出する脆弱性監査方法をコンピュータに実行させるための脆弱性監査プログラムであって、脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義されるとともに、脆弱性に関するチェックをコンピュータに実行させるコードが予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力ステップと、前記被監査プログラムを読み込み構文解析を行うプログラム入力ステップと、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡ステップと、前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定ステップと、前記脆弱性判定ステップによる判定が否である場合に、前記判定ルールに定義された脆弱性に関するチェックをコンピュータに実行させるコードを挿入することで、脆弱性について前記被監査プログラムの修正を行う修正出力ステップと、をコンピュータに実行させる脆弱性監査プログラム。被監査プログラムの脆弱性を検出する脆弱性監査装置であって、脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力部と、前記被監査プログラムを読み込み構文解析を行うプログラム入力部と、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡部と、前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定部と、前記脆弱性判定部による判定が否である場合に、警告メッセージを生成し、画面又はファイルに出力する警告出力部と、を有する脆弱性監査装置。被監査プログラムの脆弱性を検出する脆弱性監査装置であって、脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義されるとともに、脆弱性に関するチェックをコンピュータに実行させるコードが予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力部と、前記被監査プログラムを読み込み構文解析を行うプログラム入力部と、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡部と、前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定部と、前記脆弱性判定部による判定が否である場合に、前記判定ルールに定義された脆弱性に関するチェックをコンピュータに実行させるコードを挿入することで、脆弱性について前記被監査プログラムの修正を行う修正出力部と、を有する脆弱性監査装置。脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力ステップと、前記被監査プログラムを読み込み構文解析を行うプログラム入力ステップと、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡ステップと、前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定ステップと、前記脆弱性判定ステップによる判定が否である場合に、警告メッセージを生成し、画面又はファイルに出力する警告出力ステップと、をコンピュータが実行する脆弱性監査方法。脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義されるとともに、脆弱性に関するチェックをコンピュータに実行させるコードが予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力ステップと、前記被監査プログラムを読み込み構文解析を行うプログラム入力ステップと、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡ステップと、前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定ステップと、前記脆弱性判定ステップによる判定が否である場合に、前記判定ルールに定義された脆弱性に関するチェックをコンピュータに実行させるコードを挿入することで、脆弱性について前記被監査プログラムの修正を行う修正出力ステップと、をコンピュータに実行させる脆弱性監査方法。一般に脆弱とされているライブラリでも、プログラマがソースコード中での使い方さえ誤らなければ、脆弱性を作りこむことはない。例えば、strcpyライブラリが文字列定数を処理するのであれば、脆弱性とはなりえない。一方、strcpyライブラリが、プログラムのユーザ等、外部から与えられた文字列を処理する場合、外部から特殊な文字列を与えることでバッファオーバフロー脆弱性が発生しうる。しかしながら、従来の静的監査は、脆弱なライブラリ名の単純なパターンマッチングに依るものが多く、ソースコード中で使用されている脆弱ライブラリの全てについて警告メッセージを出力する。すなわち、従来の静的監査は適切に使われている脆弱ライブラリについても警告するため、プログラマは膨大な警告メッセージに対処しなければならない。また、従来の動的監査は、監査者が、プログラムに与える入力データのセットであるテストセットを作る必要がある。様々な脆弱性を網羅するようにテストセットを作ることは、一般に困難且つ高コストであり、このことが動的監査の敷居を高くしている。本発明は上述した問題点を解決するためになされたものであり、脆弱なライブラリが適切に用いられていない箇所のみを検出する脆弱性監査プログラム、脆弱性監査装置、脆弱性監査方法を提供することを目的とする。上述した課題を解決するため、本発明の一態様は、被監査プログラムの脆弱性を検出する脆弱性監査方法をコンピュータに実行させるための脆弱性監査プログラムであって、脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力ステップと、前記被監査プログラムを読み込み構文解析を行うプログラム入力ステップと、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡ステップと、前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定ステップと、前記脆弱性判定ステップによる判定が否である場合に、警告メッセージを生成し、画面又はファイルに出力する警告出力ステップと、をコンピュータに実行させるものである。また、本発明の一態様に係る脆弱性監査プログラムにおいて、前記警告メッセージは、前記値が外部から入力される変数の位置、使用されたライブラリ関数と引数、使用されたライブラリ関数の位置、検出された脆弱性の説明、前記被監査プログラムの修正方法のいずれかを含むことを特徴とするものである。また、本発明の一態様に係る脆弱性監査プログラムにおいて、前記被監査プログラムは、ソースコードまたは中間言語ファイルであることを特徴とするものである。また、本発明の一態様は、被監査プログラムの脆弱性を検出する脆弱性監査方法をコンピュータに実行させるための脆弱性監査プログラムであって、脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義されるとともに、脆弱性に関するチェックをコンピュータに実行させるコードが予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力ステップと、前記被監査プログラムを読み込み構文解析を行うプログラム入力ステップと、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡ステップと、前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定ステップと、前記脆弱性判定ステップによる判定が否である場合に、前記判定ルールに定義された脆弱性に関するチェックをコンピュータに実行させるコードを挿入することで、脆弱性について前記被監査プログラムの修正を行う修正出力ステップと、をコンピュータに実行させるものである。また、本発明の一態様は、被監査プログラムの脆弱性を検出する脆弱性監査装置であって、脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力部と、前記被監査プログラムを読み込み構文解析を行うプログラム入力部と、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡部と、前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定部と、前記脆弱性判定部による判定が否である場合に、警告メッセージを生成し、画面又はファイルに出力する警告出力部と、を有するものである。また、本発明の一態様は、被監査プログラムの脆弱性を検出する脆弱性監査装置であって、脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義されるとともに、脆弱性に関するチェックをコンピュータに実行させるコードが予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力部と、前記被監査プログラムを読み込み構文解析を行うプログラム入力部と、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡部と、前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定部と、前記脆弱性判定部による判定が否である場合に、前記判定ルールに定義された脆弱性に関するチェックをコンピュータに実行させるコードを挿入することで、脆弱性について前記被監査プログラムの修正を行う修正出力部と、を有するものである。また、本発明の一態様は、脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力ステップと、前記被監査プログラムを読み込み構文解析を行うプログラム入力ステップと、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡ステップと、前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定ステップと、前記脆弱性判定ステップによる判定が否である場合に、警告メッセージを生成し、画面又はファイルに出力する警告出力ステップと、をコンピュータが実行するものである。また、本発明の一態様は、脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義されるとともに、脆弱性に関するチェックをコンピュータに実行させるコードが予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力ステップと、前記被監査プログラムを読み込み構文解析を行うプログラム入力ステップと、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡ステップと、前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定ステップと、前記脆弱性判定ステップによる判定が否である場合に、前記判定ルールに定義された脆弱性に関するチェックをコンピュータに実行させるコードを挿入することで、脆弱性について前記被監査プログラムの修正を行う修正出力ステップと、をコンピュータに実行させるものである。脆弱なライブラリが適切に用いられていない箇所のみを検出する脆弱性監査プログラム、脆弱性監査装置、脆弱性監査方法を提供することができる。以下、本発明の実施の形態について図面を参照しつつ説明する。本実施の形態は、外部データの入力を起点としてデータフローを追跡し、外部データをそのまま危険なライブラリに引き渡している個所を検出するものである。従って、本実施の形態によれば、脆弱なライブラリが適切に用いられていない箇所のみを検出できる。本実施の形態では、C言語のソースコードに含まれる脆弱性を検出し、検出した脆弱性をプログラマに警告するような脆弱性監査装置について説明する。まず、監査の対象となるプログラムである、2つの被監査プログラムの例について説明する。第1の被監査プログラムの例として、脆弱なプログラムtest1.cを図1に示す。test1.cは、ユーザにファイル名の入力を行わせ、このファイル名に対応するファイルの詳細情報アクセス制限、所有者、サイズ、最終更新日時、等を画面に出力するプログラムである。test1.cはまず、09~11行目でファイル名の入力処理を行う。次に、13行目で当該ファイル名を用いてUnixシェルに渡すコマンド文字列を生成する。ここではls-lfilenameで、ファイルの詳細情報を出力する。次に、14行目で当該コマンド文字列をUnixシェルに引き渡す。このプログラムに既存の適切なファイル名を入力した場合の、正常な実行結果を図2に示す。しかし、test1.cは悪用される恐れのある脆弱なプログラムである。悪意あるユーザは、ファイル名として例えばexample.txt;mailfoofuga.com</etc/passwdを入力するかもしれない。この場合、test1.cは、ファイルexample.txtの詳細情報が表示されるところまでは良いが、続けてパスワードファイルをfoofuga.com宛てにメール送信するコマンドが実行されてしまう。すなわち、機密情報が漏洩してしまう。次に、第2の被監査プログラムの例として、test1.cの問題を解決した安全なプログラムtest2.cを図3に示す。test1.cと違ってtest2.cは、入力されたファイル名をチェックする。13行目で関数Check_file_name23~36行目で定義されているが呼び出され、そこでファイル名がチェックされ、チェックにパスしないファイル名は処理せずにプログラムを終了する。これにより、test1.cのような問題は発生しないことになる。ここで、関数Check_file_nameについて簡単に説明する。この関数は、ファイル名の文字列に英数字、‘.’ピリオド、‘-’ハイフン、‘_’アンダーバー以外の文字が含まれていないかをチェックしている。通常、これらの文字で必要十分と考えられる。すなわち、ファイル名に使える文字をこれらに限定することにより、test1.cの問題のような不正な入力を防ぐ。次に、本発明に係る脆弱性監査装置の構成について説明する。図4は、本発明に係る脆弱性監査装置の構成の一例を示すブロック図である。この脆弱性監査装置は、プログラム入力部11、変数管理部21、判定ルール管理部22、処理フロー追跡部31、脆弱性判定部32、警告メッセージ出力部41を備える。判定ルール管理部22は、予め定義された脆弱性についての判定ルールを管理する。判定ルールは、外部入力を用いる関数や脆弱ライブラリの引数等を記述したものである。また、判定ルールは、予めメモリに格納されても良いし、予めファイルに格納され起動時に読み込むようにしても良い。また、ユーザがこのファイルをカスタマイズできるようにしても良い。プログラム入力部11は、ソースコードを読み込み、ソースコードの構文解析を行い、処理フローを処理フロー追跡部31に渡す。これは、C言語コンパイラの機能を利用して実現できる。C言語コンパイラはソースコードを構文解析して中間言語ファイルを生成するため、この中間言語ファイルを処理フローとする。ソースコードは複数のファイルからなるものでも良い。処理フロー追跡部31は、値が外部から入力される変数である外部入力変数を抽出し、その変数に関する情報を変数管理部21へ渡す。また、処理フロー追跡部31は、外部入力変数を処理フローに沿って追跡し、追跡した先の変数がライブラリ関数の脆弱な引数として処理されている箇所を抽出する。抽出の基準には、判定ルールを用いる。変数管理部21は、処理フロー追跡部31から得られる変数毎の情報を変数テーブルとして管理する。変数毎の情報は、変数名、属性、属性が設定された位置ソースファイル名と行番号からなる。引数や変数の属性には、変数宣言直後の状態である未設定、値が設定された状態であり、他のどの状態でもない通常、外部入力された状態であり、脆弱性が発生し得る汚染、汚染でないことをチェックしたチェック済みがある。また、属性が汚染である変数を汚染変数と呼ぶ。脆弱性判定部32は、判定ルールに定義された脆弱なライブラリの引数として、汚染変数が使用されているか否かの判定を行う。警告出力部41は、脆弱性に関する警告メッセージを生成し、画面やファイル等に出力する。次に、本発明に係る脆弱性監査装置の動作について説明する。図5は、本発明に係る脆弱性監査装置の動作の一例を示すフローチャートである。まず、プログラム入力部11、プログラムを読み込み、処理フロー追跡部31へ渡すS11。次に、処理フロー追跡部31は、判定ルールに従って外部入力変数を抽出し、変数管理部21の変数テーブルに格納するS12。次に、処理フロー追跡部31は、未監査の変数が残っているか否かの判断を行うS13。未監査の変数が残っていればS13,Y、処理フロー追跡部31は、未監査の変数の1つを選択して変数の監査を行いS14、処理S13へ戻る。一方、未監査の変数が残っていなければS13,N、このフローを終了する。処理S14において、処理フロー追跡部31と脆弱性判定部32は、選択した変数の監査を行う。図6は、本発明に係る変数の監査の動作の一例を示すフローチャートである。まず、処理フロー追跡部31は、読み込んだプログラムを1行進めるS21。次に、処理フロー追跡部31は、プログラムが終了したか否かの判断を行うS22。プログラムが終了した場合S22,Y、このフローを終了する。一方、プログラムが終了していない場合S22,N、処理フロー追跡部31は、プログラムが分岐したか否かの判断を行うS23。プログラムが分岐していない場合S23,N、処理S31へ移行する。一方、プログラムが分岐した場合S23,Y、処理フロー追跡部31は、選択した変数に対応する分岐先の変数を変数テーブルに格納するS24。次に、処理フロー追跡部31は、当該変数の属性がチェック済みであるか否かの判断を行うS31。チェック済みである場合S31,Y、このフローを終了する。一方、チェック済みでない場合S31,N、処理フロー追跡部31は、当該変数が関数に使用されているか否かの判断を行うS32。関数に使用されていなければS32,N、処理S21へ戻る。一方、関数に使用されていればS32,Y、脆弱性判定部32は、各変数の属性の遷移により汚染変数が発生したか否かの判断を行うS41、汚染変数が発生していなければS41,N、処理S43へ移行する。一方、汚染変数が発生していればS41,Y、脆弱性判定部32は、変数の属性を汚染として変数テーブルに格納するS42。次に、脆弱性判定部32は、判定ルールに従って当該変数に脆弱性が発生したか否かの判断を行うS43。脆弱性が発生していない場合S43,N、処理S21へ戻る。一方、脆弱性が発生した場合S43,Y、警告出力部41は、警告メッセージの出力を行いS44、このフローを終了する。ここで、処理S12は、予め定義した外部入力を用いる関数の使用と、main関数へ渡された引数argc,argvにより、外部入力変数を抽出する。このうち外部入力を用いる関数については、関数名と、汚染された値が入り得る引数の位置を、予め判定ルールに定義しておく。この定義は、各関数の使用を踏まえて行う必要がある。例えばfgets関数について、以下のように予め定義しておく。fgets:param_1=taintこの定義は、fgets関数が外部から入力される値が第1引数に入るような使用であることから、第1引数が汚染taintであり、それ以外の引数及び復帰値は非汚染であることを意味している。同様にsnprintf関数について、以下のように予め定義しておく。snprintf:param_1=param_4この定義は、snprintf関数において第1引数の属性が第4引数の属性を引き継ぐことを意味している。つまり、第4引数が汚染であれば、第1引数も汚染となり、第4引数が非汚染であれば、第1引数も非汚染となる。同様にsystem関数について、以下のように予め定義しておく。system:alert_ifparam_1=taintこの定義は、system関数において第1引数が汚染である場合に警告メッセージを生成することを意味している。すなわち、この関数は、第1引数が汚染である場合に異常な挙動を示す恐れがあり、脆弱性を有することを表す。また、処理S31は、変数の属性がチェック済みか否かのチェックを行う。例えば、対象となる変数を引数としてisalnum等のチェック関数をコールすると、対象となる変数の属性はチェック済みとなる。また、対象となる変数が比較演算子を含む条件式に用いられると、対象となる変数の属性はチェック済みとなる。また、処理S44は、脆弱性に関する警告メッセージを生成し、画面やファイル等に出力する。図7は、本発明に係る警告メッセージの一例を示す図である。警告メッセージとしてまず、検出番号、関数名、引数位置が出力される。関数名、危険度、脅威、解説、等の脆弱性に関する説明は、予め判定ルール中に定義され、検出された脆弱性のIDに対応づけられている。汚染されたデータの設定箇所は、変数テーブルに格納されており、設定した関数名、ファイル名、行番号等が出力される。脆弱ライブラリの使用箇所は、フロー追跡の現在位置から得られ、使用した関数名、ファイル名、行番号等が出力される。次に、本発明に係る脆弱性監査装置が、脆弱なプログラムの脆弱性監査を行う場合と、安全なプログラムの脆弱性監査を行う場合について、動作の具体例を説明する。まず、脆弱性監査装置が、脆弱なプログラムtest1.cの脆弱性監査を行う場合について説明する。まず、脆弱性監査装置は、10行目でfgets関数が使用されていることから、変数file_nameに外部から値が入力され、変数file_nameの属性が汚染である可能性がある、と判断する。次に、脆弱性監査装置は、13行目でsnprintf関数が使用されていることから、変数ls_commandに変数file_nameの属性が引き継がれ、変数ls_commandの属性が汚染である可能性がある、と判断する。次に、脆弱性監査装置は、14行目でsystem関数の引数として変数ls_commandが使用されていることから、system関数が汚染変数を処理しており、脆弱性を発生する可能性がある、と判断する。次に、脆弱性監査装置は、検出した脆弱性について警告メッセージを出力する。次に、脆弱性監査装置が、安全なプログラムtest2.cの脆弱性監査を行う場合について説明する。まず、脆弱性監査装置は、10行目でfgets関数が使用されていることから、変数file_nameに外部から値が入力され、変数file_nameの属性が汚染である、と判断する。次に、脆弱性監査装置は、13行目で関数Check_file_nameにより変数file_nameが値をチェックされており、変数file_nameの属性がチェック済みである、と判断する。次に、脆弱性監査装置は、18行目でsnprintf関数が使用されていることから、変数ls_commandに変数file_nameの属性が引き継がれ、変数ls_commandの属性がチェック済みである、と判断する。次に、脆弱性監査装置は、19行目でsystem関数の引数として変数ls_commandが使用されていることから、system関数がチェック済みの属性を持つ変数を処理しており、脆弱性を発生する可能性がない、と判断する。なお、本実施の形態においては、1つの変数に対して検出された警告メッセージを1つずつ出力していたが、同一の変数に対する複数の警告メッセージをマージしても良い。プログラムにおいてif文等により処理が分岐しており、分岐先で同じ変数に対して異なる処理が施される場合がよくある。このような場合において、例えば、片方の分岐先では危険度の高い脆弱性が検出され、もう片方の分岐先では危険度の低い脆弱性が検出されることがある。このとき、両者を別の警告メッセージとして出力することはユーザにとって冗長であり、両者をマージした警告メッセージとして出力する方が望ましいことが多い。警告メッセージのマージの具体的な方法としては、複数の警告メッセージの中で最も危険度の高い警告メッセージのみを残し、他の警告メッセージを捨てる方法がある。また、本実施の形態においては、ソースコードを処理することにより脆弱性監査を行うが、中間言語ファイルを処理することにより脆弱性監査を行ってもよい。C言語のプログラムにおいては、人間にとって可読性のあるソースコードをコンパイルすることにより、コンピュータが実行可能な機械語に翻訳される。コンパイラは、この翻訳の過程で中間的なファイルである中間言語ファイルを生成しており、これをディスクに出力することもできる。中間言語ファイルは、ソースコードを単位毎にノードの形で表したものであり、人間にとってソースコードのような可読性はないが、機械語ほど解読が困難なものではない。図8は、中間言語ファイルの一例を示す図である。このような中間言語ファイルを読み込んだ場合、脆弱性監査装置は木構造のデータフローを生成することができる。データの形式は異なるが、ソースコードと同様にして脆弱性監査の処理を行うことができる。また、本実施の形態においては、脆弱性監査装置が警告メッセージを出力することにより、ユーザが警告メッセージに従ってプログラムの修正を行うことを目的としたが、警告メッセージにプログラム修正方法を含めても良いし、新たに備える修正出力部がプログラム修正方法に従って自動的にプログラムを修正しても良い。図9は、本発明に係る脆弱性監査装置の構成の別の一例を示すブロック図である。図9において、図4と同一符号は図4に示された対象と同一又は相当物を示しており、ここでの説明を省略する。また、図4と比較すると図9の装置は、警告出力部41の代わりに修正出力部51を備えることにより、自動的にプログラムを修正する。このようにプログラム修正方法を得る場合、判定ルールにおいて、更に脆弱性に対するプログラム修正方法を予め定義しておく。例えば、まず、system関数の判定ルールにおいてフィールドを1つ追加し、以下のようなプログラム修正方法の種類を記述する。system:alert_ifparam1=taint,correct=method3更に、判定ルールにおいてプログラム修正方法method3の内容を予め定義しておく。図10は、本発明に係るプログラム修正方法の内容の一例を示すソースコードである。このプログラム修正方法method3は、system関数を使用する直前に、その引数として使用される文字列変数をチェックするロジックを挿入するものである。このロジックは文字列変数において、‘|’や‘;’等、シェルに引き渡されると危険である文字が含まれているか否かをチェックするものである。ここで、Invalid_String_Errorxは、別の箇所で定義される関数であり、エラーを出力してプログラムを終了させるものである。また、本実施の形態においては、C言語を対象としたが、他のプログラム言語についても適用可能である。更に、脆弱性監査装置を構成するコンピュータに上述した各ステップを実行させるプログラムを、脆弱性監査プログラムとして提供することができる。上述したプログラムは、コンピュータにより読取り可能な記録媒体に記憶させることによって、脆弱性監査装置を構成するコンピュータに実行させることが可能となる。ここで、上記コンピュータにより読取り可能な記録媒体としては、CD-ROMやフレキシブルディスク、DVDディスク、光磁気ディスク、ICカード等の可搬型記憶媒体や、コンピュータプログラムを保持するデータベース、或いは、他のコンピュータ並びにそのデータベースや、更に回線上の伝送媒体をも含むものである。"