(57)【要約】  脆弱性発見装置（１０）は、脆弱性抽出部（１２）と正規化処理部（１４）とマッチング部（１５）とを有する。脆弱性抽出部（１２）は、ソフトウェアの脆弱性箇所に該当する第１のプログラムコードを抽出する。正規化処理部（１４）は、脆弱性抽出部（１２）により抽出された第１のプログラムコードと、脆弱性箇所の検査対象となるソフトウェアの第２のプログラムコードとに含まれるパラメータを正規化する。マッチング部（１５）は、上記正規化後の第１のプログラムコードと上記正規化後の第２のプログラムコードとをマッチングし、上記第２のプログラムコードの中から、上記第１のプログラムコードと同一または類似のプログラムコードを検出する。
2016027641.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.
【非特許文献２】Andreas  Saebjoernsen,  Jeremiah  Willcok,  Thomas  Panas,  Daniel  Quinlan,  and  Zhendong  Su,  “Detecting  Code  Clones  in  Binary  Executables”,  In  Proceedings  of  ISSTA  '09,  2009.
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、ソフトウェアのプログラムコードを検査対象として、コードクローンにより脆弱性を発見する技術は存在しなかった。換言すれば、ソフトウェア開発者がコードクローンによりソフトウェアの脆弱性を発見するためには、検査対象のソフトウェアのソースコードを知る必要があった。従って、ソースコードの入手や利用が困難なソフトウェア（例えば、個人所有のソフトウェア、独占排他権の設定されたソフトウェア）に関しては、脆弱性の発見が困難であった。【０００７】
開示の技術は、上記に鑑みてなされたものであって、ソフトウェアの脆弱性を、ソースコードを用いることなく発見することができる脆弱性発見装置、脆弱性発見方法、及び脆弱性発見プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００８】
上述した課題を解決し、目的を達成するために、本願の開示する脆弱性発見装置は、一つの態様において、ソフトウェアの脆弱性箇所に該当する第１のプログラムコードを抽出する抽出部と、前記抽出部により抽出された第１のプログラムコードと、脆弱性箇所の検査対象となるソフトウェアの第２のプログラムコードとに含まれるパラメータを正規化する正規化部と、前記正規化後の第１のプログラムコードと前記正規化後の第２のプログラムコードとをマッチングし、前記第２のプログラムコードの中から、前記第１のプログラムコードと同一または類似のプログラムコードを検出する検出部とを有する。【０００９】
また、本願の開示する脆弱性発見方法は、一つの態様において、脆弱性発見装置で実行される脆弱性発見方法であって、ソフトウェアの脆弱性箇所に該当する第１のプログラムコードを抽出する抽出工程と、前記抽出工程にて抽出された第１のプログラムコードと、脆弱性箇所の検査対象となるソフトウェアの第２のプログラムコードとに含まれるパラメータを正規化する正規化工程と、前記正規化後の第１のプログラムコードと前記正規化後の第２のプログラムコードとをマッチングし、前記第２のプログラムコードの中から、前記第１のプログラムコードと同一または類似のプログラムコードを検出する検出工程とを含む。【００１０】
更に、本願の開示する脆弱性発見プログラムは、一つの態様において、ソフトウェアの脆弱性箇所に該当する第１のプログラムコードを抽出する抽出ステップと、前記抽出ステップにて抽出された第１のプログラムコードと、脆弱性箇所の検査対象となるソフトウェアの第２のプログラムコードとに含まれるパラメータを正規化する正規化ステップと、前記正規化後の第１のプログラムコードと前記正規化後の第２のプログラムコードとをマッチングし、前記第２のプログラムコードの中から、前記第１のプログラムコードと同一または類似のプログラムコードを検出する検出ステップとをコンピュータに実行させる。
【発明の効果】
【００１１】
本願の開示する脆弱性発見装置、脆弱性発見方法、及び脆弱性発見プログラムは、ソフトウェアの脆弱性を、ソースコードを用いることなく発見することができるという効果を奏する。
【図面の簡単な説明】
【００１２】
【図１】図１は、脆弱性発見装置の構成を示すブロック図である。
【図２】図２は、脆弱性抽出部の処理を説明するための図である。
【図３】図３は、正規化処理部の処理を説明するための図である。
【図４】図４は、マッチング部の処理を説明するための図である。
【図５】図５は、脆弱性発見プログラムによる情報処理がコンピュータを用いて具体的に実現されることを示す図である。
【発明を実施するための形態】
【００１３】
以下に、本願の開示する脆弱性発見装置、脆弱性発見方法、及び脆弱性発見プログラムの実施例を、図面を参照しながら詳細に説明する。なお、以下の実施例により本願の開示する脆弱性発見装置、脆弱性発見方法、及び脆弱性発見プログラムが限定されるものではない。
【００１４】
まず、本願の開示する一実施例に係る脆弱性発見装置１０の構成を説明する。図１は、脆弱性発見装置１０の構成を示すブロック図である。脆弱性発見装置１０は、ソフトウェア中のコードクローンを用いて、検査対象となるソフトウェア（以下、「検査対象ソフトウェア」と記す。）の脆弱性を発見する。図１に示す様に、脆弱性発見装置１０は、脆弱性関連ＤＢ（Data  Base）１１と脆弱性抽出部１２と逆アセンブル部１３と正規化処理部１４とマッチング部１５と脆弱性候補ＤＢ１６とを有する。これら各構成部分は、一方向又は双方向に、信号やデータの入出力が可能な様に接続されている。
【００１５】
脆弱性関連ＤＢ１１は、脆弱性関連情報を記憶する。脆弱性関連情報は、例えば、後述する攻撃検証コード、共通脆弱性識別子（ＣＶＥ：Common  Vulnerabilities  and  Exposures）等である。脆弱性抽出部１２は、脆弱性関連ＤＢ１１から脆弱性関連情報を取得し、該脆弱性関連情報を基に、脆弱性が存在するソフトウェアから、その脆弱性の箇所に該当するプログラムコードを抽出する。
【００１６】
逆アセンブル部１３は、検査対象ソフトウェアＳ１を逆アセンブルする。正規化処理部１４は、脆弱性箇所のプログラムコード１２ａを脆弱性抽出部１２から取得する。正規化処理部１４は、検査対象ソフトウェアＳ１の逆アセンブル結果（アセンブリコード）１３ａを逆アセンブル部１３から取得する。正規化処理部１４は、脆弱性箇所のプログラムコード１２ａと検査対象ソフトウェアＳ１の逆アセンブル結果１３ａとを正規化する。
【００１７】
マッチング部１５は、正規化後の脆弱性箇所のプログラムコード１２ｂと正規化後の検査対象ソフトウェアＳ１のプログラムコード１３ｂとをマッチング（照合）し、プログラムコード１３ｂ中に含まれる、プログラムコード１２ｂのコードクローンを発見する。マッチング部１５は、上記マッチングの結果得られたコードクローンの情報を、未知の脆弱性候補として抽出し、脆弱性候補ＤＢ１６に格納させる。
【００１８】
次に、脆弱性発見装置１０の動作を説明する。
【００１９】
図２は、脆弱性抽出部１２の処理を説明するための図である。図２に示す様に、脆弱性抽出部１２は、脆弱性関連情報として、例えば、公開されているセキュリティパッチＤ１、攻撃検証コードＤ２、共通脆弱性識別子Ｄ３を利用し、脆弱性が存在するソフトウェアから、脆弱性箇所のプログラムコードを抽出する。なお、本実施例では、上記脆弱性が存在するソフトウェアは、検査対象ソフトウェアＳ１とは異なるソフトウェアであるものとするが、これらのソフトウェアは同一であってもよい。また、脆弱性箇所のプログラムコードが抽出される契機は、例えば、上記ソフトウェア中に脆弱性の存在が確認された場合である。
【００２０】
具体的には、脆弱性抽出部１２は、脆弱性関連情報の内、セキュリティパッチＤ１を利用する場合、脆弱性が存在するソフトウェアに対するセキュリティパッチＤ１の適用範囲の部分を、脆弱性箇所のプログラムコードとして抽出する（Ｅ１）。また、脆弱性抽出部１２は、脆弱性関連情報の内、攻撃検証コードＤ２を利用する場合、脆弱性が存在するソフトウェアに対して攻撃検証コードＤ２を実行し、攻撃の起点となる部分を、脆弱性箇所のプログラムコードとして抽出する（Ｅ２）。あるいは、脆弱性抽出部１２は、脆弱性関連情報の内、共通脆弱性識別子Ｄ３を利用する場合、ＣＶＥＤＢ（Common  Vulnerabilities  and  Exposures  Data  Base）を参照して、脆弱性が発見されたソフトウェアの情報を基に特定された部分を、脆弱性箇所のプログラムコードとして抽出する（Ｅ３）。
【００２１】
上述した様に、ソフトウェア開発者が、脆弱性が存在するソフトウェアのソースコードを入手できず、バイナリ形式の実行ファイル（プログラムコード）のみが存在する場合には、図２の実線矢印Ｙ１に示す様に、コンパイルが実行されることなく脆弱性箇所のプログラムコードＰ１が抽出される。これに対し、脆弱性が存在するソフトウェアのソースコードが入手可能な場合には、脆弱性抽出部１２は、各種脆弱性関連情報を用いて脆弱性箇所のプログラムコードを抽出する際、各種コンパイラＣ１〜Ｃ３により、上記ソースコードを網羅的にコンパイルする（破線矢印Ｙ２）。その後、脆弱性抽出部１２は、各コンパイル後の各ソフトウェアから、脆弱性箇所のプログラムコードＰ１を抽出する（破線矢印Ｙ３）。
【００２２】
なお、脆弱性抽出部１２は、コンパイラＣ１によるコンパイルに際し、コンパイルオプションＣ１１、Ｃ１２、…を用いてもよい。同様に、脆弱性抽出部１２は、コンパイラＣ２、Ｃ３によるコンパイルに際し、コンパイルオプションＣ２１、Ｃ２２、…と、コンパイルオプションＣ３１、Ｃ３２、…とをそれぞれ用いてもよい。
【００２３】
次に、逆アセンブル部１３は、検査対象ソフトウェアＳ１を読み込み、逆アセンブルされたコードを出力する。正規化処理部１４は、マッチング元である脆弱性箇所のプログラムコードと、マッチング先である検査対象ソフトウェアＳ１の逆アセンブルされたプログラムコードの正規化処理を行い、正規化されたプログラムコードを出力する。
【００２４】
図３は、正規化処理部１４の処理を説明するための図である。正規化処理とは、ソフトウェアの脆弱性箇所から抽出されたプログラムコードと、検査対象ソフトウェアＳ１の逆アセンブルにより得られたプログラムコードとの双方のプログラムコード中に含まれる箇所（パラメータ）の内、コンパイル環境により変化する箇所（例えば、レジスタの種類、アクセス先のメモリアドレスの値、即値等の可変パラメータ）を抽象化する処理である。図３に示す様に、正規化処理部１４は、上記コンパイル環境により変化する箇所を、その属性だけを表す文字列に変換する。例えば、正規化処理部１４は、プログラムコード中の“0x10”、“00402198”、“0040189C”、“ebx,ebx”の各値を、それぞれ“VAL”、“MEM”、“MEM”、“REG,REG”の各文字列に変換することにより抽象化する。これにより、正規化処理部１４は、検査対象ソフトウェアＳ１がコンパイルされた環境に左右されない正確なマッチングを可能とする。
【００２５】
より詳細には、ソフトウェアは、コンパイルされた環境（例えば、コンパイラ、コンパイルオプション）によっては、ソースコードが同一でも、生成されるプログラムコードが変化する場合がある。従って、ソースコードレベルでは、検査対象ソフトウェアＳ１の中に脆弱性箇所のコードクローンが存在したとしても、コンパイルされた環境によっては、プログラムコードが利用する上記パラメータが変化する場合がある。この場合には、脆弱性発見装置１０は、上述した正規化処理を行わなければ、本来はコードクローンであるプログラムコード部分が、別のプログラムコード部分と誤認識されてしまうことがある。その結果、検査対象ソフトウェアＳ１における脆弱性が看過されてしまう可能性がある。そこで、脆弱性発見装置１０は、上述した正規化処理を行うことで、コンパイル環境の変化に対する適応性を高め、ソースコードを利用しないプログラムコードでの正確なコードクローン探索を実現する。
【００２６】
なお、正規化処理では、機械語命令からオペランド部分を除いた情報である縮約命令を用いてもよい。
【００２７】
マッチング部１５は、脆弱性箇所のプログラムコードと検査対象ソフトウェアＳ１のプログラムコードとをマッチングし、該マッチングにより発見されたコードクローンの情報を、未知の脆弱性候補として抽出する。抽出された情報は、脆弱性候補ＤＢ１６に格納される。なお、マッチング部１５により抽出及び格納される情報は、コードクローン自体であってもよいし、コードクローンの属性情報（例えば、位置、サイズ等）であってもよい。
【００２８】
図４は、マッチング部１５の処理を説明するための図である。図４に示す様に、マッチング部１５は、検査対象ソフトウェアＳ１の利用するアーキテクチャと実行ファイル形式とを判定し、アーキテクチャと実行ファイル形式とが一致する脆弱性箇所のプログラムコードのみを、マッチング元として選択する。ここで、アーキテクチャは、ＣＰＵ（Central  Processing  Unit）が利用する命令セットアーキテクチャであり、例えば“x86”や“ARM”がこれに該当する。また、実行ファイル形式は、ソフトウェアが計算機上において実行可能なファイルのフォーマットであり、例えば“PE”フォーマットや“ELF”フォーマットがこれに該当する。
【００２９】
例えば、図４に示す例では、正規化後の検査対象ソフトウェアＳ１のプログラムコードの利用するアーキテクチャは“x86”であり、実行ファイル形式は“PE”である。従って、アーキテクチャの異なる“ARM”のプログラムコードＰ１３や実行ファイル形式の異なる“ELF”のプログラムコードＰ１２はマッチング元として選択されず、アーキテクチャ“x86”及び実行ファイル形式“PE”を有するプログラムコードＰ１１が選択されることとなる。これにより、検査対象ソフトウェアＳ１とは異なる種類のソフトウェアから抽出されたプログラムコードが、マッチングの対象から除外され、マッチング対象のプログラムコードの絞り込みが可能となる。従って、マッチング処理時間の短縮された効率的なマッチングが可能となる。
【００３０】
なお、上述したアーキテクチャと実行ファイル形式との同一性判定は、必ずしも双方一致でなくてもよく、片方のみの一致であってもよい。
【００３１】
マッチング部１５は、アーキテクチャと実行ファイル形式とが検査対象と同一である脆弱性箇所のプログラムコードを選択した後、該脆弱性箇所のプログラムコードを、検査対象ソフトウェアＳ１のプログラムコードと網羅的にマッチングする。すなわち、マッチング部１５は、図４に示す様に、検査対象ソフトウェアＳ１のプログラムコードの先頭から末尾まで順に、プログラムコードの位置を一命令分ずつ下方にずらしながら、上記マッチングを行う。
【００３２】
マッチング部１５は、上記マッチングに際し、脆弱性箇所のプログラムコード（マッチング元）と、検査対象ソフトウェアＳ１のプログラムコード（マッチング先）とが、どの程度類似するかを示す類似度を算出するものとしてもよい。この場合、マッチング部１５は、マッチングの結果得られた上記類似度が最も高くかつ所定の閾値を超えるプログラムコード部分を、検査対象ソフトウェアＳ１中のコードクローン部分であると判定する。例えば、マッチング部１５は、N-permsを用い、検査対象ソフトウェアＳ１のプログラムコードのマッチング対象を１行ずつ下方にずらしながら、上記類似度を算出する。具体的には、マッチング部１５は、４行中１行が一致した場合には類似度“２５％”、１０行中１行が一致した場合には類似度“１０％”という様に、上記類似度を算出する。そして、マッチング部１５は、算出された類似度が最も高い位置にあるプログラムコード部分（図４では“９５％”の位置）が、上記閾値（例えば、８０〜９０％）を超える場合に、該プログラムコード部分をコードクローン部分と判定する。
【００３３】
なお、上記N-permsは、順序性をもたないＮ個の命令別系列を用いた類似度算出技術であるが、文献“Karim,  M.  E.,  Walenstein,  A.,  Lakhotia,  A.,  and  Parida,  L.“Malware  Phylogeny  Generation  using  Permutations  of  Code”.  European  Research  Journal  of  Computer  Virology  1,  1-2  (Nov.  2005)  13--23.”に記載の周知技術であるため、その詳細な説明は省略する。また、上記類似度の条件に関し、最も高くかつ所定の閾値を超えるプログラムコード部分を例示したが、これに限らず、何れか一方を満たすプログラムコード部分、あるいは、類似度が上位３位以内のプログラムコード部分等、他の条件であってもよい。
【００３４】
上述した様に、脆弱性発見装置１０は、脆弱性箇所のプログラムコードと、検査対象ソフトウェアＳ１のプログラムコードとのマッチングに際し、上記類似度を用いることで、コードクローンの誤検出を更に抑制することができる。その結果、脆弱性の発見精度が向上する。
【００３５】
以上説明した様に、脆弱性発見装置１０は、脆弱性抽出部１２と正規化処理部１４とマッチング部１５とを有する。脆弱性抽出部１２は、ソフトウェアの脆弱性箇所に該当する第１のプログラムコードを抽出する。正規化処理部１４は、脆弱性抽出部１２により抽出された第１のプログラムコードと、脆弱性箇所の検査対象となるソフトウェアの第２のプログラムコードとに含まれる、コンパイル環境により異なるパラメータを正規化する。マッチング部１５は、上記正規化後の第１のプログラムコードと上記正規化後の第２のプログラムコードとをマッチングし、上記第２のプログラムコードの中から、上記第１のプログラムコードと同一または類似のプログラムコードであるコードクローンを、未知の脆弱性候補として検出する。
【００３６】
また、脆弱性発見装置１０において、マッチング部１５は、上記マッチングに際し、アーキテクチャと実行ファイル形式とが上記検査対象となるソフトウェアと同一である上記正規化後の第１のプログラムコードと、上記正規化後の第２のプログラムコードとをマッチングするものとしてもよい。更に、脆弱性抽出部１２は、上記第１のプログラムコードを有するソフトウェアのソースコードをコンパイルし、該コンパイルにより得られたプログラムコードから、上記ソフトウェアの脆弱性箇所に該当する第１のプログラムコードを抽出するものとしてもよい。また、マッチング部１５は、上記第１のプログラムコードと上記第２のプログラムコードとの類似度を算出し、上記第２のプログラムコードの中から、上記類似度が最も高くかつ所定値を超えるプログラムコードを、上記同一または類似のプログラムコードとして検出するものとしてもよい。更に、正規化処理部１４は、上記パラメータとして、上記第１のプログラムコードと上記第２のプログラムコードとの双方のプログラムコード中に含まれるパラメータの内、コンパイル環境により変化するパラメータを正規化するものとしてもよい。
【００３７】
上述した様に、脆弱性発見装置１０は、プログラムコードを直接比較することにより、検査対象ソフトウェアＳ１のソースコードを用いることなく、検査対象ソフトウェアＳ１中においてコードクローンにより生成された脆弱性を発見することができる。従って、ソースコードの入手や利用が困難なソフトウェア（例えば、個人所有のソフトウェア、独占排他権の設定されたソフトウェア）においても、脆弱性の発見が可能となる。
【００３８】
（脆弱性発見プログラム）
図５は、脆弱性発見プログラムによる情報処理がコンピュータ１００を用いて具体的に実現されることを示す図である。図５に示す様に、コンピュータ１００は、例えば、メモリ１０１と、ＣＰＵ（Central  Processing  Unit）１０２と、ハードディスクドライブインタフェース１０３と、ディスクドライブインタフェース１０４と、シリアルポートインタフェース１０５と、ビデオアダプタ１０６と、ネットワークインタフェース１０７とを有し、これらの各部はバスＢによって接続される。
【００３９】
メモリ１０１は、図５に示す様に、ＲＯＭ（Read  Only  Memory）１０１ａ及びＲＡＭ（Random  Access  Memory）１０１ｂを含む。ＲＯＭ１０１ａは、例えば、ＢＩＯＳ（Basic  Input  Output  System）等のブートプログラムを記憶する。ハードディスクドライブインタフェース１０３は、図５に示す様に、ハードディスクドライブ１０８に接続される。ディスクドライブインタフェース１０４は、図５に示す様に、ディスクドライブ１０９に接続される。例えば磁気ディスクや光ディスク等の着脱可能な記憶媒体が、ディスクドライブ１０９に挿入される。シリアルポートインタフェース１０５は、図５に示す様に、例えばマウス１１０、キーボード１１１に接続される。ビデオアダプタ１０６は、図５に示す様に、例えばディスプレイ１１２に接続される。
【００４０】
ここで、図５に示す様に、ハードディスクドライブ１０８は、例えば、ＯＳ（Operating  System）１０８ａ、アプリケーションプログラム１０８ｂ、プログラムモジュール１０８ｃ、プログラムデータ１０８ｄ、脆弱性関連情報、コードクローン情報（脆弱性候補）を記憶する。すなわち、開示の技術に係る脆弱性発見プログラムは、コンピュータ１００によって実行される指令が記述されたプログラムモジュール１０８ｃとして、例えばハードディスクドライブ１０８に記憶される。具体的には、上記実施例で説明した脆弱性抽出部１２と、逆アセンブル部１３と、正規化処理部１４と、マッチング部１５との各々と同様の情報処理を実行する各種手順が記述されたプログラムモジュール１０８ｃが、ハードディスクドライブ１０８に記憶される。また、脆弱性発見プログラムによる情報処理に用いられるデータは、プログラムデータ１０８ｄとして、例えばハードディスクドライブ１０８に記憶される。そして、ＣＰＵ１０２が、ハードディスクドライブ１０８に記憶されたプログラムモジュール１０８ｃやプログラムデータ１０８ｄを必要に応じてＲＡＭ１０１ｂに読み出し、上記各種手順を実行する。
【００４１】
なお、脆弱性発見プログラムに係るプログラムモジュール１０８ｃやプログラムデータ１０８ｄは、ハードディスクドライブ１０８に記憶される場合に限られず、例えば着脱可能な記憶媒体に記憶され、ディスクドライブ１０９等を介してＣＰＵ１０２によって読み出されてもよい。あるいは、脆弱性発見プログラムに係るプログラムモジュール１０８ｃやプログラムデータ１０８ｄは、ネットワーク（ＬＡＮ（Local  Area  Network）、ＷＡＮ（Wide  Area  Network）等）を介して接続された他のコンピュータに記憶され、ネットワークインタフェース１０７を介してＣＰＵ１０２によって読み出されてもよい。
【００４２】
なお、上記実施例では、逆アセンブル部１３は、検査対象ソフトウェアＳ１を逆アセンブルするものとしたが、検査対象ソフトウェアＳ１が高級言語で記述されている場合には、逆コンパイルするものとしてもよい。反対に、図２において、コンパイラＣ１〜Ｃ３はアセンブラであってもよく、脆弱性が存在するソフトウェアのソースコードが入手可能な場合に、該ソースコードがアセンブルされるものとしてもよい。
【００４３】
また、上述した脆弱性発見装置１０の各構成要素は、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的態様は、図示のものに限らず、その全部又は一部を、各種の負荷や使用状況等に応じて、任意の単位で機能的又は物理的に分散・統合して構成することもできる。例えば、脆弱性抽出部１２と正規化処理部１４、逆アセンブル部１３と正規化処理部１４の少なくとも一方を１つの構成要素として統合してもよい。反対に、マッチング部１５に関し、マッチング処理を実行する部分と、コードクローンを検出する部分と、用いるアーキテクチャ及び実行ファイル形式の同一性を判定する部分とに分散してもよい。更に、ハードディスクドライブ１０８を、脆弱性発見装置１０の外部装置として、ネットワークやケーブル経由で接続する様にしてもよい。
【符号の説明】
【００４４】
１０  脆弱性発見装置
１１  脆弱性関連ＤＢ
１２  脆弱性抽出部
１３  逆アセンブル部
１４  正規化処理部
１５  マッチング部
１６  脆弱性候補ＤＢ
１００  コンピュータ
１０１  メモリ
１０１ａ  ＲＯＭ
１０１ｂ  ＲＡＭ
１０２  ＣＰＵ
１０３  ハードディスクドライブインタフェース
１０４  ディスクドライブインタフェース
１０５  シリアルポートインタフェース
１０６  ビデオアダプタ
１０７  ネットワークインタフェース
１０８  ハードディスクドライブ
１０８ａ  ＯＳ
１０８ｂ  アプリケーションプログラム
１０８ｃ  プログラムモジュール
１０８ｄ  プログラムデータ
１０９  ディスクドライブ
１１０  マウス
１１１  キーボード
１１２  ディスプレイ
Ｃ１、Ｃ２、Ｃ３  コンパイラ
Ｃ１１、Ｃ１２、…、Ｃ２１、Ｃ２２、…、Ｃ３１、Ｃ３２、…  コンパイルオプション
Ｄ１  セキュリティパッチ
Ｄ２  攻撃検証コード
Ｄ３  共通脆弱性識別子
Ｐ１  脆弱性箇所のプログラムコード
Ｐ１１、Ｐ１２、Ｐ１３  プログラムコード
Ｓ１  検査対象ソフトウェア
【図１】
2016027641.tif 000003
【図２】
2016027641.tif 000004
【図３】
2016027641.tif 000005
【図４】
2016027641.tif 000006
【図５】
2016027641.tif 000007
【手続補正書】
【提出日】平成29年1月17日(2017.1.17)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
ソフトウェアのソースコードをコンパイルし、該コンパイルにより得られたプログラムコードから、前記ソフトウェアの脆弱性箇所に該当する第１のプログラムコードを抽出する抽出部と、
前記抽出部により抽出された第１のプログラムコードと、脆弱性箇所の検査対象となるソフトウェアの第２のプログラムコードとに含まれるパラメータを正規化する正規化部と、
前記正規化後の第１のプログラムコードと前記正規化後の第２のプログラムコードとをマッチングし、前記第２のプログラムコードの中から、前記第１のプログラムコードと同一または類似のプログラムコードを検出する検出部と
を有することを特徴とする脆弱性発見装置。
【請求項２】
前記検出部は、アーキテクチャと実行ファイル形式とが前記検査対象となるソフトウェアと同一である前記正規化後の第１のプログラムコードと、前記正規化後の第２のプログラムコードとをマッチングすることを特徴とする請求項１に記載の脆弱性発見装置。
【請求項３】
前記検出部は、前記第１のプログラムコードと前記第２のプログラムコードとの類似度を算出し、前記第２のプログラムコードの中から、前記類似度が最も高くかつ所定値を超えるプログラムコードを、前記同一または類似のプログラムコードとして検出することを特徴とする請求項１に記載の脆弱性発見装置。
【請求項４】
前記正規化部は、前記パラメータとして、前記第１のプログラムコードと前記第２のプログラムコードとの双方のプログラムコード中に含まれるパラメータの内、コンパイル環境により変化するパラメータを正規化することを特徴とする請求項１に記載の脆弱性発見装置。
【請求項５】
前記抽出部は、公開されている脆弱性情報から、脆弱性に対するセキュリティパッチの適用範囲、脆弱性に対する攻撃の起点となる部分、および、共通脆弱性識別子に対応する脆弱性箇所の少なくともいずれかを、前記第１のプログラムコードとして抽出することを特徴とする請求項１に記載の脆弱性発見装置。
【請求項６】
脆弱性発見装置で実行される脆弱性発見方法であって、
前記脆弱性発見装置の抽出部が、ソフトウェアのソースコードをコンパイルし、該コンパイルにより得られたプログラムコードから、前記ソフトウェアの脆弱性箇所に該当する第１のプログラムコードを抽出する抽出工程と、
前記脆弱性発見装置の正規化部が、前記抽出工程にて抽出された第１のプログラムコードと、脆弱性箇所の検査対象となるソフトウェアの第２のプログラムコードとに含まれるパラメータを正規化する正規化工程と、
前記脆弱性発見装置の検出部が、前記正規化後の第１のプログラムコードと前記正規化後の第２のプログラムコードとをマッチングし、前記第２のプログラムコードの中から、前記第１のプログラムコードと同一または類似のプログラムコードを検出する検出工程と
を含むことを特徴とする脆弱性発見方法。
【請求項７】
コンピュータを請求項１に記載の脆弱性発見装置として機能させるための脆弱性発見プログラム。
【国際調査報告】
2016027641.tif 000008
2016027641.tif 000009
2016027641.tif 000010
2016027641.tif 000011