(57)【要約】【課題】作業工数を低減しつつ、サニタイザを適切に配置する。【解決手段】検証装置は、入力点ノード、出力点ノード、及び無害化ノードを抽出して、ソースコードのデータフローを解析するとともに、入力点ノードから出力点ノードまでのノードを含むデータフローを示す有向グラフを生成するデータフロー解析部と、有向グラフと、無害化ノードとに基づいて、有向グラフに含まれるノードのうちの、無害化ノードを通過しない経路上のノードである汚染ノードと、無害化ノードの下流に配置されたノードである下流ノードと、無害化ノードの上流に配置されたノードである上流ノードとを抽出する第１の抽出部と、汚染ノードと下流ノードと上流ノードとに基づいて、無害化する処理を配置するノードの候補を示す候補ノードを抽出し、抽出した候補ノードに対応するソースコード上の位置を示す情報を出力部に出力させる第２の抽出部とを備える。【選択図】図３
2014174577.tif 000002
【特許請求の範囲】
【請求項１】
ソースコードを記憶したソースコード記憶部から前記ソースコードを取得し、取得した前記ソースコードに含まれる、データを入力する入力点ノード、データを出力する出力点ノード、及びデータに含まれる脆弱性の原因となる特殊文字を無害化する処理に対応する無害化ノードを、前記入力点ノード、前記出力点ノード、及び前記無害化ノードのそれぞれに対応する記述を示す記述情報を記憶するルール情報記憶部から取得した前記記述情報に基づいて抽出して、前記ソースコードのデータフローを解析するとともに、前記入力点ノードから前記出力点ノードまでのノードを含む前記データフローを示す有向グラフを生成するデータフロー解析部と、
前記データフロー解析部が生成した前記有向グラフと、前記無害化ノードとに基づいて、前記有向グラフに含まれる前記ノードのうちの、前記無害化ノードを通過しない経路上のノードである汚染ノードと、前記無害化ノードの下流に配置されたノードである下流ノードと、前記無害化ノードの上流に配置されたノードである上流ノードとを抽出する第１の抽出部と、
前記第１の抽出部が抽出した前記汚染ノードと前記下流ノードと前記上流ノードとに基づいて、前記無害化する処理を配置するノードの候補を示す候補ノードを抽出し、抽出した前記候補ノードに対応する前記ソースコード上の位置を示す情報を出力部に出力させる第２の抽出部と
を備えることを特徴とする検証装置。
【請求項２】
前記第２の抽出部は、前記汚染ノードの集合から、前記下流ノードの集合及び前記上流ノードの集合を除外した候補集合に含まれるノードを、前記候補ノードとして抽出する
ことを特徴とする請求項１に記載の検証装置。
【請求項３】
前記第２の抽出部は、
抽出した前記候補ノードのうち、前記有向グラフ上の経路において前記出力点ノードに最も近いノードを、最優先順位の候補ノードとして抽出する
ことを特徴とする請求項１又は請求項２に記載の検証装置。
【請求項４】
前記第２の抽出部は、
抽出した前記候補ノードのうち、前記有向グラフ上の経路において分岐先となるノードに対して、前記候補ノードとしての優先順位を下げる
ことを特徴とする請求項１から請求項３のいずれか一項に記載の検証装置。
【請求項５】
前記第２の抽出部は、
抽出した前記候補ノードのうち、前記有向グラフ上の経路において分岐の収束先となるノードに対して、前記候補ノードとしての優先順位を上げる
ことを特徴とする請求項１から請求項４のいずれか一項に記載の検証装置。
【請求項６】
前記第２の抽出部は、
前記有向グラフが複数の入力点ノード又は複数の出力点ノードを含む場合に、前記入力点ノードと前記出力点ノードとの組み合わせのそれぞれに対して、前記候補ノードを抽出する
ことを特徴とする請求項１から請求項５のいずれか一項に記載の検証装置。
【請求項７】
前記第２の抽出部は、
前記組み合わせのそれぞれに対して抽出した前記候補ノードが重複する場合に、重複する前記候補ノードに対して、前記候補ノードとしての優先順位を上げる
ことを特徴とする請求項６に記載の検証装置。
【請求項８】
データフロー解析部が、ソースコードを記憶したソースコード記憶部から前記ソースコードを取得し、取得した前記ソースコードに含まれる、データを入力する入力点ノード、データを出力する出力点ノード、及びデータに含まれる脆弱性の原因となる特殊文字を無害化する処理に対応する無害化ノードを、前記入力点ノード、前記出力点ノード、及び前記無害化ノードのそれぞれに対応する記述を示す記述情報を記憶するルール情報記憶部から取得した前記記述情報に基づいて抽出して、前記ソースコードのデータフローを解析するとともに、前記入力点ノードから前記出力点ノードまでのノードを含む前記データフローを示す有向グラフを生成するデータフロー解析ステップと、
第１の抽出部が、前記データフロー解析ステップによって生成された前記有向グラフと、前記無害化ノードとに基づいて、前記有向グラフに含まれる前記ノードのうちの、前記無害化ノードを通過しない経路上のノードである汚染ノードと、前記無害化ノードの下流に配置されたノードである下流ノードと、前記無害化ノードの上流に配置されたノードである上流ノードとを抽出する第１の抽出ステップと、
第２の抽出部が、前記第１の抽出ステップによって抽出された前記汚染ノードと前記下流ノードと前記上流ノードとに基づいて、前記無害化する処理を配置するノードの候補を示す候補ノードを抽出し、抽出した前記候補ノードに対応する前記ソースコード上の位置を示す情報を出力部に出力させる第２の抽出ステップと
を含むことを特徴とする検証方法。
【請求項９】
検証装置としてのコンピュータに、
データフロー解析部が、ソースコードを記憶したソースコード記憶部から前記ソースコードを取得し、取得した前記ソースコードに含まれる、データを入力する入力点ノード、データを出力する出力点ノード、及びデータに含まれる脆弱性の原因となる特殊文字を無害化する処理に対応する無害化ノードを、前記入力点ノード、前記出力点ノード、及び前記無害化ノードのそれぞれに対応する記述を示す記述情報を記憶するルール情報記憶部から取得した前記記述情報に基づいて抽出して、前記ソースコードのデータフローを解析するとともに、前記入力点ノードから前記出力点ノードまでのノードを含む前記データフローを示す有向グラフを生成するデータフロー解析ステップと、
第１の抽出部が、前記データフロー解析ステップによって生成された前記有向グラフと、前記無害化ノードとに基づいて、前記有向グラフに含まれる前記ノードのうちの、前記無害化ノードを通過しない経路上のノードである汚染ノードと、前記無害化ノードの下流に配置されたノードである下流ノードと、前記無害化ノードの上流に配置されたノードである上流ノードとを抽出する第１の抽出ステップと、
第２の抽出部が、前記第１の抽出ステップによって抽出された前記汚染ノードと前記下流ノードと前記上流ノードとに基づいて、前記無害化する処理を配置するノードの候補を示す候補ノードを抽出し、抽出した前記候補ノードに対応する前記ソースコード上の位置を示す情報を出力部に出力させる第２の抽出ステップと
を実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、検証装置、検証方法、及びプログラムに関する。
【背景技術】
【０００２】
近年、セキュリティの脆弱性について、プログラムの開発段階（例えば、ソースコードの段階）において、静的な解析（静的解析）を行う技術が知られている（例えば、特許文献１を参照）。特許文献１に記載の技術では、ソースコードのデータフローを解析し、この解析結果に基づいてセキュリティの脆弱性を抽出している。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００８−５０２０４６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
ところで、上述のような静的解析を行う技術において、Ｗｅｂアプリケーションの脆弱性をソースコードレベルで検証する手法として、セキュリティに特化した静的解析ツールとしての検証装置が広く知られている。このような検証装置は、例えば、ソースコード上の外部入力点（Source：ソース）から、画面出力点やデータベースへの処理要求（クエリー）が送信される点などのセキュリティ上考慮されるべき出力点（Sink：シンク）に至るデータフローを解析する。そして、検証装置は、データフローにおける全ての経路において、出力点に応じたエスケープ処理（Sanitizer：サニタイザ）が適用されているか否かを検証し、ソースコード上の脆弱性の可能性がある箇所を出力する。このような解析手法は、汚染解析（Taint Analysis）と呼ばれている。
【０００５】
しかしながら、上述の検証装置では、汚染解析を実施した結果として脆弱性の可能性がある箇所が発見された場合に、サニタイザを適切に配置するように修正する作業は、人間が注意深く行う必要がある。上述の検証装置では、例えば、ソースコードの規模や複雑度によって、入力点から出力点までの経路が膨大に検出されることがあり、このような場合に、サニタイザを適切に配置するように修正する作業にかかる作業工数が膨大になるという問題があった。また、上述の検証装置では、例えば、人手によってサニタイザを配置する場合に、１つの経路に誤って二重にサニタイザを配置してしまうことがある。このような場合には、サニタイザが二重に挿入されて、エスケープ処理が二重に実行されるため、プログラムは、本来出力されるべきデータを正しく出力することができないことがある。このように、上述の検証装置では、１つの経路に誤って二重にサニタイザを配置してしまうことがあるという問題があった。
【０００６】
本発明は、上記問題を解決すべくなされたもので、その目的は、作業工数を低減しつつ、サニタイザを適切に配置することができる検証装置、検証方法、及びプログラムを提供することにある。
【課題を解決するための手段】
【０００７】
上記問題を解決するために、本発明の一態様は、ソースコードを記憶したソースコード記憶部から前記ソースコードを取得し、取得した前記ソースコードに含まれる、データを入力する入力点ノード、データを出力する出力点ノード、及びデータに含まれる脆弱性の原因となる特殊文字を無害化する処理に対応する無害化ノードを、前記入力点ノード、前記出力点ノード、及び前記無害化ノードのそれぞれに対応する記述を示す記述情報を記憶するルール情報記憶部から取得した前記記述情報に基づいて抽出して、前記ソースコードのデータフローを解析するとともに、前記入力点ノードから前記出力点ノードまでのノードを含む前記データフローを示す有向グラフを生成するデータフロー解析部と、前記ソースコードのデータフローを解析するとともに、前記入力点ノードから前記出力点ノードまでのノードを含む前記データフローを示す有向グラフを生成するデータフロー解析部と、前記データフロー解析部が生成した前記有向グラフと、前記無害化ノードとに基づいて、前記有向グラフに含まれる前記ノードのうちの、前記無害化ノードを通過しない経路上のノードである汚染ノードと、前記無害化ノードの下流に配置されたノードである下流ノードと、前記無害化ノードの上流に配置されたノードである上流ノードとを抽出する第１の抽出部と、前記第１の抽出部が抽出した前記汚染ノードと前記下流ノードと前記上流ノードとに基づいて、前記無害化する処理を配置するノードの候補を示す候補ノードを抽出し、抽出した前記候補ノードに対応する前記ソースコード上の位置を示す情報を出力部に出力させる第２の抽出部とを備えることを特徴とする検証装置である。
【０００８】
また、本発明の一態様は、上記の検証装置において、前記第２の抽出部は、前記汚染ノードの集合から、前記下流ノードの集合及び前記上流ノードの集合を除外した候補集合に含まれるノードを、前記候補ノードとして抽出することを特徴とする。
【０００９】
また、本発明の一態様は、上記の検証装置において、前記第２の抽出部は、抽出した前記候補ノードのうち、前記有向グラフ上の経路において前記出力点ノードに最も近いノードを、最優先順位の候補ノードとして抽出することを特徴とする。
【００１０】
また、本発明の一態様は、上記の検証装置において、前記第２の抽出部は、抽出した前記候補ノードのうち、前記有向グラフ上の経路において分岐先となるノードに対して、前記候補ノードとしての優先順位を下げることを特徴とする。
【００１１】
また、本発明の一態様は、上記の検証装置において、前記第２の抽出部は、抽出した前記候補ノードのうち、前記有向グラフ上の経路において分岐の収束先となるノードに対して、前記候補ノードとしての優先順位を上げることを特徴とする。
【００１２】
また、本発明の一態様は、上記の検証装置において、前記第２の抽出部は、前記有向グラフが複数の入力点ノード又は複数の出力点ノードを含む場合に、前記入力点ノードと前記出力点ノードとの組み合わせのそれぞれに対して、前記候補ノードを抽出することを特徴とする。
【００１３】
また、本発明の一態様は、上記の検証装置において、前記第２の抽出部は、前記組み合わせのそれぞれに対して抽出した前記候補ノードが重複する場合に、重複する前記候補ノードに対して、前記候補ノードとしての優先順位を上げることを特徴とする。
【００１４】
また、本発明の一態様は、データフロー解析部が、ソースコードを記憶したソースコード記憶部から前記ソースコードを取得し、取得した前記ソースコードに含まれる、データを入力する入力点ノード、データを出力する出力点ノード、及びデータに含まれる脆弱性の原因となる特殊文字を無害化する処理に対応する無害化ノードを、前記入力点ノード、前記出力点ノード、及び前記無害化ノードのそれぞれに対応する記述を示す記述情報を記憶するルール情報記憶部から取得した前記記述情報に基づいて抽出して、前記ソースコードのデータフローを解析するとともに、前記入力点ノードから前記出力点ノードまでのノードを含む前記データフローを示す有向グラフを生成するデータフロー解析ステップと、第１の抽出部が、前記データフロー解析ステップによって生成された前記有向グラフと、前記無害化ノードとに基づいて、前記有向グラフに含まれる前記ノードのうちの、前記無害化ノードを通過しない経路上のノードである汚染ノードと、前記無害化ノードの下流に配置されたノードである下流ノードと、前記無害化ノードの上流に配置されたノードである上流ノードとを抽出する第１の抽出ステップと、第２の抽出部が、前記第１の抽出ステップによって抽出された前記汚染ノードと前記下流ノードと前記上流ノードとに基づいて、前記無害化する処理を配置するノードの候補を示す候補ノードを抽出し、抽出した前記候補ノードに対応する前記ソースコード上の位置を示す情報を出力部に出力させる第２の抽出ステップと含むことを特徴とする検証方法である。
【００１５】
また、本発明の一態様は、検証装置としてのコンピュータに、データフロー解析部が、ソースコードを記憶したソースコード記憶部から前記ソースコードを取得し、取得した前記ソースコードに含まれる、データを入力する入力点ノード、データを出力する出力点ノード、及びデータに含まれる脆弱性の原因となる特殊文字を無害化する処理に対応する無害化ノードを、前記入力点ノード、前記出力点ノード、及び前記無害化ノードのそれぞれに対応する記述を示す記述情報を記憶するルール情報記憶部から取得した前記記述情報に基づいて抽出して、前記ソースコードのデータフローを解析するとともに、前記入力点ノードから前記出力点ノードまでのノードを含む前記データフローを示す有向グラフを生成するデータフロー解析ステップと、第１の抽出部が、前記データフロー解析ステップによって生成された前記有向グラフと、前記無害化ノードとに基づいて、前記有向グラフに含まれる前記ノードのうちの、前記無害化ノードを通過しない経路上のノードである汚染ノードと、前記無害化ノードの下流に配置されたノードである下流ノードと、前記無害化ノードの上流に配置されたノードである上流ノードとを抽出する第１の抽出ステップと、第２の抽出部が、前記第１の抽出ステップによって抽出された前記汚染ノードと前記下流ノードと前記上流ノードとに基づいて、前記無害化する処理を配置するノードの候補を示す候補ノードを抽出し、抽出した前記候補ノードに対応する前記ソースコード上の位置を示す情報を出力部に出力させる第２の抽出ステップとを実行させるためのプログラムである。
【発明の効果】
【００１６】
本発明によれば、作業工数を低減しつつ、サニタイザを適切に配置することができる。また、二重にサニタイザを配置することのない適切な候補ノードを抽出するので、二重にサニタイザが挿入されることを未然に回避することができる。
【図面の簡単な説明】
【００１７】
【図１】本発明に係る汚染解析の一例を示す模式図である。
【図２】脆弱性の原因となる特殊文字とサニタイザによる無害化処理（エスペープ処理）の一例を示す図である。
【図３】第１の実施形態による検証装置の一例を示すブロック図である。
【図４】本実施形態におけるルール情報記憶部のデータ構成の一例を示す図である。
【図５】本実施形態におけるグラフ情報記憶部のデータ構成の一例を示す図である。
【図６】本実施形態における抽出情報記憶部のデータ構成の一例を示す図である。
【図７】本実施形態における候補情報記憶部のデータ構成の一例を示す図である。
【図８】本実施施形態における検証装置の動作の一例を示すフローチャートである。
【図９】本実施形態におけるデータフロー解析の一例を示す模式図である。
【図１０】本実施形態における有向グラフの一例を示す模式図である。
【図１１】本実施形態における有向グラフを示すリスト情報の一例を示す模式図である。
【図１２】本実施形態におけるデータフロー解析結果の一例を示す図である。
【図１３】第１の実施形態におけるサニタイザの候補抽出処理の一例を示すフローチャートである。
【図１４】本実施形態におけるサニタイザの候補抽出処理の手順（下流ノードの抽出）の一例を説明する第１の図である。
【図１５】本実施形態におけるサニタイザの候補抽出処理の手順（上流ノードの抽出）の一例を説明する第２の図である。
【図１６】本実施形態におけるサニタイザの候補抽出処理の手順（汚染ノードの抽出）の一例を説明する第３の図である。
【図１７】本実施形態におけるサニタイザの候補抽出処理の手順（候補ノードの抽出）の一例を説明する第４の図である。
【図１８】本実施形態における検証装置の効果を説明する図である。
【図１９】従来の汚染解析によるサニタイザの二重挿入の一例を示す図である。
【図２０】第２の実施形態におけるサニタイザの候補抽出処理の一例を説明する図である。
【図２１】第２の実施形態におけるサニタイザの候補抽出処理の一例を示すフローチャートである。
【図２２】第３の実施形態におけるサニタイザの候補抽出処理の一例を説明する図である。
【図２３】第３の実施形態におけるサニタイザの候補抽出処理の一例を示すフローチャートである。
【発明を実施するための形態】
【００１８】
まず、本発明の実施形態を説明する前に、本明細書で使用する用語を以下、定義する。
「静的解析」とは、プログラムを動作させずに、ソースコードに対して行う解析のことであり、後述する「データフロー解析」も「静的解析」の１つである。
「データフロー解析」とは、プログラム内のあるデータ（変数、オブジェクト、等）に着目した際の、そのデータに関する処理の流れを追跡する解析のことである。
【００１９】
「汚染解析（Taint Analysis）」とは、データフロー解析の一種であり、ソース（Source）とシンク（Sink）との間のデータフローを解析する解析手法である。「汚染解析」では、ソースはすべて汚染されていると考え、データフローの経路（パス）の途中でサニタイザ（Sanitizer）を通れば無害化されると考える。この考えから、「汚染解析」では、ソースからシンクまでの可能な全ての経路において、無害化されたデータがシンクに到達する場合に、「安全」と判定され、可能な全ての経路のうちの１つでもサニタイザを通過しない経路がある場合に、「危険」と判定される。
【００２０】
例えば、図１に示す有向グラフは、汚染解析の一例を示している。
図１において、データフローグラフ（有向グラフＧ１）は、ソースノードｓｃ１（「Ｓｏｕｒｃｅ１」）とシンクノードｓｋ１（「Ｓｉｎｋ１」）との間のデータフローを示す有向グラフである。このデータフローグラフ（有向グラフＧ１）は、ノードｎ０１〜ｎ３０を含んでおり、このノードｎ０１〜ｎ３０のうちの、ノードｎ０５、ノードｎ０６、ノードｎ１６、及びノードｎ３０がサニタイザに対応するノード（無害化ノード）である。なお、ここで各「ノード」は、ソースコードにおけるデータに関する処理に対応している。また、上述のデータフローグラフ（有向グラフＧ１）に含まれる「ノード」には、ソースノードｓｃ１、シンクノードｓｋ１、及び無害化ノードも含まれる。
【００２１】
図１に示す例では、サニタイザを通過しない経路があり、ノードｎ１２〜ｎ１４は、サニタイザを通過しないデータを処理する可能性があるため、シンクノードｓｋ１は、「危険」と判定される。
【００２２】
「ソース（Source）」とは、外部から入力されるデータがプログラムに取り込まれる処理、又はその処理が記述されたプログラム上の位置を示している。なお、「ソース（Source）」に対応するソースコードの位置は、以下の説明において、「ソースノード」（入力点ノード）と呼ぶことがある。
【００２３】
「シンク（Sink）」とは、ユーザの入力がプログラム内部で加工され、画面又はデータベースへ出力される処理又はその処理が記述されたプログラム上の位置を示している。具体的に、「シンク（Sink）」とは、もし、そこで危険な文字列が出力された場合に意図しないセキュリティ侵害が発生する可能性がある処理、又はその処理が記述されたプログラム上の位置である。なお、「シンク（Sink）」に対応するソースコードの位置は、以下の説明において、「シンクノード」（出力点ノード）と呼ぶことがある。
【００２４】
「サニタイザ（Sanitizer）」とは、ユーザの入力に含まれる文字のうち、そのままシンクに出力すると脆弱性が発現してしまう可能性がある特定の文字をエスケープする処理を示している。具体的に、「サニタイザ（Sanitizer）」とは、シンクに渡される可能性があるデータが、シンクで出力された後に意図しないセキュリティ侵害を発生させないように、シンクの出力先で特殊な意味を持つ文字列（特殊文字）を、それをエスケープした文字列に変換する関数（又はメソッド）、又はそれが記述されたプログラム上の位置を示している。つまり、「サニタイザ（Sanitizer）」とは、データに含まれる脆弱性の原因となる特殊文字を無害化する処理である。なお、「サニタイザ（Sanitizer）」に対応するソースコードの位置は、以下の説明において、「サニタイザノード」（無害化ノード）と呼ぶことがある。
【００２５】
なお、「サニタイザ」は、図２に示すように、シンクの種類によって、異なる処理となる。
図２は、脆弱性の原因となる特殊文字とサニタイザによる無害化処理（エスケープ処理）の一例を示す図である。
この図において、表の縦列の項目は、順に（ａ）「出力先」、（ｂ）「エスケープ処理名」、（ｃ）「対象脆弱性」、（ｄ）「エスケープ対象文字」、（ｅ）「エスケープ結果」、及び（ｆ）「二重エスケープ結果」を示している。ここで、（ａ）「出力先」は、シンクの種類を示し、（ｃ）「対象脆弱性」は脆弱性の種類を示している。また、（ｄ）「エスケープ対象文字」は、脆弱性の原因となる特殊文字を示し、（ｅ）「エスケープ結果」は、サニタイザの処理を実行した場合の結果（無害化した結果）を示している。
また、この図において、表は、（ａ）「出力先」として、「ＨＴＭＬ」（Hyper Text Markup Language）、「Ｊａｖａｓｃｒｉｐｔ（登録商標）」（ジャバスクリプト）、及び「ＳＱＬ文」（エスキューエル文）の３つの種類について示している。
また、
【００２６】
図２に示す例では、「ＨＴＭＬ」に対応する（ｂ）「エスケープ処理名」が「ＨＴＭＬエスケープ」であり、（ｃ）「対象脆弱性」が「クロスサイトスクリプティング」である。また、「ＨＴＭＬ」に対応する（ｄ）「エスケープ対象文字」（特殊文字）は、「＆」、「＜」、「＜」、「”」、及び「’」であり、それぞれの特殊文字に対して、サニタイザの処理を実行した結果の文字列が、順に「＆ａｍｐ；」、「＆ｌｔ；」、「＆ｇｔ；」、「＆ｑｕｏｔ；」、及び「＆＃３９；」であることを示している。例えば、「ＨＴＭＬ」に対応するサニタイザの処理は、「＆」という文字がデータに含まれる場合に「＆ａｍｐ；」という文字列に変換する処理である。
【００２７】
また、「Ｊａｖａｓｃｒｉｐｔ」に対応する（ｂ）「エスケープ処理名」が「Ｊａｖａｓｃｒｉｐｔエスケープ」であり、（ｃ）「対象脆弱性」が「クロスサイトスクリプティング」である。また、「Ｊａｖａｓｃｒｉｐｔ」に対応する（ｄ）「エスケープ対象文字」（特殊文字）は、「’」、「”」、「￥」、「０ｘ０ｄ」、「０ｘ０ａ」、「／」、「＞」、及び「＜」であり、それぞれの特殊文字に対して、サニタイザの処理を実行した結果の文字列が、順に「￥’」、「￥”」、「￥￥」、「￥ｒ」、「￥ｎ」、「￥／」、「￥ｘ３ｅ」、及び「￥ｘ３ｃ」であることを示している。例えば、「Ｊａｖａｓｃｒｉｐｔ」に対応するサニタイザの処理は、「’」という文字がデータに含まれる場合に「￥’」という文字列に変換する処理である。
また、「ＳＱＬ文」に対応する（ｂ）「エスケープ処理名」が「ＳＱＬエスケープ」であり、（ｃ）「対象脆弱性」が「ＳＱＬインジェクション」である。また、「ＳＱＬ文」に対応する（ｄ）「エスケープ対象文字」（特殊文字）は、「’」であり、この特殊文字に対して、サニタイザの処理を実行した結果の文字列が、「’’」であることを示している。
【００２８】
このような定義を前提に、以下、本発明の一実施形態による検証装置１について、図面を参照して説明する。
［第１の実施形態］
図３は、第１の実施形態による検証装置１の一例を示すブロック図である。
図３において、検証装置１は、入力部１０、ソースコード記憶部２０、検証記憶部３０、表示部４０、及び制御部５０を備えている。
本実施形態における検証装置１は、データフロー解析により、データフローの全経路のうちの、サニタイザが挿入されていない経路を抽出するとともに、ソースコード上にサニタイザを挿入する候補位置（ソースコードのファイル名及び行番号）を出力する。
【００２９】
入力部１０は、例えば、キーボードなどの入力装置であり、ユーザの操作に基づいて、検証装置１を操作する各種情報が入力される。入力部１０は、ユーザによって入力された情報を制御部５０に出力する。
【００３０】
ソースコード記憶部２０は、検証対象となるソースコードを記憶する。ここで、ソースコードは、プログラムを記述したファイルであり、ソースコードは、複数のファイルに分割されて、ソースコード記憶部２０に記憶されていてもよい。
【００３１】
検証記憶部３０は、検証装置１がプログラムの脆弱性を検証するための各種情報を記憶する。検証記憶部３０は、ルール情報記憶部３１、グラフ情報記憶部３２、抽出情報記憶部３３、及び候補情報記憶部３４を備えている。
【００３２】
ルール情報記憶部３１は、脆弱性を検証するための診断ルール情報を記憶する。ルール情報記憶部３１は、例えば、図４に示すように、「ソース情報」、「シンク情報」、及び「サニタイザ情報」を予め記憶している。
【００３３】
図４は、本実施形態におけるルール情報記憶部３１のデータ構成の一例を示す図である。
図４に示す例では、「ソース情報」（ソース記述情報）とは、ソースに対応する処理（関数、又はメソッド）の記述情報であり、例えば、“ｇｅｔＰａｒａｍｅｔｅｒ（）”などの記述である。
また、「シンク情報」（シンク記述情報）とは、シンクに対応する処理（関数、又はメソッド）の記述情報であり、例えば、“ｇｅｔＷｒｉｔｅｒ（）”、“ｇｅｔＯｕｔｐｕｔＳｔｒｅａｍ（）”などの記述である。
また、「サニタイザ情報」（無害化記述情報）とは、サニタイザに対応する処理（関数、又はメソッド）の記述情報であり、例えば、“ｓａｎｉｔｉｚｅＳｔｒｉｎｇ（）”などの記述である。
【００３４】
図３に戻り、グラフ情報記憶部３２は、制御部５０がデータフロー解析により生成したデータフローグラフ（有向グラフ）を記憶する。グラフ情報記憶部３２は、例えば、図５に示すように、「ソースノード情報」と「シンクノード情報」と「有向グラフ情報」とを関連付けて記憶している。
【００３５】
図５は、本実施形態におけるグラフ情報記憶部３２のデータ構成の一例を示す図である。
この図において、「ソースノード情報」は、ソースノードを識別する情報を示している。また、「シンクノード情報」は、シンクノードを識別する情報を示している。また、「有向グラフ情報」は、データフローグラフである有向グラフをデータのリストとして表現する情報を示している。なお、「有向グラフ情報」は、エッジの接続元のノードと接続先のノードとを関連付けた情報を複数含んだリストにより有向グラフを表現している。この「有向グラフ情報」の詳細については、後述する。
【００３６】
再び、図３に戻り、抽出情報記憶部３３は、サニタイザの候補であるサニタイザノードを抽出するための処理に用いる各種情報を記憶する。抽出情報記憶部３３は、例えば、図６に示すように、「ソースノード情報」と、「シンクノード情報」と、「抽出情報」とを関連付けて記憶する。
【００３７】
図６は、本実施形態における抽出情報記憶部３３のデータ構成の一例を示す図である。
この図において、「ソースノード情報」は、ソースノードを識別する情報を示している。また、「シンクノード情報」は、シンクノードを識別する情報を示している。また、「抽出情報」は、「サニタイザノード情報」と、「汚染ノード情報」と、「上流ノード情報」と、「下流ノード情報」とを含んでいる。すなわち、抽出情報記憶部３３は、「抽出情報」として、「サニタイザノード情報」と、「汚染ノード情報」と、「上流ノード情報」とを関連付けて記憶する。
ここで、「サニタイザノード情報」は、サニタイザに対応するノードを示す情報であり、「汚染ノード情報」は、ソースノードとシンクノードとの間の複数の経路のうちの、サニタイザノードを通過しない経路に含まれるノードを示す情報である。また、「上流ノード情報」は、ソースノードとシンクノードとの間のノードのうち、サニタイザノードの上流に位置するノードを示す情報であり、「下流ノード情報」は、ソースノードとシンクノードとの間のノードのうち、サニタイザノードの下流に位置するノードを示す情報である。
【００３８】
図６に示す例では、例えば、「ソースノード情報」が“Ｓｏｕｒｃｅ１（ｓｃ１）”であり、「シンクノード情報」が“Ｓｉｎｋ１（ｓｋ１）”である場合に対応する「サニタイザノード情報」が“ｎ０５、ｎ０６、ｎ１６、ｎ３０、・・・”であり、「汚染ノード情報」が“ｎ０１、ｎ０２、ｎ０３、ｎ０８、・・・”であることを示している。また、この場合に、「上流ノード情報」が“ｎ０１、ｎ０２、ｎ０３、ｎ０４、・・・”であり、「下流ノード情報」が“ｎ０７、ｎ１２、ｎ１３、ｎ１４”であることを示している。
【００３９】
再び、図３に戻り、候補情報記憶部３４は、制御部５０が抽出したサニタイザを挿入する候補ノードを示す情報を記憶する。候補情報記憶部３４は、例えば、図７に示すように、「ソースノード情報」と、「シンクノード情報」と、「候補ノード情報」とを関連付けて記憶する。
【００４０】
図７は、本実施形態における候補情報記憶部３４のデータ構成の一例を示す図である。
この図において、「ソースノード情報」は、ソースノードを識別する情報を示している。また、「シンクノード情報」は、シンクノードを識別する情報を示している。また、「候補ノード情報」は、サニタイザを挿入する候補ノードを示す情報である。
図７に示す例では、例えば、「ソースノード情報」が“Ｓｏｕｒｃｅ１（ｓｃ１）”であり、「シンクノード情報」が“Ｓｉｎｋ１（ｓｋ１）”である場合に対応する「候補ノード情報」が“ｎ０８、ｎ０９、ｎ１０、ｎ１１”であることを示している。
【００４１】
再び、図３に戻り、表示部４０は、例えば、表示ディスプレイなどの表示装置であり、制御部５０が解析した結果、及びサニタイザを挿入する候補の位置などの情報を表示する。
【００４２】
制御部５０は、例えば、ＣＰＵ（Central Processing Unit）などを含むプロセッサであり、検証装置１を統括的に制御する。検証装置１は、例えば、ソースコード記憶部２０に記憶されているソースコードに基づいて、データフロー解析を実行し、解析したデータフローの全経路のうちの、サニタイザが挿入されていない経路を抽出するとともに、ソースコード上にサニタイザを挿入する候補位置（ソースコードのファイル名及び行数位置）を出力する。
また、制御部５０は、データフロー解析部５１、ノード抽出部６０、候補抽出部５５、及び結果出力部５６を備えている。
【００４３】
データフロー解析部５１は、ソースコードのデータフローを解析し、ソースノードから、シンクノードまでのデータフローに対応する有向グラフを生成する。具体的に、データフロー解析部５１は、ソースコード記憶部２０に記憶されているソースコード（ソースコードファイル）を読み込み、ソースノード、シンクノード、及びサニタイザノードを抽出する。なお、データフロー解析部５１は、ソースノードを抽出する際に、ルール情報記憶部３１か記憶するソース記述情報（図４の「ソース情報」参照）に基づいて、ソースコード上のソースノードを判定する。また、データフロー解析部５１は、シンクノードを抽出する際に、シンク記述情報（図４の「シンク情報」参照）に基づいて、ソースコード上のシンクノードを判定する。また、データフロー解析部５１は、サニタイザノードを抽出する際に、無害化記述情報（図４の「サニタイザ情報」参照）に基づいて、ソースコード上のサニタイザノードを判定する。
【００４４】
データフロー解析部５１は、図６に示すように、抽出したサニタイザノードの「サニタイザノード情報」を、「ソースノード情報」及び「シンクノード情報」に関連付けて抽出情報記憶部３３に記憶させる。なお、ここでの「サニタイザノード情報」は、対応する「ソースノード情報」の示すソースノードと、「シンクノード情報」が示すノードとの間の経路に配置されているサニタイザノードを示している。
【００４５】
また、データフロー解析部５１は、読み込んだソースコードと、抽出したソースノード、シンクノード、及びサニタイザノードとに基づいて、データに関する処理の流れを追跡し、ソースコードのデータフローが有する経路のうちのサニタイザを通過しない経路（危険経路）を解析する（データフロー解析を行う）。また、データフロー解析部５１は、解析したソースノードからシンクノードまでのノードを含むデータフローに対応するデータフローグラフ（有向グラフ）を生成し、生成したデータフローグラフをグラフ情報記憶部３２に記憶させる。例えば、データフロー解析部５１は、図５に示すように、「ソースノード情報」と、「シンクノード情報」と、生成したデータフローグラフの「有向グラフ情報」とを関連付けて記憶する。
データフロー解析部５１によるデータフロー解析処理、及び有向グラフの生成処理の詳細については、後述する。
【００４６】
ノード抽出部６０（第１の抽出部）は、グラフ情報記憶部３２が記憶する有向グラフと、データフロー解析部５１が抽出したサニタイザノードとに基づいて、有向グラフに含まれるノードのうちの、汚染ノードと、下流ノードと、上流ノードとを抽出する。ここで、汚染ノードとは、有向グラフに含まれるノードのうちの、サニタイザノードを通過しない経路上のノードのことである。また、下流ノードとは、有向グラフに含まれるノードのうちの、無害化ノードの下流に配置されたノードのことである。また、上流ノードとは、有向グラフに含まれるノードのうちの、無害化ノードの上流に配置されたノードのことである。
ノード抽出部６０は、図６に示すように、抽出した汚染ノードと下流ノードと上流ノードとを関連付けて、抽出情報記憶部３３に記憶させる。
また、ノード抽出部６０は、汚染ノード抽出部５２、下流ノード抽出部５３、及び上流ノード抽出部５４を備えている。
【００４７】
汚染ノード抽出部５２は、グラフ情報記憶部３２から取得した有向グラフと、抽出情報記憶部３３から取得したサニタイザノードとに基づいて、有向グラフに含まれるノードのうちの、汚染ノードを抽出する。具体的に、汚染ノード抽出部５２は、有向グラフに含まれるデータフローの全経路のうちから、サニタイザノードを通過する経路を除外し、残った経路を危険経路（汚染経路）として抽出する。そして、汚染ノード抽出部５２は、抽出した危険経路に含まれるノードのうちの、ソースノード及びシンクノードを除いたノードを汚染ノードとして抽出する。
【００４８】
下流ノード抽出部５３は、グラフ情報記憶部３２から取得した有向グラフと、抽出情報記憶部３３から取得したサニタイザノードとに基づいて、有向グラフに含まれるノードのうちの、下流ノードを抽出する。具体的に、下流ノード抽出部５３は、有向グラフに含まれる１つのサニタイザノードからシンクノードまでの全ての経路に含まれるノードを下流ノードとして抽出する。また、下流ノード抽出部５３は、この１つのサニタイザノードに対する下流ノードの抽出する処理を全てのサニタイザについて、同様に実行し、有向グラフに含まれるノードのうちの、全てのサニタイザに対する下流ノードを抽出する。
【００４９】
上流ノード抽出部５４は、グラフ情報記憶部３２から取得した有向グラフと、抽出情報記憶部３３から取得したサニタイザノードとに基づいて、上流ノードを抽出する。具体的に、上流ノード抽出部５４は、有向グラフに含まれる１つのサニタイザノードからソースノードまで遡る全ての経路に含まれるノードを上流ノードとして抽出する。また、上流ノード抽出部５４は、この１つのサニタイザノードに対する上流ノードの抽出する処理を全てのサニタイザについて、同様に実行し、有向グラフに含まれるノードのうちの、全てのサニタイザに対する上流ノードを抽出する。
【００５０】
候補抽出部５５（第２の抽出部）は、抽出情報記憶部３３が記憶する汚染ノードと下流ノードと上流ノードとに基づいて、サニタイザを配置するノードの候補を示す候補ノードを抽出する。具体的に、候補抽出部５５は、汚染ノードの集合から、下流ノードの集合及び上流ノードの集合を除外した候補集合に含まれるノードを、候補ノードとして抽出する。また、候補抽出部５５は、図７に示すように、抽出した候補ノードを示す「候補ノード情報」と、「ソースノード情報」と、「シンクノード情報」とを関連付けて、候補情報記憶部３４に記憶させる。また、ノード候補抽出部５５は、抽出した候補ノードに対応するソースコード上の位置を示す情報（候補ノード位置情報）を結果出力部５６に出力させる。ここで、ソースコードの位置（候補ノード位置情報）とは、ソースコードのファイル名とソースコード上の行番号とを含む情報である。
【００５１】
また、候補抽出部５５は、候補ノードとして抽出したノードのうちで、サニタイザノードを配置する優先順位付けを実行してもよい。例えば、候補抽出部５５は、抽出した候補ノードのうち、有向グラフ上の経路においてシンクノードに最も近いノードを、最優先順位の候補ノードとして抽出する。また、例えば、候補抽出部５５は、抽出した候補ノードのうち、有向グラフ上の経路において分岐先となるノードに対して、候補ノードとしての優先順位を下げる。これは、分岐先となるノードにサニタイザを配置する場合、複数のノードにサニタイザを配置する必要が生じるため、候補抽出部５５は、候補ノードとしての優先順位を下げる。
また、候補抽出部５５は、例えば、抽出した候補ノードのうち、有向グラフ上の経路において分岐の収束先となるノードに対して、候補ノードとしての優先順位を上げる。これは、分岐の収束先となるノードにサニタイザを配置する場合、１つのサニタイザを配置することで複数の経路を無害化することができるため、候補抽出部５５は、候補ノードとしての優先順位を上げる。
【００５２】
結果出力部５６（出力部）は、候補抽出部５５からの指示に基づいて、候補抽出部５５が抽出した候補ノードに対応するソースコード上の位置を示す情報（候補ノード位置情報）を表示部４０に出力し、表示部４０に、この候補ノード位置情報を表示させる。
【００５３】
次に、本実施形態における検証装置１の動作について、図面を参照して説明する。
まず、検証装置１の全体の動作について説明する。
図８は、本実施形態における検証装置１の動作の一例を示すフローチャートである。
検証装置１は、ユーザによって、入力部１０から検証対象となるソースコードが指定されると、検証処理を開始する。
【００５４】
図８において、検証装置１は、まず、ソースコードを取得し、データフロー解析をする（ステップＳ１０１）。すなわち、検証装置１のデータフロー解析部５１は、ソースコード記憶部２０から検証対象となるソースコード（ソースコードファイル）を取得し、取得したソースコードに含まれるソースノード、シンクノード、及びサニタイザノードを抽出する。なお、データフロー解析部５１は、ソースコードの記述の中から、ルール情報記憶部３１が記憶するソース記述情報、シンク記述情報、及び無害化記述情報を検索することにより、ソースノード、シンクノード、及びサニタイザノードを抽出する。データフロー解析部５１は、図６に示すように、抽出したサニタイザノードの「サニタイザノード情報」を、「ソースノード情報」及び「シンクノード情報」に関連付けて抽出情報記憶部３３に記憶させる。
【００５５】
また、データフロー解析部５１は、ソースコードのデータに関する処理の流れ（データフロー）を追跡し、データフローが有する経路のうちのサニタイザを通過しない経路を抽出し、ソースコードが安全であるか否かを判定する。
ここで、図９を参照して、データフロー解析部５１によるデータフロー解析処理について詳細に説明する。
【００５６】
図９は、本実施形態におけるデータフロー解析の一例を示す模式図である。
図９において、ソースコードＳ１は、解析対象となるソースコードを示している。この図に示す例では、ソースコードＳ１は、行番号“０１”から行番号“１２”までの１２行のプログラムであり、行番号“０１”に対応するノードＮ１がソースノードを示している。また、行番号“０７”に対応するノードＮ２がサニタイザノードを示し、行番号“１２”に対応するノードＮ４がシンクノードを示している。
このようなソースコードＳ１に対して、データフロー解析部５１は、まず、ルール情報記憶部３１を参照し、ソースノード、シンクノード、及びサニタイザノードを抽出する。例えば、ノードＮ１の“ｒｅｑ．ｇｅｔＰａｒａｍｅｔｅｒ（”ｎａｍｅ”）；”は、図４に示す「ソース情報」のソース記述情報の“ｇｅｔＰａｒａｍｅｔｅｒ（）”と一致するので、データフロー解析部５１は、ノードＮ１をソースノードとして抽出する。また、同様に、データフロー解析部５１は、ノードＮ２をサニタイザノードとして抽出し、ノードＮ４をシンクノードとして抽出する。
【００５７】
このように、ソースノード、シンクノード、及びサニタイザノードを抽出した後に、データフロー解析部５１は、データフロー解析として、データに関する処理の流れを追跡する。この例では、データに関する処理の流れは、データＤ１（ソース）→データＤ２→データＤ３→データＤ４→データＤ７（シンク）となる経路Ｋ１と、データＤ１（ソース）→データＤ２→データＤ５→データＤ６→データＤ７（シンク）となる経路Ｋ２との２つの経路がある。この場合、データフロー解析部５１は、データフローを解析し、データフローグラフＦ１のよう有向グラフを生成する。すなわち、データフロー解析部５１は、データフローグラフＦ１として、ノードＮ１→ノードＮ２→ノードＮ４の経路Ｋ１と、ノードＮ１→ノードＮ３→ノードＮ４の経路Ｋ２との２つの経路を有する有向グラフを生成する。なお、この例では、ソースコードＳ１の行番号“０６”は、分岐命令であるため、データフローグラフＦ１は、行番号“０７”のノードＮ２と、行番号“０９”のノードＮ３とに分岐する。
【００５８】
また、この図の例では、経路Ｋ１は、サニタイザノード（ノードＮ２）を通過しているため、安全な経路であるが、経路Ｋ２は、サニタイザノードを通過していないため、危険な経路（危険経路）であり、結果として、データフロー解析部５１は、ソースコードＳ１全体としては、「危険」と判定する。
【００５９】
図８のフローに戻り、ステップＳ１０２において、データフロー解析部５１は、有向グラフを生成する。具体的に、データフロー解析部５１は、解析したソースノードからシンクノードまでのデータフローに対応するデータフローグラフ（有向グラフ）を生成し、生成したデータフローグラフをグラフ情報記憶部３２に記憶させる。例えば、データフロー解析部５１は、図５に示すように、「ソースノード情報」と、「シンクノード情報」と、生成したデータフローグラフの「有向グラフ情報」とを関連付けて記憶する。
ここで、図１０を参照して、データフロー解析部５１による有向グラフ、及び、「有向グラフ情報」を生成する処理について説明する。
【００６０】
図１０は、本実施形態における有向グラフの一例を示す模式図である。
また、図１０は、本実施形態における有向グラフを示すリスト情報（「有向グラフ情報」）の一例を示す模式図である。
【００６１】
図１０において、有向グラフＦ２は、ノードｎ１〜ノードｎ６を有し、ノードｎ１からノードｎ６にデータ処理が流れるデータフローグラフを示している。
また、図１１に示すリスト情報Ｌ１は、図１０に示す有向グラフＦ２を表現する情報である。図１１において、リスト情報Ｌ１は、接続元のノードと接続先のノードとを対応付けた構成を含んでいる。
【００６２】
例えば、リスト情報Ｌ１の１行目は、ノードｎ１を接続元として、ノードｎ１から接続される各ノード（ここでは、ノードｎ２、ノードｎ３）を示している。また、リスト情報Ｌ１の２行目は、ノードｎ２を接続元として、ノードｎ２から接続される各ノード（ここでは、ノードｎ４、ノードｎ５）を示している。同様に、リスト情報Ｌ１の３行目は、ノードｎ３を接続元として、ノードｎ３から接続される各ノード（ここでは、ノードｎ６）を示し、リスト情報Ｌ１の４行目は、ノードｎ４を接続元として、ノードｎ４から接続される各ノード（ここでは、ノードｎ６）を示している。また、リスト情報Ｌ１の５行目は、ノードｎ５を接続元として、ノードｎ５から接続される各ノード（ここでは、ノードｎ６）を示している。
【００６３】
このように、リスト情報Ｌ１は、有向グラフＦ２を表現する情報であり、データフロー解析部５１は、有向グラフＦ２に基づいて、リスト情報Ｌ１のような情報を生成し、生成した情報を「有向グラフ情報」として、グラフ情報記憶部３２に記憶させる。
【００６４】
なお、図８のステップＳ１０２において、データフロー解析部５１は、生成した有向グラフ（データフローグラフ）をデータフロー解析結果として、結果出力部５６を介して表示部４０に表示させる。また、データフロー解析結果を表示させる際に、データフロー解析部５１は、図１２に示すように、ユーザの確認を容易にするように、危険経路のみを表示するようにしてもよい。
【００６５】
図１２は、本実施形態におけるデータフロー解析結果の一例を示す図である。
この図において、有向グラフＧ１は、図１に示した有向グラフと同一の構成であり、ソースノードｓｃ１、ノードｎ０１〜ノードｎ３０、及びシンクノードｓｋ１を有している。また、この図において、サブグラフＳＧ１が危険経路であり、領域ＮＡ１及び領域ＮＡ１に含まれるノードは、安全が確認されているノードである。
図１２に示す例では、データフロー解析部５１は、データフロー解析結果として、サブグラフＳＧ１を表示部４０に表示させる。
【００６６】
再び、図８のフローに戻り、ステップＳ１０３において、検証装置１は、候補ノードの抽出処理（サニタイザの候補抽出処理）を実行する。すなわち、検証装置１のノード抽出部６０及び候補抽出部５５が、サニタイザを配置（挿入）する候補ノードを抽出する。この候補ノードの抽出処理については、図１３のフローチャートを参照して後述する。
【００６７】
次に、検証装置１は、ステップＳ１０３において抽出した候補ノードのソースコード上の位置情報を出力する（ステップＳ１０４）。すなわち、検証装置１の結果出力部５６は、候補抽出部５５からの指示に基づいて、候補抽出部５５が抽出した候補ノードに対応するソースコード上の位置を示す情報（位置情報）を表示部４０に出力し、表示部４０に、この位置情報を表示させる。ここで、候補ノードに対応するソースコード上の位置を示す情報とは、例えば、候補ノードを含むソースコードのファイル名、及び候補ノードに対応する行番号であり、結果出力部５６は、候補ノードを含むソースコードのファイル名、及び候補ノードに対応する行番号を表示部４０にさせる。
なお、表示部４０にこの位置情報を表示する際に、結果出力部５６は、データフロー解析の結果、及びデータフローグラフとともに、この位置情報を表示させてもよい。また、結果出力部５６は、表示部４０にこの位置情報を表示する際に、対応する候補ノードを含むソースコードの記述内容を表示し、候補ノードに対応する位置に、マークなどの情報を表示させてもよい。
検証装置１は、ステップＳ１０４の処理を実行後、検証処理を終了する。
【００６８】
次に、本実施形態における検証装置１の検証処理の１つ（図８のステップＳ１０３の処理）である制御部５０によるサニタイザの候補抽出処理について説明する。
図１３は、本実施形態におけるサニタイザの候補抽出処理の一例を示すフローチャートである。
また、図１４〜図１７は、本実施形態におけるサニタイザの候補抽出処理の手順の一例を説明する図である。
【００６９】
なお、図１４〜図１７において、有向グラフＧ１は、図１に示した有向グラフと同一の構成であり、ソースノードｓｃ１、ノードｎ０１〜ノードｎ３０、及びシンクノードｓｋ１を有している。以下、図１４〜図１７の有向グラフＧ１を参照しながら、図１３に示すサニタイザの候補抽出処理について説明する。
本実施形態では、ソースノードが１つであり、シンクノードが１つである場合の候補抽出処理の一例について説明する。また、サニタイザは、図２に示すように、出力先であるシンクの種類により処理が異なるが、本実施形態では、サニタイザは、１つの種類のシンクに対応するサニタイザである場合について説明する。
【００７０】
図１３において、まず、制御部５０のノード抽出部６０は、下流ノードを抽出する（ステップＳ２０１）。具体的に、ノード抽出部６０の下流ノード抽出部５３は、グラフ情報記憶部３２から取得した有向グラフと、抽出情報記憶部３３から取得したサニタイザノードとに基づいて、有向グラフに含まれるノードのうちの、下流ノードを抽出する。
【００７１】
例えば、図１４に示す例では、下流ノード抽出部５３は、ソースノードｓｃ１及びシンクノードｓｋ２に対応する「有向グラフ情報」をグラフ情報記憶部３２から取得するとともに、ソースノードｓｃ１及びシンクノードｓｋ２に対応する「サニタイザノード情報」を抽出情報記憶部３３から取得する。下流ノード抽出部５３は、取得した「有向グラフ情報」の中から「サニタイザノード情報」に対応するサニタイザノードを検索し、検索したサニタイザノードを始点として、有向グラフの経路上の下流に配置されているノード（下流ノード）を全て抽出する。下流ノード抽出部５３は、抽出した下流ノードの集合（集合Ａという）をソースノードｓｃ１及びシンクノードｓｋ２と関連付けて、抽出情報記憶部３３に記憶させる。なお、図１４に示す例では、サブグラフＳＧ２が、下流ノードの集合（集合Ａ）である。
【００７２】
次に、ノード抽出部６０は、上流ノードを抽出する（ステップＳ２０２）。具体的に、ノード抽出部６０の上流ノード抽出部５４は、グラフ情報記憶部３２から取得した有向グラフと、抽出情報記憶部３３から取得したサニタイザノードとに基づいて、有向グラフに含まれるノードのうちの、上流ノードを抽出する。
【００７３】
例えば、図１５に示す例では、上流ノード抽出部５４は、ソースノードｓｃ１及びシンクノードｓｋ２に対応する「有向グラフ情報」をグラフ情報記憶部３２から取得するとともに、ソースノードｓｃ１及びシンクノードｓｋ２に対応する「サニタイザノード情報」を抽出情報記憶部３３から取得する。上流ノード抽出部５４は、取得した「有向グラフ情報」の中から「サニタイザノード情報」に対応するサニタイザノードを検索し、検索したサニタイザノードを終点として、有向グラフの経路上の上流に配置されているノード（上流ノード）を全て抽出する。上流ノード抽出部５４は、抽出した上流ノードの集合（集合Ｂという）をソースノードｓｃ１及びシンクノードｓｋ２と関連付けて、抽出情報記憶部３３に記憶させる。なお、図１５に示す例では、サブグラフＳＧ３が、上流ノードの集合（集合Ｂ）である。
【００７４】
次に、ノード抽出部６０は、汚染ノードを抽出する（ステップＳ２０３）。具体的に、ノード抽出部６０の汚染ノード抽出部５２は、グラフ情報記憶部３２から取得した有向グラフと、抽出情報記憶部３３から取得したサニタイザノードとに基づいて、有向グラフに含まれる経路のうちのサニタイザを通過しない経路（危険経路）を抽出し、この危険経路上のノードを汚染ノードとして抽出する。
【００７５】
例えば、図１６に示す例では、汚染ノード抽出部５２は、ソースノードｓｃ１及びシンクノードｓｋ２に対応する「有向グラフ情報」をグラフ情報記憶部３２から取得するとともに、ソースノードｓｃ１及びシンクノードｓｋ２に対応する「サニタイザノード情報」を抽出情報記憶部３３から取得する。汚染ノード抽出部５２は、取得した「有向グラフ情報」の中から「サニタイザノード情報」に対応するサニタイザノードを検索し、検索したサニタイザノードを通過しない経路（危険経路）を抽出する。汚染ノード抽出部５２は、この危険経路上に配置されているノード（汚染ノード）を全て抽出する。汚染ノード抽出部５２は、抽出した汚染ノードの集合（集合Ｃという）をソースノードｓｃ１及びシンクノードｓｋ２と関連付けて、抽出情報記憶部３３に記憶させる。なお、図１６に示す例では、サブグラフＳＧ１が、汚染ノードの集合（集合Ｃ）である。
なお、汚染ノード抽出部５２は、データフロー解析部５１が抽出した危険経路を利用して、汚染ノードを抽出してもよい。
【００７６】
次に、制御部５０の候補抽出部５５は、候補ノードを抽出する（ステップＳ２０４）。すなわち、候補抽出部５５は、抽出情報記憶部３３が記憶する汚染ノードと下流ノードと上流ノードとに基づいて、サニタイザを配置するノードの候補を示す候補ノードを抽出する。具体的に、候補抽出部５５は、汚染ノードの集合（集合Ｃ）から、下流ノードの集合（集合Ａ）及び上流ノードの集合（集合Ｂ）を除外した候補集合（集合Ｄ＝集合Ｃ−（集合Ａ∪集合Ｂ））に含まれるノードを、候補ノードとして抽出する。
【００７７】
例えば、図１７に示す例では、候補抽出部５５は、ソースノードｓｃ１及びシンクノードｓｋ２に対応する「汚染ノード情報」、「上流ノード情報」、及び「下流ノード情報」を抽出情報記憶部３３から取得する。候補抽出部５５は、取得した「汚染ノード情報」（集合Ｃ）、「上流ノード情報」（集合Ｂ）、及び「下流ノード情報」（集合Ａ）に基づいて、候補ノードの集合（集合Ｄ）を抽出する。候補抽出部５５は、抽出した候補ノードの集合（集合Ｄ）をソースノードｓｃ１及びシンクノードｓｋ２と関連付けて、候補情報記憶部３４に記憶させる。なお、図１７に示す例では、サブグラフＳＧ４が、候補ノードの集合（集合Ｄ）である。
【００７８】
次に、候補抽出部５５は、候補ノードの優先順位を決定する（ステップＳ２０５）。具体的に、候補抽出部５５は、抽出した候補ノードのうち、有向グラフ上の経路においてシンクノードに最も近いノードを、最優先順位の候補ノードとして決定する。なお、候補抽出部５５は、汚染ノードの経路の有向グラフであるサブグラフＳＧ１について、最優先順位の候補ノードとして決定したノードにサニタイザを配置した場合のデータフロー解析をデータフロー解析部５１に実行させて、危険経路が解消されたか否かを判定してもよい。この判定の結果、危険経路が解消されていない場合には、候補抽出部５５は、候補ノードの集合（集合Ｄ）うちの次に優先順位の高い別の候補ノードを最優先順位の候補ノードとして決定する。
例えば、図１７に示す例では、候補抽出部５５は、ノードｎ１１を最優先順位の候補ノードとして決定する。また、候補抽出部５５は、例えば、候補ノードの優先順位を、順位の高い方から順にノードｎ１１→ノードｎ０８→ノードｎ０９又はノードｎ１０と決定する。
【００７９】
なお、サニタイザが適用されたデータは、適用される前のデータよりデータ長が増加するため、サニタイザは、シンクノードに近い位置に配置することが好ましい。そのため、候補抽出部５５は、例えば、候補ノードの集合（集合Ｄ）うち、シンクノードに近い候補ノードほど、優先順位を高くする。また、候補抽出部５５は、候補ノードの集合（集合Ｄ）うち、有向グラフ上の経路において分岐先となる候補ノードに対して、優先順位を下げる。また、候補抽出部５５は、候補ノードの集合（集合Ｄ）うち、有向グラフ上の経路において分岐の収束先となるノードに対して、候補ノードとしての優先順位を上げる。
制御部５０は、ステップＳ２０５の処理を実行後、サニタイザの候補抽出処理を終了する。
【００８０】
図１８は、本実施形態における検証装置１の効果を説明する図である。
この図において、有向グラフＧ１は、図１、及び図１４〜図１７に示した有向グラフと同一の構成であり、ソースノードｓｃ１、ノードｎ０１〜ノードｎ３０、及びシンクノードｓｋ１を有している。なお、この図において、ノードｎ１１は、最優先順位の候補ノードを示し、ノードｎ１１にサニタイザを配置した場合のデータフロー解析の結果を示している。
【００８１】
図１８に示す例では、検証装置１が抽出した候補ノードであるノードｎ１１にサニタイザを配置することで、ソースコードのデータフロー解析の結果が、「危険」から「安全」に変更になっている。このように、本実施形態における検証装置１は、サニタイザを適切に配置することができる。
また、検証装置１が、図１２に示すようにデータフロー解析の結果として、危険経路（サブグラフＳＧ１）のみを表示部４０に表示する場合には、従来の技術のような人手によりサニタイザの配置位置を決定すると、サニタイザを二重に挿入してしまうことがある。
【００８２】
例えば、図１９は、従来の汚染解析によるサニタイザの二重挿入の一例を示す図である。この図において、有向グラフＧ１は、図１２に示した有向グラフと同一の構成であり、ソースノードｓｃ１、ノードｎ０１〜ノードｎ３０、及びシンクノードｓｋ１を有している。また、この図において、サブグラフＳＧ１が危険経路であり、領域ＮＡ１及び領域ＮＡ１に含まれるノードは、安全が確認されているノードである。
【００８３】
図１９に示すように、データフロー解析の結果として、危険経路（サブグラフＳＧ１）のみを表示部４０に表示する場合には、ユーザは、ノードｎ０５などの既に配置されているサニタイザを認識することができない。そのため、従来の汚染解析の技術では、人手によってサニタイザの位置を決定すると、サブグラフＳＧ５ように、二重にサニタイザが挿入されてしまうことがある。
【００８４】
上述のように、二重にサニタイザが挿入された場合には、サニタイザで変換されるデータは、図２の（ｆ）「二重エスケープ結果」示す記述に変換される。図２の（ｆ）の記述でシンクにデータを出力する場合、出力されるデータ（文字列）は、本来出力されるべき、図２の（ｄ）の文字列ではなく、図２の（ｅ）の文字列となる。例えば、“＆”に二重にサニタイザの処理が実行された場合、“＆ａｍｐ；ａｍｐ；”となり、この文字列がシンクにより、“＆ａｍｐ；”として出力され、本来の“＆”が出力されない。
このように、従来の人手によってサニタイザの位置を決定する場合には、二重にサニタイザが挿入されることがあり、正しくデータを出力できないという問題がある。
これに対して、本実施形態における検証装置１は、上述した候補ノードの抽出処理により、二重にサニタイザを配置することのない適切な候補ノードを抽出する。そのため、本実施形態における検証装置１は、上述のような二重にサニタイザが挿入されることを未然に回避することができる。
【００８５】
以上説明したように、本実施形態における検証装置１は、データフロー解析部５１と、ノード抽出部６０（第１の抽出部）と、候補抽出部５５（第２の抽出部）とを備えている。データフロー解析部５１は、ソースコード記憶部２０からソースコードを取得し、取得したソースコードに含まれるデータを入力するソースノード、データを出力するシンクノード、及びデータに含まれる脆弱性の原因となる特殊文字を無害化する処理に対応するサニタイザノードを、ソースノード、シンクノード、及びサニタイザノードのそれぞれに対応する記述を示す記述情報を記憶するルール情報記憶部３１から取得した記述情報に基づいて抽出して、ソースコードのデータフローを解析する。さらに、データフロー解析部５１は、ソースノードからシンクノードまでのノードを含むデータフローを示す有向グラフを生成する。ノード抽出部６０は、データフロー解析部５１が生成した有向グラフと、サニタイザノードとに基づいて、有向グラフに含まれるノードのうちの、汚染ノードと下流ノードと上流ノードとを抽出する。ここで、汚染ノードとは、サニタイザノードを通過しない経路上のノードである。また、下流ノードとは、サニタイザノードの下流に配置されたノードであり、上流ノードとは、サニタイザノードの上流に配置されたノードである。そして、候補抽出部５５は、ノード抽出部６０が抽出した汚染ノードと下流ノードと上流ノードとに基づいて、サニタイザを配置するノードの候補を示す候補ノードを抽出し、抽出した候補ノードに対応するソースコード上の位置を示す情報を結果出力部５６に出力させる。
【００８６】
これにより、本実施形態における検証装置１は、サニタイザを配置する適切な候補ノードを抽出することができるので、ユーザは、ソースコードに脆弱性があった場合に、サニタイザを適切に配置することができる。
また、サニタイザを配置する位置を、人間が注意深く決定する必要がなくなるので、本実施形態における検証装置１は、サニタイザを適切に配置するようにソースコードを修正する作業工数を低減することができる。例えば、ソースコードの規模が大きい又は複雑でソースからシンクまでの経路が膨大に検出された場合であっても、本実施形態における検証装置１は、サニタイザを適切に配置するように修正する作業工数（人的な修正コスト）を低減することができる。すなわち、本実施形態における検証装置１は、静的解析によるソースコードの検証にかかる作業工数を低減することができる。
よって、本実施形態における検証装置１は、作業工数を低減しつつ、サニタイザを適切に配置することができる。
【００８７】
なお、本実施形態における検証装置１は、上流ノードと下流ノードとに基づいて、候補ノードを抽出するので、既に安全が確認されている経路も含めて、適切な候補ノードを抽出することができる。そのため、本実施形態における検証装置１は、上述したような二重にサニタイザが挿入されることを未然に回避することができる。
【００８８】
また、本実施形態では、候補抽出部５５は、汚染ノードの集合（集合Ｃ）から、下流ノードの集合（集合Ｂ）及び上流ノードの集合（集合Ａ）を除外した候補集合（集合Ｄ）に含まれるノードを候補ノードとして抽出する。
これにより、汚染ノードの集合からサニタイザを通過しないノードを簡易な手段で適切に抽出することができるので、本実施形態における検証装置１は、サニタイザを配置する候補ノードを適切に抽出することができる。
【００８９】
また、本実施形態では、候補抽出部５５は、抽出した候補ノードのうち、有向グラフ上の経路においてシンクノードに最も近いノードを、最優先順位の候補ノードとして抽出する。
サニタイザは、上述したようにシンクノードに近い位置に配置することが好ましいため、これにより、本実施形態における検証装置１は、ユーザに対してサニタイザを配置する最優先順位の候補ノードを適切に提案することができる。
【００９０】
また、本実施形態では、候補抽出部５５は、第２の抽出部は、抽出した候補ノードのうち、有向グラフ上の経路において分岐先となるノードに対して、候補ノードとしての優先順位を下げる。
分岐先となるノードにサニタイザを配置する場合、複数のノードにサニタイザを配置する必要が生じるため、これにより、本実施形態における検証装置１は、ユーザに対してサニタイザを配置する数量を低減した適切な候補ノードを提案することができる。
【００９１】
また、本実施形態では、候補抽出部５５は、抽出した候補ノードのうち、有向グラフ上の経路において分岐の収束先となるノードに対して、候補ノードとしての優先順位を上げる。
分岐の収束先となるノードにサニタイザを配置する場合、１つのノードで効率よくサニタイザを配置することができるため、これにより、本実施形態における検証装置１は、ユーザに対してサニタイザを配置する効果の高い（効率のよい）適切な候補ノードを提案することができる。
【００９２】
なお、本実施形態では、一例として、候補抽出部５５は、最優先順位の候補ノードとして抽出するまでの処理を実行する場合について説明したが、サニタイザを最優先順位の候補ノードに配置するソースコードの修正処理までを候補抽出部５５、又は制御部５０が実行してもよい。この場合、ソースコードにサニタイザを挿入する修正処理を、人手を介さずに実行することができるので、検証装置１は、さらに作業工数を低減することができる。
【００９３】
次に、第２の実施形態について、図面を参照して説明する。
［第２の実施形態］
第２の実施形態では、図２０に示すように、有向グラフが複数のソースと、１つのシンクとを有する場合において、検証装置１が、候補ノードの抽出処理（サニタイザの候補抽出処理）を実行する一例について説明する。
【００９４】
なお、本実施形態における検証装置１の構成は、第１の実施形態と同様であり、ここではその説明を省略する。また、本実施形態における検証装置１の基本動作は、図８に示す第１の実施形態と同様であるので、ここではその説明を省略する。
本実施形態では、サニタイザの候補抽出処理の手順が第１の実施形態とは異なり、以下、サニタイザの候補抽出処理について説明する。
【００９５】
図２０は、本実施形態におけるサニタイザの候補抽出処理の一例を説明する図である。
この図において有向グラフＧ２は、ソースノードｓｃ１（「Ｓｏｕｒｃｅ１」）、ソースノードｓｃ２（「Ｓｏｕｒｃｅ２」）、・・・、及びソースノードｓｃＮ（「ＳｏｕｒｃｅＮ」）と、シンクノードｓｋ１（「Ｓｉｎｋ１」）との間のデータフローを示すデータフローグラフである。この有向グラフＧ２は、ノードｎ０２〜ｎ１６及びｎ１８〜ｎ３０を含んでおり、このノードｎ０２〜ｎ１６及びｎ１８〜ｎ３０のうちの、ノードｎ０５、ノードｎ０６、ノードｎ１６、及びノードｎ３０がサニタイザに対応するサニタイザノードである。
【００９６】
図２０に示すように、本実施形態では、有向グラフＧ２は、複数のソースノードを有している。本実施形態におけるサニタイザの候補抽出処理では、検証装置１は、複数のソースノードのうちの１つと１つのシンクノード（ｓｋ１）との間のサブグラフにおいて、サニタイザの候補ノードを抽出する処理を、全てのソースノードに対して実行し、それぞれの処理で抽出した候補ノードの和集合に含まれるノードを候補ノードとして抽出する。
【００９７】
次に、本実施形態におけるサニタイザの候補抽出処理について、図２１を参照して説明する。
図２１は、本実施形態におけるサニタイザの候補抽出処理の一例を示すフローチャートである。
この図において、まず、制御部５０の候補抽出部５５は、ソース番号ｎに“１”を代入する（ステップＳ３０１）。すなわち、候補抽出部５５は、図２０に示すソースノードｓｃ１（「Ｓｏｕｒｃｅ１」）を選択し、ソースノードｓｃ１（「Ｓｏｕｒｃｅ１」）と、シンクノードｓｋ１（「Ｓｉｎｋ１」）との間のサブグラフＳＧ２１を選択する。
【００９８】
次に、候補抽出部５５は、ｎ番目のソースを設定する（ステップＳ３０２）。
続く、ステップＳ３０３〜ステップＳ３０６までの処理は、図１３のステップＳ２０１〜ステップＳ２０４までの処理と同様であるので、ここでは説明を省略する。なお、ソース番号ｎが“１”である場合には、制御部５０のノード抽出部６０及び候補抽出部５５は、ステップＳ３０３〜ステップＳ３０６において、上述のサブグラフＳＧ２１に対応する候補ノードを抽出する。なお、候補抽出部５５は、抽出した候補ノードと、ｎ番目のソースノードを示す「ソースノード情報」及びシンクノードｓｋ１を示す「シンクノード情報」の組情報とを関連付けて、候補情報記憶部３４に記憶させる。
【００９９】
次に、ステップＳ３０７において、制御部５０の候補抽出部５５は、ソース番号ｎが“Ｎ”以上であるか否かを判定する。候補抽出部５５は、ソース番号ｎが“Ｎ”以上である場合（ステップＳ３０７：ＹＥＳ）に、処理をステップＳ３０９に進める。また、候補抽出部５５は、ソース番号ｎが“Ｎ”未満である場合（ステップＳ３０７：ＮＯ）に、処理をステップＳ３０８に進める。
【０１００】
ステップＳ３０８において、候補抽出部５５は、ソース番号ｎに“１”を加算して、ソース番号ｎを更新し、処理をステップＳ３０２に進める。すなわち、候補抽出部５５は、次のソースノード（例えば、ソースノードｓｃ２（「Ｓｏｕｒｃｅ２」、・・・、ソースノードｓｃＮ（「ＳｏｕｒｃｅＮ」）とシンクノードｓｋ１（「Ｓｉｎｋ１」）との間のサブグラフを選択して、同様に、候補ノードの抽出を繰り返す。
【０１０１】
また、ステップＳ３０９において、候補抽出部５５は、候補ノードの優先順位を決定する。ここでは、候補抽出部５５は、各サブグラフにおいて抽出した候補ノードの集合の和集合に対して、図１３のステップＳ２０５と同様の処理を実行する。具体的に、候補抽出部５５は、ｎ番目のソースノードを示す「ソースノード情報」及びシンクノードｓｋ１を示す「シンクノード情報」の組情報と関連付けて候補情報記憶部３４に記憶されている候補ノードを、１番目〜Ｎ番目まで順番に取得し、候補ノードの集合の和集合を生成する。
なお、候補抽出部５５は、上述の候補ノードの和集合において、ソースとシンクとの組み合わせのそれぞれに対して抽出した候補ノードが重複する場合に、重複する候補ノードに対して、候補ノードとしての優先順位を上げる。
制御部５０は、ステップＳ３０９の処理を実行後、サニタイザの候補抽出処理を終了する。
【０１０２】
以上説明したように、本実施形態では、候補抽出部５５は、有向グラフが複数の入力点ノードを含む場合に、ソースノードとシンクノードとの組み合わせのそれぞれに対して、候補ノードを抽出する。そして、候補抽出部５５は、それぞれ抽出した候補ノードの和集合を候補ノードとして抽出する。
これにより、本実施形態における検証装置１は、ソースコードが、複数のソースを有しし、１つのシンクにおいてデータが出力される場合であっても、第１の実施形態と同様に、適切な候補ノードを抽出することができる。よって、本実施形態における検証装置１は、作業工数を低減しつつ、サニタイザを適切に配置することができる。
【０１０３】
また、本実施形態では、候補抽出部５５は、上述の候補ノードの和集合において、ソースとシンクとの組み合わせのそれぞれに対して抽出した候補ノードが重複する場合に、重複する候補ノードに対して、候補ノードとしての優先順位を上げる。
候補ノードが重複するノードにサニタイザを配置する場合、１つのノードで効率よくサニタイザを配置することができるため、これにより、本実施形態における検証装置１は、ユーザに対してサニタイザを配置する効果の高い（効率のよい）適切な候補ノードを提案することができる。
【０１０４】
次に、第３の実施形態について、図面を参照して説明する。
［第３の実施形態］
第３の実施形態では、図２２に示すように、有向グラフが複数のソースと、複数のシンクとを有する場合において、検証装置１が、候補ノードの抽出処理（サニタイザの候補抽出処理）を実行する一例について説明する。
【０１０５】
なお、本実施形態における検証装置１の構成は、第１の実施形態と同様であり、ここではその説明を省略する。また、本実施施形態における検証装置１の基本動作は、図８に示す第１の実施形態と同様であるので、ここではその説明を省略する。
本実施形態では、サニタイザの候補抽出処理の手順が第１、及び第２の実施形態とは異なり、以下、サニタイザの候補抽出処理について説明する。
【０１０６】
図２２は、本実施形態におけるサニタイザの候補抽出処理の一例を説明する図である。
この図において有向グラフＧ３は、ソースノードｓｃ１（「Ｓｏｕｒｃｅ１」）、ソースノードｓｃ２（「Ｓｏｕｒｃｅ２」）、・・・、及びソースノードｓｃＮ（「ＳｏｕｒｃｅＮ」）と、シンクノードｓｋ１（「Ｓｉｎｋ１」）、シンクノードｓｋ２（「Ｓｉｎｋ２」）、・・・、及びシンクノードｓｋ１（「ＳｉｎｋＭ」）との間のデータフローを示すデータフローグラフである。この有向グラフＧ３は、ノードｎ０２〜ｎ１６及びｎ１８〜ｎ３０を含んでおり、このノードｎ０２〜ｎ１６及びｎ１８〜ｎ３０のうちの、ノードｎ０５、ノードｎ０６、ノードｎ１６、及びノードｎ３０がサニタイザに対応するサニタイザノードである。
【０１０７】
図２２に示すように、本実施形態では、有向グラフＧ３は、複数のソースノードと複数のシンクを有している。本実施形態におけるサニタイザの候補抽出処理では、検証装置１は、複数のソースノードのうちの１つと複数のシンクノードのうちの１つのシンクノード（ｓｋ１）との間のサブグラフにおいて、サニタイザの候補ノードを抽出する処理を、全てのソースノードに対して実行し、それぞれの処理で抽出した候補ノードの和集合に含まれるノードを候補ノードとして抽出する（図２２のサブグラフＳＧ３１）。そして、さらに、検証装置１は、シンクノードを変更して、全てのシンクノードに対して、同様の処理を実行し、それぞれの処理で抽出した候補ノードの和集合に含まれるノードを候補ノードとして抽出する。
【０１０８】
次に、本実施形態におけるサニタイザの候補抽出処理について、図２３を参照して説明する。
図２３は、本実施形態におけるサニタイザの候補抽出処理の一例を示すフローチャートである。
この図において、まず、制御部５０の候補抽出部５５は、ソース番号ｎに“１”を代入し、シンク番号ｍに“１”を代入する（ステップＳ４０１）。すなわち、候補抽出部５５は、図２２に示すソースノードｓｃ１（「Ｓｏｕｒｃｅ１」）とシンクノードｓｋ１（「Ｓｉｎｋ１」）とを選択する。
【０１０９】
次に、候補抽出部５５は、ｎ番目のソースと、ｍ番目のシンクとを設定する（ステップＳ４０２）。
続く、ステップＳ４０３〜ステップＳ４０６までの処理は、図２１のステップＳ３０２〜ステップＳ３０６までの処理と同様であるので、ここでは説明を省略する。
【０１１０】
次に、ステップＳ４０７において、制御部５０の候補抽出部５５は、ソース番号ｎが“Ｎ”以上であるか否かを判定する。候補抽出部５５は、ソース番号ｎが“Ｎ”以上である場合（ステップＳ４０７：ＹＥＳ）に、処理をステップＳ４０９に進める。また、候補抽出部５５は、ソース番号ｎが“Ｎ”未満である場合（ステップＳ４０７：ＮＯ）に、処理をステップＳ４０８に進める。
【０１１１】
ステップＳ４０８において、候補抽出部５５は、ソース番号ｎに“１”を加算して、ソース番号ｎを更新し、処理をステップＳ４０２に進める。すなわち、候補抽出部５５は、次のソースノード（例えば、ソースノードｓｃ２（「Ｓｏｕｒｃｅ２」、・・・、ソースノードｓｃＮ（「ＳｏｕｒｃｅＮ」）とシンクノードとの間のサブグラフを選択して、同様に、候補ノードの抽出を繰り返す。
【０１１２】
また、ステップＳ４０９において、候補抽出部５５は、シンク番号ｍが“Ｍ”以上であるか否かを判定する。候補抽出部５５は、シンク番号ｍが“Ｍ”以上である場合（ステップＳ４０９：ＹＥＳ）に、処理をステップＳ４１１に進める。また、候補抽出部５５は、シンク番号ｍが“Ｍ”未満である場合（ステップＳ４０９：ＮＯ）に、処理をステップＳ４１０に進める。
【０１１３】
ステップＳ４１０において、候補抽出部５５は、シンク番号ｍに“１”を加算して、シンク番号ｍを更新するとともに、ソース番号ｎに“１”を代入した後に、処理をステップＳ４０２に進める。すなわち、候補抽出部５５は、ソースノードをソースノードｓｃ１（「Ｓｏｕｒｃｅ１」）に戻し、次のシンクノード（例えば、シンクノードｓｋ２（「Ｓｉｎｋ２」、・・・、シンクノードｓｋＭ（「ＳｉｎｋＭ」）との間のサブグラフを選択して、同様に、候補ノードの抽出を繰り返す。
【０１１４】
また、ステップＳ４１１において、候補抽出部５５は、候補ノードの優先順位を決定する。ここでは、候補抽出部５５は、各サブグラフにおいて抽出した候補ノードの集合の和集合に対して、図１３のステップＳ２０５と同様の処理を実行する。なお、候補抽出部５５は、上述の候補ノードの和集合において、ソースとシンクとの組み合わせのそれぞれに対して抽出した候補ノードが重複する場合に、重複する候補ノードに対して、候補ノードとしての優先順位を上げる。
制御部５０は、ステップＳ４１１の処理を実行後、サニタイザの候補抽出処理を終了する。
【０１１５】
なお、図２３に示す手順では、候補抽出部５５は、ソースとシンクとの全ての組み合わせに対する候補ノードの抽出が完了した後に、組み合わせのそれぞれにおいて抽出した候補ノードの和集合を生成する場合について説明したが、ソースノードｓｃ１〜ソースノードｓｃＮの変更が完了するごとに、和集合を生成してもよい。すなわち、候補抽出部５５は、各シンクノードに対して、第２の実施形態と同様の処理を実行し、全てのシンクノードの変更が完了した後に、再度、和集合を生成してもよい。
【０１１６】
以上説明したように、本実施形態では、候補抽出部５５は、有向グラフが複数の入力点ノード又は複数のシンクノードを含む場合に、ソースノードとシンクノードとの組み合わせのそれぞれに対して、候補ノードを抽出する。そして、候補抽出部５５は、それぞれ抽出した候補ノードの和集合を候補ノードとして抽出する。
これにより、本実施形態における検証装置１は、ソースコードが、複数のソースを有しし、複数のシンクにおいてデータが出力される場合であっても、第１の実施形態と同様に、適切な候補ノードを抽出することができる。よって、本実施形態における検証装置１は、作業工数を低減しつつ、サニタイザを適切に配置することができる。
【０１１７】
なお、本発明は、上記の各実施形態に限定されるものではなく、本発明の趣旨を逸脱しない範囲で変更可能である。
例えば、上記の各実施形態において、検証装置１が、ソースコード記憶部２０、及び検証記憶部３０を備える場合について説明したが、ソースコード記憶部２０、及び検証記憶部３０を、例えば、サーバ装置などの外部装置が備えてもよい。また、制御部５０は、例えば、クライアント端末やアプリケーションサーバなどのコンピュータ装置であってもよい。また、入力部１０又は表示部４０は、検証装置１の外部に備えてもよい。例えば、入力部１０及び表示部４０は、検証装置１とネットワークにより接続されたクライアント端末などのコンピュータ装置が備えてもよい。
【０１１８】
また、上記の各実施形態において、結果出力部５６は、データフロー解析の結果、データフローグラフ、候補ノードに対応するソースコード上の位置を示す情報などの情報を、表示部４０に出力する場合について説明したが、結果出力部５６は、これらの情報を、ファイルサーバ装置などに、データファイルとして出力してもよい。
また、上記の各実施形態の候補抽出処理において、ノード抽出部６０は、下流ノードの抽出処理、上流ノードの抽出処理、汚染ノードの抽出処理の順番に、処理を実行する場合について説明したが、これらの各処理を実行する順番は、これに限定されるものではない。ノード抽出部６０は、上述の３つの処理のうち、いずれの処理を先に実行してもよい。
【０１１９】
また、上記の各実施形態では、図２の（ａ）「出力先」が１つの種類である場合（１つの種類のシンクである場合）について説明したが、ソースコードに複数の種類のシンクが存在する場合には、検証装置１は、それぞれの種類のシンクに対して、図８に示す検証処理を実行することで対応することができる。例えば、ソースコードに、ＨＴＭＬによるシンクと、Ｊａｖａｓｃｒｉｐｔによるシンクとが混在している場合には、検証装置１は、ＨＴＭＬに対応したデータフロー解析、及びサニタイザの候補ノードの抽出を実行した後に、Ｊａｖａｓｃｒｉｐｔに対応したデータフロー解析、及びサニタイザの候補ノードの抽出を同様に実行する。
【０１２０】
なお、本発明における検証装置１の機能を実現するためのプログラムをコンピュータ読み取り可能な記録媒体に記録して、この記録媒体に記録されたプログラムをコンピュータシステムに読み込ませ、実行することにより上述した検証装置１の処理を行ってもよい。ここで、「記録媒体に記録されたプログラムをコンピュータシステムに読み込ませ、実行する」とは、コンピュータシステムにプログラムをインストールすることを含む。ここでいう「コンピュータシステム」とは、ＯＳや周辺機器等のハードウェアを含むものとする。
また、「コンピュータシステム」は、インターネットやＷＡＮ、ＬＡＮ、専用回線等の通信回線を含むネットワークを介して接続された複数のコンピュータ装置を含んでもよい。また、「コンピュータ読み取り可能な記録媒体」とは、フレキシブルディスク、光磁気ディスク、ＲＯＭ、ＣＤ−ＲＯＭ等の可搬媒体、コンピュータシステムに内蔵されるハードディスク等の記憶装置のことをいう。このように、プログラムを記憶した記録媒体は、ＣＤ−ＲＯＭ等の非一過性の記録媒体であってもよい。また、記録媒体には、当該プログラムを配信するために配信サーバからアクセス可能な内部または外部に設けられた記録媒体も含まれる。
なお、プログラムを複数に分割し、それぞれ異なるタイミングでダウンロードした後に検証装置１で合体される構成や、分割されたプログラムのそれぞれを配信する配信サーバが異なっていてもよい。さらに「コンピュータ読み取り可能な記録媒体」とは、ネットワークを介してプログラムが送信された場合のサーバやクライアントとなるコンピュータシステム内部の揮発性メモリ（ＲＡＭ）のように、一定時間プログラムを保持しているものも含むものとする。また、上記プログラムは、上述した機能の一部を実現するためのものであってもよい。さらに、上述した機能をコンピュータシステムにすでに記録されているプログラムとの組み合わせで実現できるもの、いわゆる差分ファイル（差分プログラム）であってもよい。
【０１２１】
また、上述した機能の一部または全部を、ＬＳＩ（Large Scale Integration）等の集積回路として実現してもよい。上述した各機能は個別にプロセッサ化してもよいし、一部、または全部を集積してプロセッサ化してもよい。また、集積回路化の手法はＬＳＩに限らず専用回路、または汎用プロセッサで実現してもよい。また、半導体技術の進歩によりＬＳＩに代替する集積回路化の技術が出現した場合、当該技術による集積回路を用いてもよい。
【符号の説明】
【０１２２】
１  検証装置
１０  入力部
２０  ソースコード記憶部
３０  検証記憶部
３１  ルール情報記憶部
３２  グラフ情報記憶部
３３  抽出情報記憶部
３４  候補情報記憶部
４０  表示部
５０  制御部
５１  データフロー解析部
５２  汚染ノード抽出部
５３  下流ノード抽出部
５４  上流ノード抽出部
５５  候補抽出部
５６  結果出力部
６０  ノード抽出部
【図１】
2014174577.tif 000003
【図２】
2014174577.tif 000004
【図３】
2014174577.tif 000005
【図４】
2014174577.tif 000006
【図５】
2014174577.tif 000007
【図６】
2014174577.tif 000008
【図７】
2014174577.tif 000009
【図８】
2014174577.tif 000010
【図９】
2014174577.tif 000011
【図１０】
2014174577.tif 000012
【図１１】
2014174577.tif 000013
【図１２】
2014174577.tif 000014
【図１３】
2014174577.tif 000015
【図１４】
2014174577.tif 000016
【図１５】
2014174577.tif 000017
【図１６】
2014174577.tif 000018
【図１７】
2014174577.tif 000019
【図１８】
2014174577.tif 000020
【図１９】
2014174577.tif 000021
【図２０】
2014174577.tif 000022
【図２１】
2014174577.tif 000023
【図２２】
2014174577.tif 000024
【図２３】
2014174577.tif 000025