(57)【要約】  脆弱性発見装置（１０）は、ソフトウェアの未修正の脆弱性箇所に該当する第１のプログラムコードを抽出する脆弱性箇所抽出部（１３）と、抽出された第１のプログラムコードと、脆弱性箇所の検査対象となるソフトウェアの第２のプログラムコードとに含まれるパラメータのうち、コンパイル環境により変化するパラメータを正規化する正規化処理部（１４）と、正規化後の第２のプログラムコードの任意の箇所を比較対象として第１のプログラムコードとの類似度を算出する類似度算出部（１５）と、算出した類似度が所定の閾値を超える第２のプログラムコードの箇所について、脆弱性関連情報を参照して、当該第２のプログラムコードの箇所が未知の脆弱性箇所か否かを判定する判定部（１６）とを備える。
2017061270.tif 000002
【特許請求の範囲】
【請求項１】
ソフトウェアの未修正の脆弱性箇所に該当する第１のプログラムコードを抽出する抽出部と、
前記抽出部により抽出された第１のプログラムコードと、脆弱性箇所の検査対象となるソフトウェアの第２のプログラムコードとに含まれるパラメータのうち、コンパイル環境により変化するパラメータを正規化する正規化処理部と、
前記正規化後の第２のプログラムコードの任意の箇所を比較対象として前記第１のプログラムコードとの類似度である第１の類似度を算出する類似度算出部と、
算出した前記第１の類似度が所定の閾値を超える第２のプログラムコードの箇所について、脆弱性関連情報を参照して、当該第２のプログラムコードの箇所が未知の脆弱性箇所か否かを判定する判定部と、
前記未知の脆弱性箇所と判定された第２のプログラムコードの箇所を出力する出力部と
を備えることを特徴とする脆弱性発見装置。
【請求項２】
前記類似度算出部は、前記第１の類似度を算出する際、前記正規化後の第２のプログラムコードのうち、前記第１のプログラムコードの文字列と同じ文字列の箇所については第１の値を加算し、前記第１のプログラムコードの文字列と異なる文字列の箇所については前記第１の値よりも低い第２の値を加算し、前記正規化後の第２のプログラムコードに、前記第１のプログラムコードとは異なる文字列が挿入されている区間、または、前記第１のプログラムコードの文字列が一部削除されている区間がある場合、前記区間の開始点の文字列については前記第２の値よりも低い第３の値を加算し、当該区間の継続点の文字列については前記第３の値よりも高く、かつ、０よりも低い第４の値を加算することを特徴とする請求項１に記載の脆弱性発見装置。
【請求項３】
前記類似度算出部は、前記第３の値および前記第４の値として、前記第３の値および前記第４の値の合計値が、前記第２の値の２倍の値よりも高くなるような値を設定することを特徴とする請求項２に記載の脆弱性発見装置。
【請求項４】
前記判定部は、前記第１の類似度が所定の閾値を超える第２のプログラムコードの箇所について、当該箇所の前記脆弱性関連情報に登録される修正済みの脆弱性箇所のプログラムコードとの類似度である第２の類似度を算出し、算出した前記第２の類似度が前記第１の類似度以上の場合、当該第２のプログラムコードの箇所を未知の脆弱性箇所から除外することを特徴とする請求項１に記載の脆弱性発見装置。
【請求項５】
ソフトウェアの未修正の脆弱性箇所に該当する第１のプログラムコードを抽出するステップと、
抽出された第１のプログラムコードと、脆弱性箇所の検査対象となるソフトウェアの第２のプログラムコードとに含まれるパラメータのうち、コンパイル環境により変化するパラメータを正規化するステップと、
前記正規化後の第２のプログラムコードの任意の箇所を比較対象として前記第１のプログラムコードとの類似度である第１の類似度を算出するステップと、
算出した前記第１の類似度が所定の閾値を超える第２のプログラムコードの箇所について、脆弱性関連情報を参照して、当該第２のプログラムコードの箇所が未知の脆弱性箇所か否かを判定するステップと、
前記未知の脆弱性箇所と判定された第２のプログラムコードの箇所を出力するステップと
を含んだことを特徴とする脆弱性発見方法。
【請求項６】
ソフトウェアの未修正の脆弱性箇所に該当する第１のプログラムコードを抽出するステップと、
抽出された第１のプログラムコードと、脆弱性箇所の検査対象となるソフトウェアの第２のプログラムコードとに含まれるパラメータのうち、コンパイル環境により変化するパラメータを正規化するステップと、
前記正規化後の第２のプログラムコードの任意の箇所を比較対象として前記第１のプログラムコードとの類似度である第１の類似度を算出するステップと、
算出した前記第１の類似度が所定の閾値を超える第２のプログラムコードの箇所について、脆弱性関連情報を参照して、当該第２のプログラムコードの箇所が未知の脆弱性箇所か否かを判定するステップと、
前記未知の脆弱性箇所と判定された第２のプログラムコードの箇所を出力するステップと
をコンピュータに実行させるための脆弱性発見プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、脆弱性発見装置、脆弱性発見方法、および、脆弱性発見プログラムに関する。
【背景技術】
【０００２】
サイバー攻撃やマルウェア感染の根本的な原因の一つとしてソフトウェア中に存在する脆弱性が挙げられる。攻撃者は脆弱性を利用する攻撃コードや、マルウェアを通じてコンピュータに悪意のある行為を行う。こうした攻撃を未然に防ぐため、攻撃者より先に脆弱性を発見・修正し、脆弱性を攻撃の足がかりとして利用させない対策が大事である。【０００３】
こうした状況から、ソフトウェアを検査し、ソフトウェア中に存在している脆弱性を発見する手法の研究が行われている。ソフトウェア中に存在している脆弱性を発見する手法の一つとして、コードクローンを用いた脆弱性発見手法がある。【０００４】
コードクローンとは、ソフトウェア中に存在している類似または一致したコードを指す。このコードクローンは、ソフトウェア開発者がソフトウェア開発中に、特定の機能のプログラムを実現するため、類似機能を持った他のプログラムのソースコードをコピー＆ペーストする行為によって発生する。ここで、コピー元のソースコードに脆弱性が発見された場合、コピー元のソースコードを修正するだけでは無く、コピー先のソースコードも同じ様に修正されなければならない。しかし、コピー元で脆弱性が発見されたとしても、開発者が発見された脆弱性部分のコードクローンを全て把握していなければ、コードクローンによって生じた脆弱性の修正は難しい。コードクローンによる脆弱性発見手法とは、これらの脆弱性が発見された部分のコードクローンを検査対象のソフトウェアにおいて発見することで、検査対象のソフトウェアにおいて未知の脆弱性を発見する手法である。【０００５】
コードクローンを用いた脆弱性発見手法として、ソフトウェアのソースコードを利用した方法（非特許文献１、非特許文献２参照）がある。この方法では、過去に脆弱性が発見されたソフトウェアから、脆弱性箇所のソースコードを抽出し、検査対象ソフトウェアのソースコードを検査することにより、検査対象ソフトウェアに内包されている脆弱性箇所のコードクローンを発見するものである。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００９−１９３１６１号公報
【非特許文献】
【０００７】
【非特許文献１】J.  Jang,  A.  Agrawal,  and  D.  Brumley,  “ReDeBug:  Finding  Unpatched  Code  Clones  in  Entire  OS  Distributions”,  In  IEEE  Symposium  on  Security  and  Privacy,  2012.
【非特許文献２】Hongzhe  Li,  Hyuckmin  Kwon,  Jonghoon  Kwon,  and  Heejo  Lee,  “A  Scalable  Approach  for  Vulnerability  Discovery  Based  on  Security  Patches”,  Application  and  Techniques  in  Information  Security,  2014.
【非特許文献３】Andreas  Saebjoernsen,  Jeremiah  Willcock,  Thomas  Panas,  Daniel  Quinlan,  and  Zhendong  Su,  “Detecting  Code  Clones  in  Binary  Executables”,  In  Proceedings  of  ISSTA  '09,  2009.
【非特許文献４】SB.  Needleman,  CD.  Wunsch,  “A  General  Method  Applicable  to  the  Search  for  Similarities  in  the  Amino  Acid  Sequence  of  Two  Proteins”,  Journal  of  Molecular  Biology  vol.48,  p443-453,  1970.
【非特許文献５】Gotoh  Osamu,  “An  Improved  Algorithm  for  Matching  Biological  Sequences”,  Journal  of  Molecular  Biology.  162,  p705-708,  1982.
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかしながら、ソフトウェアのプログラムコードを検査対象として、コードクローンにより脆弱性を発見する技術は存在しなかった。換言すれば、ソフトウェア開発者がコードクローンによりソフトウェアの脆弱性を発見するためには、検査対象のソフトウェアのソースコードを知る必要があった。従って、ソースコードの入手や利用が困難なソフトウェア（例えば、個人所有のソフトウェア、独占排他権の設定されたソフトウェア）に関しては、未知の脆弱性の発見が困難であった。【０００９】
そこで、本発明は、前記した問題を解決し、検査対象のソフトウェアのソースコードが無い場合であっても、未知の脆弱性を発見することを課題とする。
【課題を解決するための手段】
【００１０】
前記した課題を解決するため、本発明は、ソフトウェアの未修正の脆弱性箇所に該当する第１のプログラムコードを抽出する抽出部と、前記抽出部により抽出された第１のプログラムコードと、脆弱性箇所の検査対象となるソフトウェアの第２のプログラムコードとに含まれるパラメータのうち、コンパイル環境により変化するパラメータを正規化する正規化処理部と、前記正規化後の第２のプログラムコードの任意の箇所を比較対象として前記第１のプログラムコードとの類似度である第１の類似度を算出する類似度算出部と、算出した前記第１の類似度が所定の閾値を超える第２のプログラムコードの箇所について、脆弱性関連情報を参照して、当該第２のプログラムコードの箇所が未知の脆弱性箇所か否かを判定する判定部と、前記未知の脆弱性箇所と判定された第２のプログラムコードの箇所を出力する出力部とを備えることを特徴とする。
【発明の効果】
【００１１】
本発明によれば、検査対象のソフトウェアのソースコードが無い場合であっても、未知の脆弱性を発見することができる。
【図面の簡単な説明】
【００１２】
【図１】図１は、脆弱性発見装置の構成を示すブロック図である。
【図２】図２は、正規化処理部の処理を説明するための図である。
【図３】図３は、類似度算出部の処理を説明するための図である。
【図４】図４は、類似度算出に用いる行列Ｘの一例を示す図である。
【図５】図５は、類似度算出に用いる行列Ｙの一例を示す図である。
【図６】図６は、類似度算出に用いる行列Ｚの一例を示す図である。
【図７】図７は、判定部の処理手順を示すフローチャートである。
【図８】図８は、脆弱性発見プログラムによる情報処理がコンピュータを用いて具体的に実現されることを示す図である。
【発明を実施するための形態】
【００１３】
以下、図面を参照しながら、本発明の実施の形態（実施形態）を説明する。本発明は以下に説明する実施形態に限定されない。
【００１４】
まず、図１を用いて脆弱性発見装置１０の構成を説明する。脆弱性発見装置１０は、ソフトウェアのコードクローンを用いて、検査対象となるソフトウェア（検査対象ソフトウェア）の脆弱性箇所を発見する。例えば、脆弱性発見装置１０は、未修正の脆弱性を持つ（つまりパッチを適用していない）ソフトウェアのコードクローンを用いて、検査対象ソフトウェアのプログラムコード中から脆弱性箇所を発見する。そして、脆弱性発見装置１０は、その脆弱性箇所を、パッチを適用済みのプログラムコードと比較し、パッチを適用済みのプログラムコードと類似していなければ、当該脆弱性箇所を未知の脆弱性箇所候補として出力する。
【００１５】
この脆弱性発見装置１０は、脆弱性関連ＤＢ１１と、逆アセンブル部１２と、脆弱性箇所抽出部１３と、正規化処理部１４と、類似度算出部１５と、判定部１６と、出力部１７とを有する。
【００１６】
脆弱性関連ＤＢ１１は、脆弱性関連情報を記憶する。この脆弱性関連情報は、例えば、攻撃検証コード、共通脆弱性識別子（ＣＶＥ：Common  Vulnerabilities  and  Exposures）、脆弱性に関するセキュリティパッチ、パッチ適用済み（修正済み）のプログラムコード等である。
【００１７】
逆アセンブル部１２は、ソフトウェアの逆アセンブルを行う。例えば、逆アセンブル部１２は、入力された検査対象ソフトウェア、未修正の脆弱性を持つソフトウェアを逆アセンブルする。
【００１８】
脆弱性箇所抽出部１３は、ソフトウェアの逆アセンブル結果から脆弱性箇所のプログラムコードを抽出する。例えば、脆弱性箇所抽出部１３は、未修正の脆弱性を持つソフトウェアの逆アセンブル結果を逆アセンブル部１２から受け取ると、脆弱性関連ＤＢ１１の脆弱性関連情報を参照して、当該逆アセンブル結果から脆弱性箇所のプログラムコードを抽出する。
【００１９】
具体例を挙げると、脆弱性箇所抽出部１３は、脆弱性関連情報のうち、攻撃検証コードを利用する場合、未修正の脆弱性箇所を持つソフトウェアの逆アセンブル結果に対して攻撃検証コードを実行し、攻撃の起点となる部分を、脆弱性箇所のプログラムコードとして抽出する。あるいは、脆弱性箇所抽出部１３は、脆弱性関連情報のうち、共通脆弱性識別子を利用する場合、ＣＶＥＤＢ（Common  Vulnerabilities  and  Exposures  Data  Base）を参照して、未修正の脆弱性箇所を持つソフトウェアの逆アセンブル結果から当該ソフトウェアの情報を基に特定された部分を、脆弱性箇所のプログラムコードとして抽出する。
【００２０】
正規化処理部１４は、プログラムコードの正規化処理を行う。この正規化処理とは、逆アセンブルにより得られたプログラムコードのうち、コンパイル環境により変化する箇所（例えば、レジスタの種類、アクセス先のメモリアドレスの値、即値等の可変パラメータ）を抽象化する処理である。
【００２１】
例えば、正規化処理部１４は、脆弱性箇所抽出部１３から未修正の脆弱性箇所のプログラムコードを取得し、また、逆アセンブル部１２から検査対象ソフトウェアの逆アセンブル結果（検査対象ソフトウェアのプログラムコード）を取得する。そして、正規化処理部１４は、この未修正の脆弱性箇所のプログラムコードおよび検査対象ソフトウェアのプログラムコードの正規化処理を行う。
【００２２】
具体例を挙げると、図２に示す様に、正規化処理部１４は、コンパイル環境により変化する箇所を、その属性だけを表す文字列に変換する。例えば、正規化処理部１４は、プログラムコード中の“0x10”、“00402198”、“0040189C”、“ebx,ebx”の各値を、それぞれ“VAL”、“MEM”、“MEM”、“REG,REG”の各文字列に変換することにより抽象化する。これにより、正規化処理部１４は、検査対象ソフトウェアがコンパイルされた環境に左右されない正確な類似度計算を可能とする。なお、正規化処理では、機械語命令からオペランド部分を除いた情報である縮約命令を用いてもよい。
【００２３】
類似度算出部１５は、正規化後の検査対象ソフトウェアのプログラムコードの任意の箇所を比較対象として、正規化後の未修正の脆弱性箇所のプログラムコードとの類似度を算出する。
【００２４】
例えば、類似度算出部１５は、図３に示すように、正規化後の検査対象ソフトウェアのプログラムコード（Ｂ）の任意の箇所について、正規化後の未修正の脆弱性箇所のプログラムコード（Ａ）全体との類似度を算出する。例えば、類似度算出部１５は、正規化後の検査対象ソフトウェアのプログラムコード（Ｂ）のうち、符号３０２に示す箇所について、正規化後の未修正の脆弱性箇所のプログラムコード（Ａ）全体との類似度を７７％と算出する。この類似度算出部１５の詳細は後記する。
【００２５】
判定部１６は、類似度算出部１５により算出された類似度が所定の閾値を超える正規化後の検査対象ソフトウェアのプログラムコードの箇所（例えば、図３の符号３０１に示す箇所）について、脆弱性関連ＤＢ１１を参照して、当該箇所が未知の脆弱性箇所か否かを判定する。この判定部１６の詳細は後記する。
【００２６】
出力部１７は、判定部１６により未知の脆弱性箇所と判定された箇所を未知の脆弱性箇所候補として出力する。
【００２７】
（類似度算出部）
次に、図３を参照しながら、類似度算出部１５が行う処理の詳細を説明する。ここで、正規化後の未修正の脆弱性箇所のプログラムコードをＡ、正規化後の検査対象ソフトウェアのプログラムコードをＢとすると、Ｂの中でＡと類似した箇所を、スコアを基にした類似度の算出により特定する。
【００２８】
ここでは、Ａの長さを｜Ａ｜＝Ｍ、Ｂの長さを｜Ｂ｜＝Ｎとし、Ａ＝ａ１Ｍ＝ａ１，ａ２，ａ３，…，ａＭ，Ｂ＝ｂ１Ｍ＝ｂ１，ｂ２，ｂ３，…，ｂＮとする。スコアは動的計画法に基づいた類似文字列検索アルゴリズムであるNeedleman-Wunsch（非特許文献４参照）に、文字列の挿入または削除部分中の位置に応じて減点を区別するアフィンギャップと呼ばれる手法（非特許文献５参照）を適用し、さらにスコア算出部分を変更することによって算出できる。そして、類似度算出部１５は、Ａ，Ｂ間のスコアをＦ（Ａ，Ｂ）とすると、Ｆ（Ａ，Ｂ）／Ｆ（Ａ，Ａ）を求めることでＡ，Ｂ間の類似度を算出することがきる。
【００２９】
スコア算出のための具体的な処理内容について説明する。まず、類似度算出部１５は、Ａ，Ｂ間で、３つのスコア行列Ｘ＝｛ｘｉｊ｜０≦ｉ≦Ｍ，０≦ｊ≦Ｎ｝、スコア行列Ｙ＝｛ｙｉｊ｜０≦ｉ≦Ｍ，０≦ｊ≦Ｎ｝、スコア行列Ｚ＝｛ｚｉｊ｜０≦ｉ≦Ｍ，０≦ｊ≦Ｎ｝の各要素を下記の式（１）〜式（３）で算出する。なお、このスコア行列Ｘは、Ａ，Ｂ間のmatch，mismatchスコアを管理する行列である。また、スコア行列Ｙは、Ｂにおける挿入のギャップスコアを管理する行列である。さらに、スコア行列Ｚは、Ａにおける削除のギャップスコアを管理する行列である。
【００３０】
【数１】
2017061270.tif 000003
【００３１】
【数２】
2017061270.tif 000004
【００３２】
【数３】
2017061270.tif 000005
【００３３】
なお、式（１）におけるmatch（文字列同士が合致する）、mismatch（文字列同士が合致しない）のスコアは任意に設定できるが、match（第１の値）＞mismatch（第２の値）となり、かつ｜match｜と｜mismatch｜が極端に離れすぎない値が好ましい。また、式（２）および式（３）における、o（open  gap）はギャップ(文字列の挿入または削除)の開始スコアとし、e（extended  gap）はギャップの継続スコアとする。o（第３の値）とe（第４の値）のスコアは任意の値を設定できるが、e＞mismatch、e＞o、o＜mismatch、e＜０、かつ、（mismatch×２）＜（e＋o）となる値が好ましい。この理由については後記する。
【００３４】
例えば、類似度算出部１５は、図３に示すように、match、mismatch、o（open  gap）、e（extended  gap）それぞれの設定スコアとして、match＝＋２、mismatch＝−２、o（open  gap）＝−３、e（extended  gap）＝−０．５を用いる。
【００３５】
つまり、類似度算出部１５は、Ｂの文字列のうち、Ａの文字列と同じ文字列の箇所についてはスコアを「match＝＋２」とし、Ｂの文字列のうち、Ａの文字列と異なる文字列の箇所についてはスコアを「mismatch＝−２」とする。
【００３６】
また、類似度算出部１５は、ＢについてＡとは異なる文字列が挿入されている区間、または、ＢについてＡの文字列が一部削除されている区間（ギャップが生じている区間）がある場合、当該区間の開始点の文字列についてはスコアを「o＝−３」とし、当該区間の継続点の文字列についてはスコアを「e＝−０．５」とする。
【００３７】
例えば、類似度算出部１５が、図３に示すＢの符号３０２に示す箇所について、Ａ全体と比較すると、符号３０１に示す箇所は、Ａと同じ文字列が並んでいるが、符号３０２に示す区間はＡとは異なる文字列が挿入されている。したがって、類似度算出部１５は、スコアの算出にあたり、Ｂの符号３０１に示す箇所のうち、符号３０２に示す区間の文字列以外の文字列についてはそれぞれ「２」を加算する（match＝＋２）。一方、類似度算出部１５は、符号３０２に示す区間の開始点（符号３０３に示す文字列）については「３」を減算し（o＝−３）、区間の継続点（符号３０４に示す文字列）についてはそれぞれ「０．５」を減算する（e＝−０．５）。
【００３８】
なお、ここでは説明を省略しているが、類似度算出部１５は、Ｂの符号３０２に示す箇所にＡの文字列と異なる文字列があれば当該文字列についてそれぞれ「２」を減算し（mismatch＝−２）、ＢについてＡの文字列が一部削除されている区間がある場合、当該区間の開始点の文字列については「３」を減算し（o＝−３）、当該区間の継続点の文字列についてはそれぞれ「０．５」を減算する（e＝−０．５）。
【００３９】
また、上記のスコア算出において、o＝−３、e＝−０．５のように、e＞oとなり、かつ、（mismatch×２）＜（e＋o）となるような値を用いることで、Ｂに、Ａの一部分が挿入または削除された区間（ギャップの生じている区間）があった場合に、当該挿入または削除を反映したスコア算出を行うことができる。
【００４０】
例えば、類似度算出部１５が、図３の符号３０２に示す区間の文字列すべてについてmismatchであるとして、それぞれ「−２」としてスコア算出を行うと、当該区間のスコアは「−２×５＝−１０」となってしまうが、上記のo＝−３、e＝−０．５のように（mismatch×２）＜（e＋o）となるような値を用いることで当該区間のスコアは「−３＋（−０．５）×４＝−５」となる。
【００４１】
さらに、類似度算出部１５が、o、eについて、上記のo＝−３、e＝−０．５のように、e＞oとなるような値を用いることで、Ｂにおけるギャップの生じている区間の長さによってスコアの値に大きな差が生じないようにすることができる。例えば、Ｂにおけるギャップの生じている区間の長さが「２」である場合、スコアは「−３＋（−０．５）＝−３．５」となる。一方、Ｂにおけるギャップの生じている区間の長さが「５」である場合、スコアは「−３＋（−０．５）×４＝−５」となる。したがって、Ｂにおけるギャップの生じている区間が「２」である場合と「５」である場合とで、それぞれのスコアの差は「１．５」程度にすることができる。
【００４２】
類似度算出部１５は、上記手法を用いて計算した３つのスコア行列を利用して、以下の式（４）で得られる最大スコア点ｊｍａｘを基に、Ｆ（Ａ，Ｂ）／Ｆ（Ａ，Ａ）を算出する。
【００４３】
【数４】
2017061270.tif 000006
【００４４】
例えば、類似度算出部１５は、図３に例示したＡ，Ｂを対象として上記の式（１）〜式（３）を用いて、スコア行列（行列）Ｘ，Ｙ，Ｚを算出すると、その算出結果はそれぞれ図４〜図６に示すようになる。ここで、類似度算出部１５が式（４）に基づき、最大スコア点ｊｍａｘを算出すると「１８．５」になる（図４に示す行列Ｘのｊｍａｘ参照）。つまり、Ｆ（Ａ，Ｂ）＝ｊｍａｘ＝１８．５となる。また、Ｆ（Ａ，Ａ）＝match×｜Ａ｜＝２４となる。したがって、類似度算出部１５は、図３のＢの符号３０１に示す箇所について、Ａ全体との類似度を、Ｆ（Ａ，Ｂ）／Ｆ（Ａ，Ａ）＝１８．５／２４≒類似度７７％と算出する。
【００４５】
なお、類似度算出部１５は、ＢからさらにＡの類似箇所を探索するためには、Ｂから前回の類似度算出で最大スコア点ｊｍａｘ（例えば、１８．５）となった区間以外を対象として、上記と同様の処理を実行し、最大スコア点ｊｍａｘを算出し、Ｆ（Ａ，Ｂ）／Ｆ（Ａ，Ａ）を算出する。このようにすることで、類似度算出部１５は、Ｂの任意の箇所について、Ａとの類似度を算出することができる。なお、算出結果については、脆弱性発見装置１０の記憶部（図示省略）の所定領域に記憶しておき、判定部１６による判定処理時に読み出される。
【００４６】
（判定部）
次に、判定部１６が行う処理について、図７を用いて詳しく説明する。判定部１６では、まず類似度算出部１５で算出された、正規化後の未修正の脆弱性箇所のプログラムコード（以下、未修正の脆弱性箇所のプログラムコードと略す）との類似度が所定の閾値を超える正規化後の検査対象プログラムコード（以下、検査対象プログラムコードと略す）の箇所について、脆弱性のコードクローン部分であるとみなし、当該箇所が未知の脆弱性箇所か否かを判定する。
【００４７】
具体的には、まず、判定部１６は、記憶部（図示省略）から、類似度算出部１５による検査対象プログラムコードの各箇所の類似度の算出結果を読み出し、検査対象プログラムコードの各箇所について、未修正の脆弱性箇所のプログラムコードとの類似度（Ｓｉｍ１）が所定の閾値を超えるか否かを判定する（Ｓ１）。ここで、検査対象プログラムコードに、未修正の脆弱性箇所のプログラムコードとの類似度（Ｓｉｍ１）が所定の閾値を超える箇所があれば（Ｓ１でＹｅｓ）、判定部１６は、当該箇所について、修正済みの脆弱性箇所のプログラムコードとの類似度（Ｓｉｍ２）を算出する（Ｓ２）。ここでの類似度の算出は、例えば、前記した類似度算出部１５での類似度算出と同様の方法で行えばよく、また、修正済みの脆弱性箇所のプログラムコードは、例えば、脆弱性関連ＤＢ１１内の脆弱性関連情報に含まれるパッチ適用済みのプログラムコードの情報を参照する。一方、判定部１６は、検査対象プログラムコードに、未修正の脆弱性箇所のプログラムコードとの類似度（Ｓｉｍ１）が所定の閾値を超える箇所がないと判定した場合（Ｓ１でＮｏ）、処理を終了する。
【００４８】
Ｓ２の後、判定部１６は、当該箇所について、Ｓ２で算出した修正済みの脆弱性箇所のプログラムコードとの類似度（Ｓｉｍ２）と、未修正の脆弱性箇所のプログラムコードとの類似度（Ｓｉｍ１）とを比較し、判定部１６がＳｉｍ２＞Ｓｉｍ１と判定した場合（Ｓ３でＹｅｓ）、処理を終了する。つまり、判定部１６は、当該箇所について、未修正の脆弱性箇所のプログラムコードよりも、修正済みの脆弱性箇所のプログラムコードと類似している場合、処理を終了する。一方、判定部１６が、Ｓｉｍ２≦Ｓｉｍ１と判定した場合（Ｓ３でＮｏ）、当該箇所を未知の脆弱性箇所候補と判定する（Ｓ４）。つまり、判定部１６は、当該箇所についての未修正の脆弱性箇所のプログラムコードとの類似度（Ｓｉｍ１）が、Ｓ２で算出した修正済みの脆弱性箇所のプログラムコードとの類似度（Ｓｉｍ２）以上である場合、当該箇所を未知の脆弱性箇所候補と判定する。換言すると、判定部１６は、Ｓｉｍ２がＳｉｍ１以上と判定した箇所については、既知の脆弱性箇所である可能性が高いと判断し、未知の脆弱性箇所候補から除外する。
【００４９】
なお、当該箇所が、検査対象プログラムコードにおけるどの箇所であるかは、類似度算出部１５で算出した最大スコア点ｊｍａｘを起点に、ｊｍａｘ算出までに至った各行列（スコア行列Ｘ，Ｙ，Ｚ）の算出式の中の要素選択順序を逆順に、i＝１になるまで辿っていくことで求めることができる。この操作をトレースバックと呼ぶ。トレースバックでは、現在着目している要素を算出した１つ前の要素、つまり、（ｉ−１，ｊ−１）、（ｉ−１，ｊ）、（ｉ，ｊ−１）のいずれかを辿ることになる。具体的には、トレースバックを行うには、類似度算出部１５が３つのスコア行列Ｘ，Ｙ，Ｚを算出する際に、別途各スコア行列に応じた選択順序を保持した以下の式（５）に示すポインタ行列Ｐ，Ｑ，Ｒを作成しておき、記憶部（図示省略）に記憶しておく。なお、ポインタとしては、現在の要素の計算に使われた要素の行列の種類と要素の場所が保持される。
【００５０】
【数５】
2017061270.tif 000007
【００５１】
類似度算出部１５は、３つのポインタ行列の各要素を下記の式（６）〜式（８）により算出する。
【００５２】
【数６】
2017061270.tif 000008
【数７】
2017061270.tif 000009
【数８】
2017061270.tif 000010
【００５３】
以上説明した脆弱性発見装置１０によれば、検査対象プログラムコードからコードクローンを用いて、未知の脆弱性箇所の候補を発見することができる。
【００５４】
また、上記の実施形態で述べた脆弱性発見装置１０は、上記の処理を実行する脆弱性発見プログラムを所望の情報処理装置（コンピュータ）にインストールすることによって実装できる。例えば、パッケージソフトウェアやオンラインソフトウェアとして提供される上記の脆弱性発見プログラムを情報処理装置に実行させることにより、情報処理装置を脆弱性発見装置１０として機能させることができる。ここで言う情報処理装置には、デスクトップ型またはノート型のパーソナルコンピュータが含まれる。また、その他にも、情報処理装置にはスマートフォン、携帯電話機やＰＨＳ（Personal  Handyphone  System）等の移動体通信端末、さらには、ＰＤＡ（Personal  Digital  Assistants）等のスレート端末等がその範疇に含まれる。また、脆弱性発見装置１０を、Ｗｅｂサーバやクラウドとして実装してもよい。
【００５５】
（プログラム）
図８は、脆弱性発見プログラムを実行するコンピュータを示す図である。図８に示すように、コンピュータ１０００は、例えば、メモリ１０１０と、ＣＰＵ（Central  Processing  Unit）１０２０と、ハードディスクドライブインタフェース１０３０と、ディスクドライブインタフェース１０４０と、シリアルポートインタフェース１０５０と、ビデオアダプタ１０６０と、ネットワークインタフェース１０７０とを有する。これらの各部は、バス１０８０によって接続される。
【００５６】
メモリ１０１０は、ＲＯＭ（Read  Only  Memory）１０１１およびＲＡＭ（Random  Access  Memory）１０１２を含む。ＲＯＭ１０１１は、例えば、ＢＩＯＳ（Basic  Input  Output  System）等のブートプログラムを記憶する。ハードディスクドライブインタフェース１０３０は、ハードディスクドライブ１０９０に接続される。ディスクドライブインタフェース１０４０は、ディスクドライブ１１００に接続される。ディスクドライブ１１００には、例えば、磁気ディスクや光ディスク等の着脱可能な記憶媒体が挿入される。シリアルポートインタフェース１０５０には、例えば、マウス１１１０およびキーボード１１２０が接続される。ビデオアダプタ１０６０には、例えば、ディスプレイ１１３０が接続される。
【００５７】
ここで、図８に示すように、ハードディスクドライブ１０９０は、例えば、ＯＳ１０９１、アプリケーションプログラム１０９２、プログラムモジュール１０９３およびプログラムデータ１０９４を記憶する。上記実施形態で説明した各情報、データは、例えばハードディスクドライブ１０９０やメモリ１０１０に記憶される。
【００５８】
また、脆弱性発見プログラムは、例えば、コンピュータ１０００によって実行される指令が記述されたプログラムモジュール１０９３として、ハードディスクドライブ１０９０に記憶される。具体的には、上記実施形態で説明した脆弱性発見装置１０が実行する各処理が記述されたプログラムモジュール１０９３が、ハードディスクドライブ１０９０に記憶される。
【００５９】
また、脆弱性発見プログラムによる情報処理に用いられるデータは、プログラムデータとして、例えば、ハードディスクドライブ１０９０に記憶される。そして、ＣＰＵ１０２０が、ハードディスクドライブ１０９０に記憶されたプログラムモジュール１０９３やプログラムデータ１０９４を必要に応じてＲＡＭ１０１２に読み出して、上述した各手順を実行する。
【００６０】
なお、脆弱性発見プログラムに係るプログラムモジュール１０９３やプログラムデータ１０９４は、ハードディスクドライブ１０９０に記憶される場合に限られず、例えば、着脱可能な記憶媒体に記憶されて、ディスクドライブ１１００等を介してＣＰＵ１０２０によって読み出されてもよい。あるいは、脆弱性発見プログラムに係るプログラムモジュール１０９３やプログラムデータ１０９４は、ＬＡＮ（Local  Area  Network）やＷＡＮ（Wide  Area  Network）等のネットワークを介して接続された他のコンピュータに記憶され、ネットワークインタフェース１０７０を介してＣＰＵ１０２０によって読み出されてもよい。
【符号の説明】
【００６１】
１０    脆弱性発見装置
１１    脆弱性関連ＤＢ
１２    逆アセンブル部
１３    脆弱性箇所抽出部
１４    正規化処理部
１５    類似度算出部
１６    判定部
１７    出力部
【図１】
2017061270.tif 000011
【図２】
2017061270.tif 000012
【図３】
2017061270.tif 000013
【図４】
2017061270.tif 000014
【図５】
2017061270.tif 000015
【図６】
2017061270.tif 000016
【図７】
2017061270.tif 000017
【図８】
2017061270.tif 000018
【国際調査報告】
2017061270.tif 000019
2017061270.tif 000020
2017061270.tif 000021
2017061270.tif 000022