(57)【特許請求の範囲】
【請求項１】
ＲＯＰ(Return  Oriented  Programming)チェーンに用いられる学習用のライブラリファイルを事前に解析し、前記ライブラリファイル内のコード片であるＲＯＰガジェットのアドレスと、該ＲＯＰガジェットが実行された際のスタックポインタの増加値と、の組を取得する事前実行部と、
前記事前実行部の取得結果を用いて、検査対象の未知のデータ系列について、前記ＲＯＰガジェット同士が正しく繋がる有効な前記ＲＯＰチェーンであるかを検証することによって、前記検査対象の未知のデータ系列が悪性データ系列であるか否かを検知する検知部と、
を有することを特徴とする攻撃コード検知装置。
【請求項２】
前記ＲＯＰチェーンを含む既知の悪性データ系列と、既知の良性データ系列とを学習データとして、悪性データ系列のバイト列の特徴を学習したモデルと、良性データ系列のバイト列の特徴を学習したモデルと、を生成する学習部をさらに有し、
前記検知部は、前記モデルを用いた確率計算に基づいて前記検査対象の未知のデータ系列が悪性データ系列であるか否かを検知することを特徴とする請求項１に記載の攻撃コード検知装置。
【請求項３】
前記検知部は、前記ＲＯＰガジェット同士が正しく繋がる可能性を考慮して、悪性データ系列のモデルと、良性データ系列のモデルとの間での尤度比検定を行い、前記検査対象の未知のデータ系列が悪性データ系列であるか否かを検知することを特徴とする請求項２に記載の攻撃コード検知装置。
【請求項４】
前記悪性データ系列及び前記良性データ系列は、文書ファイルであることを特徴とする請求項２または３に記載の攻撃コード検知装置。
【請求項５】
攻撃コード検知装置が実行する攻撃コード検知方法であって、
ＲＯＰチェーンに用いられる学習用のライブラリファイルを事前に解析し、前記ライブラリファイル内のコード片であるＲＯＰガジェットのアドレスと、該ＲＯＰガジェットが実行された際のスタックポインタの増加値と、の組を取得する事前実行工程と、
前記事前実行工程における取得結果を用いて、検査対象の未知のデータ系列について、前記ＲＯＰガジェット同士が正しく繋がる有効な前記ＲＯＰチェーンであるかを検証することによって、前記検査対象の未知のデータ系列が悪性データ系列であるか否かを検知する検知工程と、
を含んだことを特徴とする攻撃コード検知方法。
【請求項６】
ＲＯＰチェーンに用いられる学習用のライブラリファイルを事前に解析し、前記ライブラリファイル内のコード片であるＲＯＰガジェットのアドレスと、該ＲＯＰガジェットが実行された際のスタックポインタの増加値と、の組を取得する事前実行ステップと、
前記事前実行ステップにおける取得結果を用いて、検査対象の未知のデータ系列について、前記ＲＯＰガジェット同士が正しく繋がる有効な前記ＲＯＰチェーンであるかを検証することによって、前記検査対象の未知のデータ系列が悪性データ系列であるか否かを検知する検知ステップと、
をコンピュータに実行させるための攻撃コード検知プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、攻撃コード検知装置、攻撃コード検知方法及び攻撃コード検知プログラムに関する。
【背景技術】
【０００２】
標的型攻撃をはじめ、ソフトウェアの脆弱性を悪用した攻撃の脅威が顕在化している。こうした攻撃は、攻撃対象に攻撃コードを実行させることにより実現され、マルウェアの感染に至らせる。脆弱性を悪用した攻撃は、主に、エクスプロイトコード、シェルコード、ＲＯＰ（Return  Oriented  Programming）チェーンの３種類の攻撃コードによって構成されている。【０００３】
エクスプロイトコードは、悪意のある動作を実現するために、脆弱性を悪用する攻撃コードである。エクスプロイトコードは、メモリ破壊などの脆弱性を悪用し、プログラムの制御を奪う。これにより、プログラムの制御を攻撃者の用意したシェルコードなどに遷移させる。【０００４】
このシェルコードとは、攻撃者が作成した機械語コード片であり、作成したコードに応じて、アプリケーションに任意の動作をさせることができる。シェルコードによる攻撃を実現するためには、メモリ上にシェルコードを書き込み、プログラムの制御をそこに移すことによって実行させる必要がある。ただし、近年では、書き込み可能なメモリ領域を実行不可にするデータ実行防止機構の普及により、シェルコードのみで攻撃を成功させることは難しくなってきている。【０００５】
これに伴い、ＲＯＰと呼ばれる新たな攻撃手法が脅威となっている。ＲＯＰとは、脆弱性を攻略してコールスタックを上書きすることでリターン先を掌握し、ｒｅｔ命令の繰り返しによってライブラリなどの既存のコードを継ぎ接ぎしながら実行することで、任意のコード実行を実現する攻撃手法である。なお、ＲＯＰでリターンした先に存在する、継ぎ接ぎされる既存のコード片は、ＲＯＰガジェットと呼ばれる。【０００６】
このＲＯＰは、以下の手順で実現される。まず、攻撃者は、バッファオーバーフローなどの脆弱性を突いて、コールスタックを書き換えることができることを確認する。これによって、攻撃者は、以降のリターン先を掌握できるようになる。続いて、攻撃者は、コールスタックを上書きするコードを生成する。このとき、攻撃者は、リターンの繰り返しによってライブラリなどの既存のコードを継ぎ接ぎし、任意の動作を実現できるコードを生成する。この生成されたコードを、ＲＯＰチェーンと呼ぶ。【０００７】
そして、攻撃者は、ＲＯＰチェーンを用いてコールスタックを上書きさせることによって、攻撃対象に対し、攻撃者の任意のコードを実行させる。以上が一般的なＲＯＰの手順である。このＲＯＰでは、シェルコードを注入することなく、任意のコードを実行させることが可能である。【０００８】
このＲＯＰは、データ実行防止機構に影響されずに任意コード実行が可能であるものの、攻撃対象の環境によって、ＲＯＰチェーンの長さに制約があり、自由な攻撃を実現できない場合も少なくない。したがって、近年では、攻撃手法として、短いＲＯＰチェーンによってデータ実行防止機構を回避し、実際の悪性な動作を、シェルコードによって実現する手法が多く見られる。【０００９】
このような脆弱性を悪用した攻撃を検知し、対処するためには、データ中に攻撃コードが含まれているか否かを検査する方法がある。なお、検査対象となるデータには、例えば、文書ファイルや通信のストリームなどが挙げられる。【００１０】
ここで、攻撃コードの検知を考えたとき、前述の３種類の攻撃コードのうち、エクスプロイトコードは、悪用する脆弱性によって形態が大きく異なるため、一括した手法での検知が難しいことが知られている。【００１１】
また、シェルコードについても検知が困難な場合がある。例えば、シェルコードがエンコードされていて実行の直前にデコードされる場合である。この場合には、シェルコードの特徴がエンコードによって隠蔽されるため、検知が難しくなる。一方、ＲＯＰチェーンは、形態に一貫性があり、また、エンコードされない状態で存在している。そのため、攻撃コードのうち、ＲＯＰチェーンの検知は、重要な技術の一つとなっている。【００１２】
このＲＯＰチェーンを検知する手法には、動的手法と静的手法が考えられる。動的手法は、攻撃を検証するための環境を用意し、実際に攻撃の実行を監視することによって検知する手法である。静的手法は、攻撃を実行することなく、バイト値など、データの表層的な情報を基にして検知する手法である。【００１３】
これらのうち、動的手法は、攻撃の実行を監視する必要があるため、一般に時間を要する。たとえば、悪性文書ファイルに含まれるＲＯＰチェーンを検知する場合、動的手法では、攻撃が成功する環境を準備し、ビューアアプリケーションによって文書ファイルを開いて攻撃を観測しなければならない。このため、動的手法は、高速性が要求されない場合のみにしか適用できないという欠点がある。【００１４】
したがって、高速な検知が必要な場合には、静的手法を用いることが望ましく、複数の静的手法が提案されている（例えば、非特許文献１〜５参照）。
【先行技術文献】
【非特許文献】
【００１５】
【非特許文献１】C.  YoungHan  et  al.  “STROP:  Static  Approach  for  Detection  of  Return-Oriented  Programming  Attack  in  Network”,  IEICE  Transactions  on  Communications,  98(1):242-251,  2015
【非特許文献２】田中恭之，後藤厚宏，“ROP攻撃コード検出による悪性文書ファイル特定手法の提案”，  電子情報通信学会技術研究報告,  114(117),  39-45
【非特許文献３】Blaine.  Stancill,  et  al.  “Check  My  Profile:  Leveraging  Static  Analysis  for  Fast  and  Accurate  Detection  of  ROP  Gadgets”，In  Proceedings  of  the  16th  International  Symposium  on  Research  in  Attacks,  Intrusions,  and  Defenses,  pages  62-81.  Springer,  2013
【非特許文献４】Christopher.  Jamthagen,  et  al.  “eavesROP:  Listening  for  ROP  Payloads  in  Data  Streams”，In  Proceedings  of  the  International  Conference  on  Information  Security，pages  413-424.  Springer,  2014
【非特許文献５】碓井利宣，幾世知範，岩村誠，矢田健，“隠れマルコフモデルに基づくＲＯＰチェーン静的検知手法”，電子情報通信学会技術研究報告,115(488),  71-76
【発明の概要】
【発明が解決しようとする課題】
【００１６】
しかしながら、非特許文献１〜５に記載の静的手法では、ＲＯＰチェーンの繋がりを考慮せずにバイト列の特徴のみに着目している。このため、非特許文献１〜５に記載の静的手法では、偶発的に発生した、ＲＯＰチェーンらしさが高いが、ＲＯＰチェーンではないバイト列を、ＲＯＰチェーンであると過検知してしまう場合があるという問題があった。【００１７】
本発明は、上記に鑑みてなされたものであって、高速性を損なうことなく、過検知を削減した高精度なＲＯＰチェーンの静的検知を実現することができる攻撃コード検知装置、攻撃コード検知方法及び攻撃コード検知プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１８】
上述した課題を解決し、目的を達成するために、本発明に係る攻撃コード検知装置は、ＲＯＰチェーンに用いられる学習用のライブラリファイルを事前に解析し、ライブラリファイル内のコード片であるＲＯＰガジェットのアドレスと、該ＲＯＰガジェットが実行された際のスタックポインタの増加値と、の組を取得する事前実行部と、事前実行部の取得結果を用いて、検査対象の未知のデータ系列について、ＲＯＰガジェット同士が正しく繋がる有効なＲＯＰチェーンであるかを検証することによって、検査対象の未知のデータ系列が悪性データ系列であるか否かを検知する検知部と、を有することを特徴とする。
【発明の効果】
【００１９】
本発明によれば、高速性を損なうことなく、過検知を削減した高精度なＲＯＰチェーンの静的検知を実現することができる。
【図面の簡単な説明】
【００２０】
【図１】図１は、実施の形態に係る攻撃コード検知装置の構成の一例を説明するための図である。
【図２】図２は、図１に示すラベル付き悪性文書ファイルの一例を示す図である。
【図３】図３は、図２に示すファイルにおけるＲＯＰチェーン部分を説明するための図である。
【図４】図４は、図３の表の左側部分の１行目から５行目のバイト及びラベルを模式的に対応付けた図である。
【図５】図５は、潜在系列（ラベル列）の潜在変数となるラベルの遷移の例を示した図である。
【図６】図６は、各潜在変数（ラベル）について潜在系列の初期状態確率を対応付けた表を示す図である。
【図７】図７は、潜在変数（ラベル）ごとに、観測変数（バイト）の出力確率を対応付けた表を示す図である。
【図８】図８は、潜在系列（ラベル列）の遷移確率を、遷移する潜在変数の組み合わせごとに対応付けた表を示す図である。
【図９】図９は、６４ｂｉｔ環境に対応させたラベルの遷移の例を示す図である。
【図１０】図１０は、図１に示す攻撃コード検知装置が確率モデルを生成するまでの処理手順を示すフローチャートである。
【図１１】図１１は、図１０に示す確率モデル生成処理の処理手順を示すフローチャートである。
【図１２】図１２は、図１に示す攻撃コード検知装置がオフセット辞書を生成するまでの処理手順を示すフローチャートである。
【図１３】図１３は、図１２に示すオフセット辞書生成処理の処理手順を示すフローチャートである。
【図１４】図１４は、図１に示す攻撃コード検知装置が検査対象未知文書ファイルを、ＲＯＰチェーンを持つ悪性文書ファイルか否かを判定するまでの処理手順を示すフローチャートである。
【図１５】図１５は、図１４に示す検知処理の処理手順を示すフローチャートである。
【図１６】図１６は、プログラムが実行されることにより、攻撃コード検知装置が実現されるコンピュータの一例を示す図である。
【発明を実施するための形態】
【００２１】
以下、図面を参照して、本発明の一実施形態を詳細に説明する。なお、この実施形態により本発明が限定されるものではない。また、図面の記載において、同一部分には同一の符号を付して示している。
【００２２】
［実施の形態］
実施の形態に係る攻撃コード検知装置は、事前に、ＲＯＰチェーンを含む悪性文書ファイルの特徴を学習した確率モデルと、良性文書ファイルの特徴を学習した確率モデルと、を生成する。さらに、この攻撃コード検知装置は、ＲＯＰチェーンに用いられるライブラリファイルを事前に解析し、ライブラリファイル内に含まれる有効なＲＯＰガジェットのアドレスと、該ＲＯＰガジェットが実行された際のスタックポインタの増加値（オフセット）と、の組をオフセット辞書として取得する。
【００２３】
そして、この攻撃コード検知装置は、生成した確率モデル、及び、取得したオフセット辞書に基づき、検知対象である未知の文書に対し、悪性文書らしさを示す尤度と良性文書らしさを示す尤度とを算出する。攻撃コード検知装置では、尤度計算の際には、ＲＯＰチェーンが実行された際に、ＲＯＰガジェットが正しく繋がるか否かを考慮する。これによって、実施の形態に係る攻撃コード検知装置は、この未知の文書をビューアアプリケーションで開くことなく、この未知の文書がＲＯＰチェーンを含むか否かを静的に検査する。
【００２４】
［攻撃コード検知装置の構成］
まず、図１を参照して、実施の形態に係る攻撃コード検知装置の構成について説明する。図１は、実施の形態に係る攻撃コード検知装置の構成の一例を説明するための図である。
【００２５】
図１に示すように、攻撃コード検知装置１０は、事前実行部１１、制御部１２、出力部１３、記憶部１４、オフセット辞書データベース（ＤＢ）２０及び確率モデルＤＢ３０を有する。そして、攻撃コード検知装置１０は、ラベル付き悪性文書ファイル１００、ラベル付き良性文書ファイル２００、検査対象未知文書ファイル３００及び学習データライブラリファイル４００の入力を受け付ける。
【００２６】
事前実行部１１は、ＲＯＰに用いられる学習データライブラリファイル４００を入力として受付ける。そして、事前実行部１１は、学習データライブラリファイル４００のコード領域を１バイトずつエミュレーション実行して事前に解析する。これによって、事前実行部１１は、ＲＯＰガジェットのアドレスと、そのＲＯＰガジェットを実行した際のスタックポインタのオフセットと、の組を、オフセット辞書として取得する。事前実行部１１は、取得したオフセット辞書を、オフセット辞書ＤＢ２０に記憶させる。
【００２７】
ここで、スタックポインタは、ＲＯＰガジェットを実行すると増加する。そして、スタックポインタが増加した先にもアドレスがある場合には、このアドレスに対応するＲＯＰガジェットを実行することによって、さらに増加する。このスタックポインタの増加値がオフセットである。そして、ＲＯＰガジェットのアドレスと、そのＲＯＰガジェットを実行した際のスタックポインタのオフセットとは対応しているため、事前実行部１１は、ＲＯＰガジェットのアドレスと、そのＲＯＰガジェットを実行した際のスタックポインタのオフセットと、の組を、オフセット辞書として取得する。
【００２８】
制御部１２は、各種の処理手順などを規定したプログラム及び所要データを格納するための内部メモリを有し、これらによって種々の処理を実行する。例えば、制御部１２は、ＣＰＵ（Central  Processing  Unit）やＭＰＵ（Micro  Processing  Unit）などの電子回路である。制御部１２は、ファイル形式判定部１２１、デコード部１２２、学習部１２３、検知部１２４を有する。
【００２９】
ファイル形式判定部１２１は、入力される全ての文書ファイルに対し、いずれのファイル形式によって構成されているファイルであるかを判定する。ファイル形式判定部１２１は、入力された文書ファイルについて、この文書ファイルのヘッダやファイル構造の特徴に基づいて、ファイルの形式を判別する。例えば、ファイルの形式として、ＤＯＣ、ＸＬＳ、ＰＰＴ、ＰＤＦなどが想定される。
【００３０】
デコード部１２２は、文書ファイルの形式によってはエンコードされている領域が存在するため、ファイル中にエンコードされた領域があれば、その領域をデコードする。このデコード部１２２は、ファイル形式の仕様に基づいてデコードし、文書ファイルがビューアアプリケーションによってメモリ上に展開された状態と同様の状態のバイト列を取得する。
【００３１】
学習部１２３は、後述するラベル付き悪性文書ファイル１００またはラベル付き良性文書ファイル２００を学習データとして、確率モデルを生成する。学習部１２３は、生成した確率モデルを、確率モデルＤＢ３０にモデルパラメータの形で記憶させる。
【００３２】
検知部１２４は、事前実行部１１が生成したオフセット辞書を用いて、後述する検査対象未知文書ファイル３００について、ＲＯＰガジェット同士が正しく繋がる有効なＲＯＰチェーンであるかを検証することによって、検査対象未知文書ファイル３００が悪性文書ファイルであるか否かを検知する。そして、検知部１２４は、確率モデルを用いた確率計算に基づいて検査対象未知文書ファイル３００が悪性文書ファイルであるか否かを検知する。
【００３３】
具体的には、検知部１２４は、ＲＯＰガジェット同士が正しく繋がる可能性を考慮して、悪性データ系列の確率モデルと、良性データ系列の確率モデルとの間での尤度比検定を行い、検査対象未知文書ファイル３００が悪性文書ファイルであるか否かを検知する。言い換えると、検知部１２４は、学習部１２３が生成した確率モデルと、事前実行部１１が生成したオフセット辞書とを用い、検査対象未知文書ファイル３００が、良性文書ファイルらしさが高いか、悪性文書ファイルらしさが高いかを、尤度比検定により計算する。検知部１２４は、この尤度比検定の際に、オフセット辞書を用いて、ＲＯＰチェーンの候補部分が実行された場合に、ＲＯＰガジェット同士が正しく繋がる可能性を考慮した計算を実施する。これにより、検知部１２４では、過検知を削減している。そして、検知部１２４は、尤度比検定の結果、悪性文書ファイルらしさが高ければ、ＲＯＰチェーンを含んだ悪性文書ファイルであるとして検知する。
【００３４】
出力部１３は、例えば、液晶ディスプレイやプリンタ等であって、攻撃コード検知に関する情報を含む各種情報を出力する。また、出力部１３は、外部装置との間で、各種データの入出力を司るインタフェースであってもよく、外部装置に各種情報を出力してもよい。
【００３５】
記憶部１４は、ＲＡＭ（Random  Access  Memory）、フラッシュメモリ（Flash  Memory）等の半導体メモリ素子、または、ハードディスク、光ディスク等の記憶装置によって実現され、攻撃コード検知装置１０を動作させる処理プログラムや、処理プログラムの実行中に使用されるデータなどが記憶される。
【００３６】
オフセット辞書ＤＢ２０は、事前実行部１１によって取得されたオフセット辞書を、ＲＯＰガジェットのアドレスと、そのガジェットを実行した際のスタックポインタとを組み合わせた形で蓄積する。オフセット辞書ＤＢ２０は、攻撃コード検知装置１０によって管理される。もちろん、オフセット辞書ＤＢ２０は、他の装置（サーバ等）によって管理されていてもよく、この場合には、事前実行部１１は、出力部１３の通信インタフェースを介して、生成したオフセット辞書を、オフセット辞書ＤＢ２０の管理サーバ等に出力して、オフセット辞書ＤＢ２０に記憶させる。
【００３７】
確率モデルＤＢ３０は、学習部１２３によって生成された確率モデルをモデルパラメータの形で蓄積する。確率モデルＤＢ３０は、攻撃コード検知装置１０によって管理される。もちろん、確率モデルＤＢ３０は、他の装置（サーバ等）によって管理されていてもよく、この場合には、学習部１２３は、出力部１３の通信インタフェースを介して、生成した確率モデルを、確率モデルＤＢ３０の管理サーバ等に出力して、確率モデルＤＢ３０に記憶させる。
【００３８】
［ラベル付き悪性文書の構成］
次に、ラベル付き悪性文書ファイル１００について説明する。図２は、ラベル付き悪性ファイル文書１００の一例を示す図である。ラベル付き悪性文書ファイル１００は、実際の悪性文書ファイルを調査し得られたものであり、例えば、図２のファイルＤに示すように、エクスプロイトコード部、シェルコード部、ＲＯＰチェーン部などを含む。本実施の形態では、このうち、ＲＯＰチェーン部に着目する。
【００３９】
図３は、図２に示すファイルＤ（ラベル付き悪性文書ファイル１００）におけるＲＯＰチェーン部分を説明するための図である。図３は、説明のために、ＲＯＰチェーン部分及びその前後の部分のデータ系列の具体例を示す。図３では、ＲＯＰチェーン部分とともにＲＯＰチェーン部分の直前の文書ファイルの一部バイト値として「0xff」、及び、ＲＯＰチェーン部分の直後の文書ファイルの一部バイト値として「0x31」を示す。
【００４０】
ここでは、リトルエンディアンの環境下で、４バイトで構成されるアドレスや定数を１バイトごとに分割し、最下位のバイトから順に記録した例を示している。そこで、図３では、分割された各バイトの値を、表Ｔａの左列に、記録順に一列に配置している。以降については、この列をバイト列として説明する。
【００４１】
図３に示すように、攻撃コード検知装置１０では、ラベル付き悪性文書ファイル１００として、ラベル付き悪性文書ファイル１００のそれぞれのバイト値に、各バイトの由来を表すラベルが対応付けられて組になったものが用いられている。由来とは、そのバイト値が文書ファイルの構成要素か、ＲＯＰチェーンの構成要素かを示すものである。なお、図３では、各バイト値にそれぞれ対応付けられたラベルの名前は、表Ｔａの右列に、組となるバイトの配置に合わせて一列に配置している。以降については、この列をラベル列として説明する。
【００４２】
ここで、ＲＯＰチェーンの具体的な構成要素として、ＲＯＰガジェットアドレス、定数、及び、ジャンクコードの３つがある。ＲＯＰガジェットアドレスは、ＲＯＰガジェットのメモリ上の位置を指し示すアドレス値である。定数は、ＲＯＰガジェット中での演算に用いられる定数値である。そして、ジャンクコードは、スタックポインタの位置を調整するためにあるもので、攻撃の際に参照されないコードである。
【００４３】
以降では、上記の３つの構成要素をそれぞれ、「アドレス」、「定数」、「ジャンク」と表記する。また、本実施の形態は、文書ファイルの構成要素を「文書ラベル」と表記する。
【００４４】
そして、ＲＯＰチェーンの構成要素には、ＲＯＰ（アドレス１，２，３，４）ラベル、ＲＯＰ（定数１，２，３，４）ラベル、ＲＯＰ（ジャンク）ラベルを用いている。ここで、「１，２，３，４」の数字は、４バイトで構成されるアドレスや定数のうち、何バイト目のバイトであるかを示すインデックスである。リトルエンディアンの環境下では、ＲＯＰ（アドレス１）やＲＯＰ（定数１）のラベルには、アドレスや定数の最下位バイトが対応し、ＲＯＰ（アドレス４）やＲＯＰ（定数４）のラベルには、最上位バイトが対応する。
【００４５】
例えば、図３の表Ｔａの左側部分の上から２行目から始まる「0x0101acd9」というＲＯＰアドレスに対しては、バイト値「0xd9」にＲＯＰ（アドレス１）ラベルが付与されており、バイト値「0xac」にＲＯＰ（アドレス２）ラベルが付与されており、バイト値「0x01」にＲＯＰ（アドレス３）ラベルが付与されており、バイト値「0x01」にはＲＯＰ（アドレス４）ラベルが付与されている。同様に、表Ｔａの右側部分の１行目から始まる「0x00003000」という定数に対しては、バイト値「0x00」にＲＯＰ（定数１）ラベルが付与されており、バイト値「0x30」にＲＯＰ（定数２）ラベルが付与されており、バイト値「0x00」にＲＯＰ（定数３）ラベルが付与されており、バイト値「0x00」にＲＯＰ（定数４）ラベルが付与されている。
【００４６】
このように、攻撃コード検知装置１０においては、学習用のデータとして、ラベル付き悪性文書ファイル１００のそれぞれのバイトに、文書ラベル或いはＲＯＰラベルが対応付けられたものを用いる。
【００４７】
なお、ラベルの設計はこれに限るものではなく、例えば、文書ラベルを文書ファイルの形式にあわせてさらに細かく分解してもよい。具体的には、ＤＯＣ形式のファイルにおいて、テキスト文書が含まれるワードドキュメントストリーム、様々なデータが含まれるデータストリーム、マクロプログラムが含まれるマクロストレージなどでは、それぞれバイト列の分布が異なると考えられるため、これらを分けるなどが考えられる。
【００４８】
また、学習データとなるラベル付き悪性文書ファイル１００は、予め作成されたものである。ラベル付き悪性文書ファイル１００の作成は、ＲＯＰチェーンが含まれる悪性文書ファイルを発見し、この発見した悪性文書ファイルを用いて、所定の方法でバイトに分割する。続いて、手動或いは動的解析によって、各バイトに、ラベルを付与する。
【００４９】
例えば、手動によってラベルを付与する場合には、一般に流通している、脆弱性に対するＰｏＣ（Proof-of-Concept）コードなどに記載されているＲＯＰアドレスを参照して、文書ファイル中に埋め込まれたＲＯＰチェーンを抽出する。そして、アドレス値から、ＲＯＰが用いるライブラリの種類を調べ、ＲＯＰアドレスを確認しながらラベル付けをしていく。
【００５０】
また、動的解析によってラベルを付与する場合は、他の手法（例えば、L.  Davi,  A.  Sadeghi  and  M.  Winandy,  “ＲＯＰdefender:  A  Detection  Tool  to  Defend  Against  Return-Oriented  Programming  Attacks”,  Proceedings  of  the  6th  ACM  Symposium  on  Information,  Computer  and  Communications  Security,  Pages  40-51,  ASIACCS,  2011参照）を応用することもできる。すなわち、実行命令やスタックの状態などを監視することによってＲＯＰを検知するシステムを用いて、ＲＯＰチェーン部分を抽出する。そして、このシステムに、実行されたＲＯＰガジェットのアドレスを参照することで、抽出したＲＯＰチェーンにラベル付けする機能を付加することにより、ラベルの付与を実現する。
【００５１】
［ラベル付き良性文書ファイルの構成］
次に、ラベル付き良性文書ファイル２００について説明する。ラベル付き良性文書ファイル２００は、一般に流通している悪性でない文書ファイルであり、攻撃コードを含まない。ラベル付き良性文書ファイル２００は、ラベル付き悪性文書ファイル１００と同様に、各バイトに対応したラベルを持ち、ＲＯＰチェーンを持たないために、そのラベルはすべて文書ラベルとなる。
【００５２】
ラベル付き良性文書ファイル２００も、ラベル付き悪性文書ファイル１００と同じく学習データであるため、予め作成されるものである。ラベル付き良性文書ファイル２００の作成は、良性文書ファイルを発見し、所定の方法でバイトに分割してから、各バイトに文書ラベルを付与することにより実施される。良性文書ファイルの発見には、既存のセキュリティ技術を基に良性であると判断されたものを用いてもよく、研究用のデータセットなどを用いてもよい。
【００５３】
［学習用のライブラリファイルの構成］
ＲＯＰチェーンに用いられる学習データライブラリファイル４００は、ＲＯＰによる攻撃の対象となるアプリケーションがメモリ上に読み込むライブラリファイルである。攻撃の対象となるアプリケーションとは、例えば文書ファイルを用いた攻撃であれば、ビューアアプリケーション等である。そして、学習データライブラリファイル４００は、アドレス空間のランダム化  (Address  Space  Layout  Randomization)  が無効化されている（以降、Non-ASLRと表現する）ものである。一般に、こうしたライブラリファイルは、限定的であり、網羅が可能である。
【００５４】
［学習部の確率モデル生成処理］
次に、学習部１２３の処理を説明する。学習部１２３は、上述したようなラベル付き悪性文書ファイル１００及びラベル付き良性文書ファイル２００を用いて、それらの文書ファイルが持つバイト列の構造的特徴を学習した確率モデルをそれぞれ生成する。
【００５５】
まず、ラベル付き悪性文書ファイル１００に対するモデルパラメータの生成について説明する。図４は、図３の表Ｔａの左側部分の１行目から５行目のバイト及びラベルを模式的に対応付けた図である。上述したように、本実施の形態では、各バイトに各バイトの由来を表すラベルが対応付けられた学習データを用意している。すなわち、文書ファイルの各バイトに、文書ラベルと複数のＲＯＰラベルとの中からいずれか一つをラベル付けしたものである。このため、各バイトの背後には、いずれかのラベルが潜在していると言える。
【００５６】
そして、攻撃検知対象のＲＯＰでは、ＲＯＰチェーンにより、短いＲＯＰガジェット間を次々に遷移させることによって、コードを継ぎ接ぎし、任意の動作を実現できるコードを生成するものである。ＲＯＰチェーンの構成は、遷移していくＲＯＰアドレスを基本としていて、ＲＯＰアドレスによる関数呼び出しがあれば定数が続き、さらにスタックの調整が必要であればジャンクが連なる、というように、それぞれ前後で関連性がある。このため、各バイトの背後にそれぞれ潜在するラベルは、他のラベルへと遷移するものと言える。
【００５７】
したがって、図４に示すように、文書ファイルから観測可能な系列であるバイト列の背後には、確率的に遷移する潜在的な状態の系列であるラベル列が潜んでおり、それぞれの状態ごとに、確率的にバイト値を出力するというモデルが考えられる。すなわち、ＲＯＰチェーンを潜在変数モデルでモデル化することが考えられる。なお、観測可能な系列（観測系列）にはバイト列が対応し、潜在的な状態の系列（潜在系列）にはラベル列が対応する。したがって、学習部１２３は、潜在系列からの観測変数の出力確率を、確率モデルのモデルパラメータの一つとして生成する。
【００５８】
そして、潜在系列（ラベル列）の潜在変数となる各ラベルは、他のラベルへと遷移する特徴を有する。図５は、潜在系列（ラベル列）の潜在変数となるラベルの遷移の例を示した図である。例えば、ＲＯＰチェーン検出の問題に適用可能な、隠れマルコフモデルや条件付き確率場のようなグラフィカルモデルでは、潜在変数がどのように遷移するかが一つの重要な要素となる。
【００５９】
ここでは、潜在変数（ラベル）間の遷移の特徴として、図５の矢印Ｒ１，Ｒ２に示すように、アドレスラベル（ＲＯＰアドレス１〜４ラベル）や定数ラベル（ＲＯＰ定数１〜４）は、４バイト分のleft-to-rightの一方通行の形になっていることが挙げられる。これは、３２ｂｉｔ環境下では、アドレスや定数が４バイト単位であるためである。
【００６０】
そして、潜在変数の遷移の特徴として、文書ラベルからは、文書ラベルまたはアドレスラベルにのみ遷移すること（図５の矢印Ｙ１，Ｙ２参照）が挙げられる。これは、本実施の形態では、ＲＯＰチェーンの始端と終端を明確にするため、ＲＯＰチェーンを最初のＲＯＰアドレスから最後のＲＯＰアドレスまでと定義しているためである。
【００６１】
ＲＯＰチェーン検知の際には、このような特徴を基にＲＯＰチェーンの有無を検知するため、学習部１２３は、さらに、潜在変数の遷移状態を確率的に示すモデル、すなわち、潜在変数間の遷移確率を、確率モデルのモデルパラメータの一つとして生成する。
【００６２】
以上より、学習部１２３は、観測変数の出力確率、潜在変数間の遷移確率及び潜在系列の初期状態確率をモデルパラメータとして持つモデルを想定し、図６〜図８に例示するような確率モデルの生成を行う。図６は、各潜在変数（ラベル）について潜在系列の初期状態確率を対応付けた表を示す図である。図７は、潜在変数（ラベル）ごとに、観測変数（バイト）の出力確率を対応付けた表を示す図である。図８は、潜在変数（ラベル）間の遷移確率を、遷移する潜在変数の組み合わせごとに対応付けた表を示す図である。
【００６３】
まず、学習部１２３が、モデルパラメータのうち観測変数の出力確率を生成するまでの処理について説明する。上述したように、文書ファイルのバイト列が観測系列に対応し、ラベル列が潜在系列に対応する。学習部１２３は、まず、学習データとして、既知のラベル付き悪性文書ファイル１００を学習データとして受け取る（例えば、図３の表Ｔａ参照）。
【００６４】
続いて、学習部１２３は、潜在変数の初期状態確率を、入力された全てのラベル付き文書ファイルの先頭のラベルを基に計算する。潜在系列（ラベル列）のｔ番目の潜在変数をｓｔとしたとき、初期状態がラベルｅの確率は、Ｐ（ｓ1＝ｅ）を計算することにより得られる。これは、初期状態が「文書」である確率を例にすると、「先頭のラベルが文書ラベルであるラベル付き文書ファイル数」を「全ラベル付き文書ファイル数」で除することによって計算できる。学習部１２３は、この計算を全ての潜在変数についてそれぞれ計算する。なお、ＲＯＰチェーンから始まる文書ファイルは、ファイル形式上考えにくいため、一般に初期状態が文書ラベルである確率が１、それ以外のラベルである確率が０となる。学習部１２３は、初期状態確率として、潜在変数に対して、それぞれが初期状態、すなわち先頭のラベルである確率が対応付けられた表Ｔ１（図６参照）を、この潜在系列の初期状態確率を示すモデルパラメータとして生成し、確率モデルＤＢ３０に格納する。
【００６５】
そして、学習部１２３は、全ての潜在変数（ラベル）に対して、そのラベルが観測変数（バイト）を出力する確率を計算する。潜在系列（ラベル列）のｔ番目の潜在変数をｓｔ、観測系列（バイト列）のｔ番目の観測変数をｏｔとしたとき、ラベルｅがバイトｘを出力する確率は、Ｐ（ｏｔ＝ｘ｜ｓｔ＝ｅ）を計算することにより得られる。
【００６６】
ここで、それぞれの観測変数は、いずれも、「0x00」から「0xFF」までのバイト値を取り得る。このため、例えば、文書ラベルがバイト値「0x00」を出力する確率は、「文書ラベルの付いている0x00の値を持つバイト数」を「文書ラベルの付いている全バイト数」で除することによって計算することができる。学習部１２３は、この計算を、バイト値「0x00」からバイト値「0xFF」についてそれぞれ計算する。これによって、学習部１２３は、文書ラベルが、各バイト値「0x00」からバイト値「0xFF」をそれぞれ出力する確率を計算することができる。学習部１２３は、この計算を全てのラベルについて計算する。
【００６７】
学習部１２３は、これらの計算を行うことによって、潜在変数（ラベル）ごとに、それぞれの観測変数（バイト）の出力確率を対応付けた表Ｔ２（図７参照）を、観測変数の出力確率を示すモデルパラメータとして生成し、確率モデルＤＢ３０に格納する。
【００６８】
この観測変数の出力確率は、表Ｔ２に例示するように、例えば「文書」ラベルについては、「0x00」から「0xFF」までのバイト値を出力する確率「b文書,0x00」から「b文書,0xFF」が対応付けられ、「ＲＯＰ（アドレス１）」ラベルについては、「0x00」から「0xFF」までの全ての取り得るバイト値を出力する確率「bＲＯＰ（アドレス１）,0x00」から「bＲＯＰ（アドレス１）,0xFF」が対応付けられたものである。
【００６９】
次に、学習部１２３が、モデルパラメータのうち潜在変数間の遷移確率を生成するまでの処理について説明する。潜在系列（ラベル列）のｔ番目の潜在変数をｓｔとしたとき、ラベルｅｉからラベルｅｊへの潜在変数間の遷移確率は、Ｐ（ｓｔ＋１＝ｅｊ｜ｓｔ＝ｅｉ）を計算することにより得られる。
【００７０】
学習部１２３は、全てのあり得る潜在変数（ラベル）の組について、ラベル間の遷移確率を計算する。まず、学習部１２３は、図５を用いて説明した、アドレスラベルや定数ラベルが４バイト分のleft-to-rightの一方通行の形になるというラベルの遷移の特徴、文書ラベルからは、文書ラベル、アドレスラベル、または、ジャンクラベルにのみ遷移するというラベルの遷移の特徴、及び、図５に示すラベルの遷移状態関係に基づいて、全てのあり得るラベルの組を求める。
【００７１】
この全てのあり得る潜在変数（ラベル）の組について、潜在変数間の遷移確率を計算するには、潜在変数間の遷移回数を集計することで計算できる。例えば、ＲＯＰ（アドレス４）ラベルからＲＯＰ（ジャンク）ラベルへの遷移確率は、「ＲＯＰ（アドレス４）ラベルからＲＯＰ（ジャンク）ラベルへの遷移回数」を「ＲＯＰ（アドレス４）ラベルからの全ての遷移回数」で除することによって計算することができる。学習部１２３は、この計算を、全てのあり得る潜在変数の組について行う。
【００７２】
学習部１２３は、全てのあり得る潜在変数の組について潜在変数間の遷移確率を計算することによって、潜在変数の組み合わせ（遷移元のラベルと遷移先のラベルとの組み合わせ）ごとに、遷移する確率を対応付けた表Ｔ３（図８参照）を、潜在変数間の遷移確率を示すモデルパラメータとして生成し、確率モデルＤＢ３０に格納する。
【００７３】
この潜在変数間の遷移確率として、ｅｉ，ｅｊをそれぞれラベルとして、ｅｉからｅｊに遷移する確率をａｉ，ｊとした場合、表Ｔ３に例示するように、「文書」ラベルから「ＲＯＰ（アドレス１）」ラベルへの遷移確率には、「ａ文書，ＲＯＰ（アドレス１）」が対応付けられている。そして、表Ｔ３に例示するように、「文書」ラベルから、各「ＲＯＰ（アドレス２）」ラベルから「文書」ラベルについても、遷移確率「ａ文書，ＲＯＰ（アドレス２）」から「ａ文書，文書」がそれぞれ対応付けられている。さらに、他のラベルについても同様に、全てのあり得る遷移先のラベルへの遷移確率がそれぞれ対応付けられている。
【００７４】
さらに、学習部１２３は、ＲＯＰチェーンのアドレス部分の構成に用いられるＤＬＬ等のライブラリファイルが判明している場合は、そのファイル中のＲＯＰガジェット候補のアドレスを基に再学習する。なお、学習部１２３がアドレスを学習するために、前提として、このライブラリファイルがメモリ上にロードされる際のアドレスが固定である必要がある。この再学習によって、学習データのＲＯＰチェーンに含まれていないアドレスが検査対象で用いられていても、検知率を高く保つことが期待できる。
【００７５】
この再学習は、モデルパラメータのうち、ＲＯＰ（アドレス１）ラベルからＲＯＰ（アドレス４）ラベルの潜在変数における出力確率を更新することで実現できる。まず、学習部１２３は、ファイル中からＲＯＰガジェット候補のアドレス一覧を抽出する。この抽出は、既存のソフトウェアを用いて実現できることが知られている。
【００７６】
そして、学習部１２３は、抽出したＲＯＰガジェット候補のアドレスを１バイトごとに分割し、１バイト目をＲＯＰ（アドレス１）、２バイト目をＲＯＰ（アドレス２）、というように、バイトごとに各ラベルを対応付け、出力確率の計算を行う。例えば、ＲＯＰ（アドレス１）のラベルがバイト値「0x00」を出力する確率は、「１バイト目が0x00の値を持つアドレス数」を「全アドレス数」で除することによって計算することができる。学習部１２３は、この計算を「ＲＯＰ（アドレス１）」から「ＲＯＰ（アドレス４）」までのラベルについて、それぞれバイト値「0x00」からバイト値「0xFF」まで行うことによって、各出力確率を計算し、モデルパラメータを更新することで、再学習する。
【００７７】
続いて、学習部１２３は、このように生成された確率モデルの中で、遷移確率、出力確率の中に、値が「０」となるものがあれば、平滑化処理を行う。平滑化処理とは、パラメータのベクトルの中に確率「０」の次元が存在する場合に、この確率を「０」以外の値に修正する手法である。これは、ゼロ頻度問題と呼ばれる、学習データ中に現れずに出現確率が「０」となっていたものが認識対象中に現れた場合に、確率値が乗算されていく過程で０となってしまい、うまく認識できなくなるという問題への対策となる。なお、この平滑化処理の手法として、加算スムージングやKneser-neyスムージングなどの手法があるが、もちろん、これらの手法に限るものではない。
【００７８】
また、学習部１２３は、確率モデルを生成した後、ラベル付けはされていないが、ＲＯＰチェーンが含まれていることが分かっている悪性文書ファイルがあるとき、これを再学習することによって確率モデルを洗練できる場合がある。
【００７９】
例えば、学習部１２３は、採用している確率モデルが隠れマルコフモデルの場合は、Baum-Welchアルゴリズムなどを用いてモデルを再学習してもよい。なお、本実施の形態のような確率モデルを用いた学習手法としては、隠れマルコフモデル、条件付き確率場などがあるが、もちろん、これらの手法に限るものではない。
【００８０】
なお、学習部１２３による３２ｂｉｔ環境下での確率モデルの生成について説明したが、もちろん、学習部１２３は、６４ｂｉｔ環境下においても、確率モデルを生成することが可能である。図９は、６４ｂｉｔ環境に対応させたラベルの遷移の例を示す図である。６４ｂｉｔ環境では、レジスタ幅が８バイトとなるため、ＲＯＰアドレス及び定数も８バイトとなる。
【００８１】
したがって、確率モデルもそれに合わせて変更し、潜在変数（ラベル）が増えるとともに、４バイトごとに遷移していたＲＯＰアドレス部分と定数部分が、８バイトごとの遷移となっている。具体的には、図９に示すように、潜在変数のうち、ＲＯＰアドレスラベル及びＲＯＰ定数ラベルは８まで増える。なお、６４ｂｉｔ環境の場合も、アドレスラベル（ＲＯＰアドレス１〜８ラベル）や定数ラベル（ＲＯＰ定数１〜８ラベル）は、８バイト分のleft-to-rightの一方通行の形になり（例えば、矢印Ｒ３，Ｒ４参照）、文書ラベルからは、文書ラベルまたはアドレスラベルにのみ遷移する（図９の矢印Ｙ１’，Ｙ２’参照）。
【００８２】
もちろん、上述した３２ｂｉｔ、６４ｂｉｔ環境の例に限るものではなく、他の環境においても、該環境に応じて、ＲＯＰアドレス及び定数の潜在変数（ラベル）の数と遷移の連続数とを変化させることで、学習部１２３は、確率モデルの生成が可能である。
【００８３】
また、学習部１２３は、ラベル付き良性文書ファイル２００に対するモデルパラメータについても、悪性文書ファイルの場合と同様の手順で生成することが可能となる。結果として生成されるモデルの具体的な違いとしては、良性文書ファイルは文書ラベルのみしか持たないため、ラベル付き良性文書ファイル２００に対するモデルパラメータは、その他のラベルへの遷移のない、単純なモデルとなる。
【００８４】
以上に説明した処理を行うことによって、学習部１２３は、観測変数の出力確率、潜在変数間の遷移確率、潜在系列の初期状態確率をモデルパラメータとして持つ確率モデルを生成する。
【００８５】
［事前実行部の処理］
次に、事前実行部１１の処理を説明する。事前実行部１１は、ＲＯＰチェーンに用いられるライブラリファイルのコード領域をエミュレーション実行していき、ファイル中のＲＯＰガジェットの先頭アドレスと、そのＲＯＰガジェットが実行された際にスタックポインタがどれだけ動くかを示す移動値（オフセット値）と、を対応付けたオフセット辞書を生成する。
【００８６】
なお、ＲＯＰチェーンに用いられる学習データライブラリファイル４００は、前述したように、ＲＯＰによる攻撃の対象となるアプリケーションがメモリ上に読み込むライブラリであって、Non-ASLRであるものである。一般に、こうしたライブラリファイルは、限定的であり、網羅が可能である。そのため、攻撃コード検知装置１０は、これらの条件を満たした学習データライブラリファイル４００を、事前実行による解析の対象とし、事前実行部１１に入力する。
【００８７】
具体的には、まず、事前実行部１１は、学習データライブラリファイル４００を入力として受け取り、その学習データライブラリファイル４００のコード領域を特定する。そして、事前実行部１１は、コード領域の先頭を開始位置として、エミュレーション実行を実施する。事前実行部１１は、エミュレーション実行の際には、ライブラリのコード領域以外の値は、事前に決めた初期値をセットしておいてもよい。また、事前実行部１１は、初期値を決めずにシンボルとして扱い、エミュレーション実行（シンボリック実行と呼ばれる）を行ってもよい（例えば、V.  Chipounov,  V.  Kuznetsov  and  G.  Candea,  “S2E:  A  Platform  for  In-Vivo  Multi-Path  Analysis  of  Software  Systems”，In  Proceedings  of  the  sixteenth  International  Conference  on  Architectural  Support  for  Programming  Languages  and  Operating  Systems,  pages  265-278,  ACM,  2011.  参照）。
【００８８】
このシンボリック実行とは、プログラム実行時に変数をシンボルとして扱い、プログラムの実行結果を評価する手法である。実行時には、シンボルを含んだ分岐条件を評価せず、分岐の両方を辿るため、プログラムの実行パスが網羅的に実行される。
【００８９】
例えば、事前実行部１１は、シンボリック実行を利用し、ＲＯＰガジェット及びスタックポインタのオフセットを、ＲＯＰガジェット中に分岐を含むものも含めて網羅的に収集する。
【００９０】
シンボリック実行において、まず、事前実行部１１は、命令ポインタを除く各レジスタにシンボルを格納する。そして、シンボリック実行を実施する。そして、事前実行部１１は、コード領域の先頭を開始位置としたシンボリック実行が終了した際に、ｒｅｔ命令まで到達した場合には、スタックポインタの初期値からのオフセットを記憶する。分岐などにより、オフセットの候補が複数存在する場合には、事前実行部１１は、その全てのパスによって生じるオフセットを記憶する。このとき、事前実行部１１は、ｒｅｔ命令まで到達できなかった場合には、ＲＯＰアドレスとして適切でないと考えられるため、オフセット辞書には追加しない。
【００９１】
事前実行部１１は、以上のシンボリック実行を、開始位置をコード領域の先頭から１バイトずつ移動しながら実行していき、有効なＲＯＰガジェットのアドレスと、そのガジェットが実行された際のスタックポインタのオフセットとを組み合わせて記憶したオフセット辞書を生成する。そして、事前実行部１１は、生成したオフセット辞書を、オフセット辞書ＤＢ２０に記憶させる。
【００９２】
[ＲＯＰ  Chain  Integrityの導入]
ここで、攻撃コード検知装置１０では、事前実行部１１で生成したオフセット辞書の利用方法を示すために、ＲＯＰ  Chain  Integrity（ＲＣＩ）を導入する。
【００９３】
このＲＣＩは、ＲＯＰガジェットが正しく繋がることを保証するインテグリティであると定義する。また、ＲＯＰチェーンが正しく繋がらず、ＲＣＩが崩れている状態を、Chain  Violation（ＣＶ）を起こしていると定義する。ＲＣＩの前提として、ＲＯＰチェーンが攻撃者の意図した通りに実行されるためには、チェーンを構成しているＲＯＰガジェットが正しく繋がる必要がある。そのためには、ＲＯＰチェーン中のＲＯＰガジェットアドレスが指すガジェットが実行され、スタックポインタが進んだ先に、次に実行されるＲＯＰガジェットアドレスが存在する必要がある。
【００９４】
このため、ＲＣＩの検証は、スタックポインタの進みがあれば実施でき、学習部１２３は、前述したオフセット辞書を用いることで、静的に検証を実行できる。この検証は、静的かつ決定論的に実施されるため、高速である。したがって、攻撃コード検知装置１０は、事前実行部１１が、事前に学習データライブラリファイル４００を解析してオフセット辞書を作成しておくことにより、オフセット辞書の作成自体には時間を要するものの、検査時には少ないオーバーヘッドで高速に、ＲＣＩの検証を踏まえた検査をすることができる。
【００９５】
例えば、検知部１２４は、ＲＯＰガジェットアドレスを発見した際に、そのアドレスをオフセット辞書で検索し、対応したスタックポインタのオフセットを得る。そして、検知部１２４は、アドレスからスタックポインタをオフセット分進めた先に、ＲＯＰガジェットアドレスが存在するかを確認する。これを繰り返すことで、ＲＣＩを検証することができる。
【００９６】
そして、ＲＣＩを検証することの効果として、過検知の削減が挙げられる。過検知とは、本来良性なものを、悪性であると判断してしまうことである。従来の静的な検査では、ＲＯＰチェーンではないがＲＯＰチェーンらしさの高いバイト列が偶然に出現した場合に、それをＲＯＰチェーンとして検知してしまう場合がある。これは、過検知の要因となる。ただし、前述の偶然出現したＲＯＰチェーンらしさの高いバイト列は、ＲＯＰガジェット同士が正しく繋がるように設計されたものではないため、ＣＶを起こす。したがって、検知部１２４は、ＣＶを起こすものについては、ＲＣＩが崩れている状態であるため、偶然出現したＲＯＰチェーンらしさの高いバイト列に対しても、正しく、ＲＯＰチェーンではないことを検知する。この結果、攻撃コード検知装置１０では、ＲＣＩを検証することで、これらの過検知を削減することができる。
【００９７】
このように、実施の形態に係る攻撃コード検知装置１０は、検知部１２４において、ＲＣＩを踏まえた尤度計算を行うことにより、過検知を低減した、より高精度な検知を実現する。
【００９８】
［検知部の検知処理］
そこで、検知部１２４による検知処理について詳細に説明する。検知部１２４は、学習部１２３が生成した確率モデルと、事前実行部１１が生成したオフセット辞書と、を用いて、検査対象未知文書ファイル３００が、ＲＯＰチェーンを含んだ悪性文書ファイルらしさが高いか、或いは、良性文書ファイルらしさが高いか、を検知する。検知部１２４は、検知の結果、悪性文書ファイルらしさが高い場合に、検査対象未知文書ファイル３００が、ＲＯＰチェーンを含んだ悪性文書ファイルであるとして検知する。
【００９９】
まず、検知部１２４は、ファイル形式判定部１２１が判定したファイル形式に対応する確率モデルのモデルパラメータを確率モデルＤＢ３０から取得する。このとき、ＲＯＰチェーンを含んだ悪性文書ファイルの確率モデルのモデルパラメータをθＭａｌとし、良性文書ファイルの確率モデルのモデルパラメータをθＢｅｎとする。
【０１００】
また、検知部１２４は、検査するライブライファイルに対応したオフセット辞書をオフセット辞書ＤＢ２０から取得する。ここで、この検査するライブラリファイルとは、検査対象未知文書ファイル３００に、このライブラリファイルを用いたＲＯＰチェーンが含まれていないかを検査するものである。検知部１２４は、ＲＯＰチェーンに用いられたライブラリファイルが分かっている場合は、そのライブラリファイルについてのみ検査してもよい。また、検知部１２４は、ＲＯＰチェーンに用いられたライブラリファイルが不明な場合は、考えられるライブラリファイル全てを順に検査していってもよい。検査するライブラリファイルは、前述のように、アプリケーションがメモリ上にロードするNon-ASLRなライブラリファイルに限られるため、すべてを検査しても大きな計算時間はかからない。
【０１０１】
そして、検知部１２４は、取得した確率モデルとオフセット辞書とを用いて、検査対象未知文書ファイル３００におけるＲＯＰチェーンの有無を検査する検知処理を行う。まず、検知部１２４は、検査対象未知文書ファイル３００のバイト列を、観測系列Ｏとして抽出する。そして、検知部１２４は、このＯのモデルθＢｅｎ及びθＭａｌに対する尤度、ＬＢｅｎ及びＬＭａｌをそれぞれ算出する。このうち、良性文書の尤度は、以下の（１）式のように示すことができる。
【０１０２】
【数１】
0006527295.tif 000002
【０１０３】
具体的には、ＯのモデルθＢｅｎに対する尤度ＬＢｅｎは、以下の（２）式を用いて算出される。
【数２】
0006527295.tif 000003
【０１０４】
ここで、ｉは、ＲＯＰアドレスと解釈できるバイト列のＲＯＰ（アドレス１）にあたるバイト値である。また、ｊは、ｉを含むバイト列をＲＯＰアドレスであると仮定したとき、次にリンクする先でのＲＯＰ（アドレス１）にあたるバイト値である。ｊは、ｉを含むバイト列をＲＯＰアドレスであるとみてオフセット辞書で検索し、対応したオフセット値分の先のバイト値を確認することで得られる。また、Ｊｘは、観測系列Ｏ中に含まれるすべてのｉ，ｊの組み合わせの集合である。ｓｉ，ｓｊはそれぞれ、ｉ，ｊに対応するラベルであり、Ａ１はＲＯＰ（アドレス１）のラベルである。
【０１０５】
この演算は、ＯをθＢｅｎが出力したと考えた場合の尤もらしさを示すもので、フォワードアルゴリズムによって高速に計算できる。また、悪性文書の尤度は、以下の（３）式のように示すことができる。
【０１０６】
【数３】
0006527295.tif 000004
【０１０７】
具体的には、ＯのモデルθＭａｌに対する尤度ＬＭａｌは、以下の（４）式を用いて算出される。
【数４】
0006527295.tif 000005
【０１０８】
ここで、Ｆｉ，ｊは、ｉとｊがＣＶを起こさないという事象に対応する確率変数である。（４）式は、ＲＣＩを考慮した尤度の計算であり、ＯをθＭａｌが出力した確率に、ＯがＣＶを全く起こさない確率を乗じたものである。なお、Ｐ（Ｏ｜θＭａｌ）は、フォワードアルゴリズムで高速に計算できる。また、Ｐ（ｓｉ＝Ａ１｜Ｏ，θＭａｌ）及びＰ（ｓｊ≠Ａ１｜Ｏ，θＭａｌ）は、フォワードバックワードアルゴリズムで高速に計算できる。したがって、ＬＭａｌ全体が計算可能である。
【０１０９】
なお、この計算式は、以下のように導かれている。まず、前述の、ＯがθＭａｌを出力し、ＣＶを全く起こさない確率は、以下の（５）式を用いて算出できる。
【０１１０】
【数５】
0006527295.tif 000006
【０１１１】
ただし、これを直接計算するのは難しいため、「あるｉ，ｊの組がＣＶを起こさない確率と、他のｉ，ｊの組がＣＶを起こさない確率と、は、独立である」と仮定する。それにより、（５）式は以下の（６）式のように近似できる。
【０１１２】
【数６】
0006527295.tif 000007
【０１１３】
したがって、尤度比Ｚは、以下の（７）式で計算することができる。
【０１１４】
【数７】
0006527295.tif 000008
【０１１５】
検知部１２４は、以下の（８）式に示すように、悪性か良性かを判定する。すなわち、検知部１２４は、ｔを閾値として、Ｚがｔよりも小さい場合には、検査対象未知文書ファイル３００がＲＯＰチェーンを含まない、すなわち、良性（Ｂｅｎｉｇｎ）であると判断する。これに対し、検知部１２４は、Ｚがｔ以上である場合には、検査対象未知文書ファイル３００がＲＯＰチェーンを含む、すなわち、悪性（Ｍａｌｉｃｉｏｕｓ）であると判断する。
【０１１６】
【数８】
0006527295.tif 000009
【０１１７】
なお、ｔは、事前に学習データに基づいて決定される。この閾値ｔの決定方法として、例えば、ｔを変動させながら学習データに対して検知を実施し、その検知精度を基に決定する方法がある。具体的に、ｔの決定方法として、学習データに対してｔを変化させながら検査を実施し、その見逃し率と過検知率とのＲＯＣ曲線を引いて、Ｆ値を用いるなどし、最も見逃し率と過検知率とのバランスが良いｔを選択する方法が考えられる。もちろん、ｔの決定方法は、これに限るものではない。
【０１１８】
そして、検知部１２４は、良性であると判断した場合、すなわち、検査対象未知文書ファイル３００が、ＲＯＰチェーンによる攻撃を行わないと判定した場合には、制御部１２は、この検査対象未知文書ファイル３００について、ビューアアプリケーション等のアプリケーションを実行可能とする。一方、検知部１２４は、悪性であると判断した場合、すなわち、検査対象未知文書ファイル３００が、ＲＯＰチェーンによる攻撃を行うと判定した場合には、制御部１２は、この検査対象未知文書ファイル３００について、ビューアアプリケーション等のアプリケーションを実行不可とする。
【０１１９】
［確率モデルを生成するまでの処理手順］
次に、攻撃コード検知装置１０が確率モデルを生成するまでの処理手順について説明する。図１０は、図１に示す攻撃コード検知装置１０が確率モデルを生成するまでの処理手順を示すフローチャートである。
【０１２０】
図１０に示すように、制御部１２は、まず、確率モデルＤＢ３０を確認し、各ファイル形式に対応する確率モデルのモデルパラメータが格納されているか否かを判断する（ステップＳ１１）。制御部１２は、各ファイル形式に対応する確率モデルのモデルパラメータが格納されていると判断した場合には（ステップＳ１１：Ｙｅｓ）、確率モデルのモデルパラメータの生成を終了する。
【０１２１】
これに対し、制御部１２は、各ファイル形式に対応する確率モデルのモデルパラメータが格納されていないと判断した場合には（ステップＳ１１：Ｎｏ）、ラベル付き悪性文書ファイル１００、ラベル付き良性文書ファイル２００を入力データとして（ステップＳ１２）、学習を開始する。ここで、ラベル付き文書ファイルを、ラベル付き悪性文書ファイル１００とラベル付き良性文書ファイル２００の総称とする。
【０１２２】
この入力されたラベル付き文書ファイルに対し、まず、ファイル形式判定部１２１が、ヘッダやファイル構造の特徴から、ファイルの形式を判定する（ステップＳ１３）。ここで、ファイルの形式としては、例えば、ＤＯＣ、ＸＬＳ、ＰＰＴ、ＰＤＦ等を想定している。
【０１２３】
続いて、デコード部１２２は、入力されたラベル付き文書ファイルに、エンコードされた領域が存在するか否かを判断する（ステップＳ１４）。デコード部１２２は、入力されたラベル付き文書ファイルにエンコードされた領域が存在すると判断した場合には（ステップＳ１４：Ｙｅｓ）、エンコード方法を検出して、対応するデコードを実施する（ステップＳ１５）。このエンコード方法の検出としては、既知のエンコード方法のパターンマッチングを用いる。
【０１２４】
そして、入力されたラベル付き文書ファイルにエンコードされた領域が存在しないとデコード部１２２が判断した場合（ステップＳ１４：Ｎｏ）、または、ステップＳ１５終了後、学習部１２３は、この既知のラベル付き文書ファイルとそのファイル形式とから、ファイル形式に対応する悪性及び良性の文書ファイルの確率モデルを生成する確率モデル生成処理を実行する（ステップＳ１６）。
【０１２５】
学習部１２３は、生成した確率モデルを、モデルパラメータの形で、確率モデルＤＢ３０に格納し（ステップＳ１７）、処理を終了する。なお、本実施の形態では、文書ファイルを対象としたＲＯＰチェーンの検知、悪性判定について記載しているが、これに限らず、任意のデータ系列に対しても、同様の手法を適用することができる。
【０１２６】
［確率モデル生成処理の処理手順］
次に、図１０に示す確率モデル生成処理の処理手順について説明する。図１１は、図１０に示す確率モデル生成処理（ステップＳ１６）の処理手順を示すフローチャートである。
【０１２７】
図１１に示すように、学習部１２３は、ラベル付き文書ファイルが入力されると（ステップＳ２１）、このラベル付き文書ファイルから、バイト列及びラベル列を抽出し、それを用いて学習を行う。
【０１２８】
まず、学習部１２３は、演算対象であるｅを、最初に演算するものとして設定されている初期ラベルとする（ステップＳ２２）。次に、学習部１２３は、ｅの初期状態確率Ｐ（ｓ１＝ｅ）を計算する（ステップＳ２３）。学習部１２３は、全てのラベルについて初期状態確率Ｐ（ｓ１＝ｅ）を計算したか否かを判断する（ステップＳ２４）。学習部１２３は、全てのラベルについて初期状態確率Ｐ（ｓ１＝ｅ）を計算していないと判断した場合には（ステップＳ２４：Ｎｏ）、計算対象のｅを次のラベルとし（ステップＳ２５）、ステップＳ２３に戻り、このラベルについて初期状態確率Ｐ（ｓ１＝ｅ）を計算する。
【０１２９】
一方、学習部１２３は、全てのラベルについて初期状態確率Ｐ（ｓ１＝ｅ）を計算したと判断した場合には（ステップＳ２４：Ｙｅｓ）、この計算による初期状態確率の表Ｔ１（図６参照）を、この潜在系列の初期状態確率を示すモデルパラメータとして生成する。
【０１３０】
次に、学習部１２３は、全ての潜在変数（ラベル）に対して、そのラベルが観測変数（バイト）を出力する確率を計算するために、まず、演算対象であるｅを、最初に演算するものとして設定されている初期ラベルとする（ステップＳ２６）。続いて、このラベルｅにおける観測変数（バイト）の出力確率Ｐ（ｏｔ＝0x00｜ｓｔ＝ｅ）〜Ｐ（ｏｔ＝0xFF｜ｓｔ＝ｅ）を計算する（ステップＳ２７）。上述したように、学習部１２３は、出力確率Ｐが、例えば、ラベルｅがバイト値「0x00」を出力する確率である場合には、「ラベルｅの付いている0x00の値を持つバイト数」を「ラベルの付いている全バイト数」で除することによって計算する。学習部１２３は、この計算を、ラベルｅについて、バイト値「0x00」からバイト値「0xFF」ごとに、それぞれ計算して、ラベルｅが、各バイト値「0x00」からバイト値「0xFF」をそれぞれ出力する確率を求める。
【０１３１】
学習部１２３は、全てのラベルについて観測変数（バイト）の出力確率Ｐ（ｏｔ＝0x00｜ｓｔ＝ｅ）〜Ｐ（ｏｔ＝0xFF｜ｓｔ＝ｅ）を計算したか否かを判断する（ステップＳ２８）。学習部１２３は、全てのラベルについて観測変数（バイト）の出力確率Ｐ（ｏｔ＝0x00｜ｓｔ＝ｅ）〜Ｐ（ｏｔ＝0xFF｜ｓｔ＝ｅ）を計算していないと判断した場合には（ステップＳ２８：Ｎｏ）、計算対象のｅを次のラベルとし（ステップＳ２９）、ステップＳ２７に戻り、このラベルについて観測変数（バイト）の出力確率Ｐ（ｏｔ＝0x00｜ｓｔ＝ｅ）〜Ｐ（ｏｔ＝0xFF｜ｓｔ＝ｅ）を計算する。
【０１３２】
一方、学習部１２３は、全てのラベルについて観測変数（バイト）の出力確率Ｐ（ｏｔ＝0x00｜ｓｔ＝ｅ）〜Ｐ（ｏｔ＝0xFF｜ｓｔ＝ｅ）を計算したと判断した場合には（ステップＳ２８：Ｙｅｓ）、この計算によって、潜在変数（ラベル）ごとに、観測系列（バイト列）のそれぞれの観測変数（バイト）の出力確率を対応付けた表Ｔ２（図７参照）を、観測変数の出力確率を示すモデルパラメータとして生成することができる。
【０１３３】
続いて、学習部１２３は、全てのあり得る潜在変数（ラベル）の組（ｅｉ，ｅｊ）について、潜在変数間（ｅｉ→ｅｊ）の遷移確率Ｐ（ｓｔ＋１＝ｅｊ｜ｓｔ＝ｅｉ）を計算する（ステップＳ３０）。なお、ｅｉは、遷移元のラベルを示し、ｅｊは、遷移先のラベルを示す。
【０１３４】
学習部１２３は、このステップＳ３０における計算を、上述したように、潜在変数間の遷移回数を集計することによって実行する。例えば、学習部１２３は、ＲＯＰ（アドレス４）ラベルからＲＯＰ（ジャンク）ラベルへの遷移確率は、「ＲＯＰ（アドレス４）ラベルからＲＯＰ（ジャンク）ラベルへの遷移回数」を「ＲＯＰ（アドレス４）ラベルからの全ての遷移回数」で除することによって計算する。この計算を、全てのあり得る潜在変数の組について計算する。学習部１２３は、この計算によって、潜在変数の組み合わせ（遷移元のラベルと遷移先のラベルとの組み合わせ）ごとに、遷移する確率を対応付けた表Ｔ３（図８参照）を、潜在変数間の遷移確率を示すモデルパラメータとして生成することができる。
【０１３５】
そして、学習部１２３は、ＲＯＰガジェットのアドレス部分の構成に用いられるＤＬＬ等のファイルが判明しているか否かを判断する（ステップＳ３１）。学習部１２３は、ＲＯＰガジェットのアドレス部分の構成に用いられるファイルが判明している場合には（ステップＳ３１：Ｙｅｓ）、そのファイル中のＲＯＰガジェット候補のアドレスを基に再学習する(ステップＳ３２)。
【０１３６】
続いて、学習部１２３は、ＲＯＰガジェットのアドレス部分の構成に用いられるファイルが判明していない場合（ステップＳ３１：Ｎｏ）、または、ステップＳ３２処理後、遷移確率、出力確率の中に、値が「０」となるものが現れたゼロ頻度問題が発生しているか否かを判断する（ステップＳ３３）。学習部１２３は、ゼロ頻度問題が発生していると判断した場合には（ステップＳ３３：Ｙｅｓ）、平滑化処理を行う（ステップＳ３４）。
【０１３７】
そして、学習部１２３は、ゼロ頻度問題が発生していないと判断した場合（ステップＳ３３：Ｎｏ）、または、ステップＳ３４の平滑化処理終了後、生成した確率モデルのモデルパラメータを確率モデルＤＢ３０に格納して（ステップＳ３５）、確率モデル生成処理を終了する。
【０１３８】
以上に説明した処理を行うことによって、学習部１２３は、潜在変数であるラベルごとに、観測変数である各バイトの出力確率を対応付けた観測変数（バイト）の出力確率と、潜在変数ごとに、遷移可能である潜在変数への遷移確率が対応付けられた潜在変数間の遷移確率と、潜在系列の初期状態確率と、をモデルパラメータとして有する確率モデルを生成する。後述する検知部１２４は、この確率モデルを用いて、検査対象未知文書ファイル３００のバイト列に対し、尤度を算出し、検査対象未知文書ファイル３００におけるＲＯＰチェーンの有無を検知している。
【０１３９】
［オフセット辞書を生成するまでの処理手順］
次に、図１２を用いて、事前実行部１１がオフセット辞書を生成する処理の流れについて説明する。図１２は、図１に示す攻撃コード検知装置１０がオフセット辞書を生成するまでの処理手順を示すフローチャートである。
【０１４０】
図１２に示すように、事前実行部１１は、まず、オフセット辞書ＤＢ２０を確認し、ライブラリファイルに対応するオフセット辞書が格納されているか否かを判断する（ステップＳ４１）。事前実行部１１は、各ライブラリファイルに対応するオフセット辞書が格納されていると判断した場合には（ステップＳ４１：Ｙｅｓ）、オフセット辞書の生成を終了する。
【０１４１】
これに対し、事前実行部１１は、各ライブラリファイルに対応するオフセット辞書が格納されていないと判断した場合には（ステップＳ４１：Ｎｏ）、ライブラリファイルを入力データとして受付ける（ステップＳ４２）。そして、事前実行部１１は、ライブラリファイルに対応するオフセット辞書を生成するオフセット辞書生成処理を実行する（ステップＳ４３）。
【０１４２】
事前実行部１１は、生成したオフセット辞書を、オフセット辞書ＤＢ２０に格納して（ステップＳ４４）、処理を終了する。なお、ライブラリファイルとしては、ＤＬＬやＯＣＸなどのファイル形式を想定しているが、これに限らず、任意のライブラリファイルに対して同様の手法を適用することができる。
【０１４３】
［オフセット辞書生成処理の処理手順］
次に、図１２に示すオフセット辞書生成処理の流れについて説明する。図１３は、図１２に示すオフセット辞書生成処理（ステップＳ４３）の処理手順を示すフローチャートである。
【０１４４】
図１３に示すように、事前実行部１１は、まず、入力されたライブラリファイルのコード領域を特定する（ステップＳ５１）。そして、事前実行部１１は、変数ｉを０で初期化する、すなわち、ｉ＝０とする（ステップＳ５２）。次に、事前実行部１１は、シンボリック実行のための準備として、命令ポインタ以外のレジスタ、スタックにシンボルを格納する（ステップＳ５３）。そして、事前実行部１１は、コード領域の先頭からｉバイト目の位置のアドレスから、シンボリック実行を実施する（ステップＳ５４）。
【０１４５】
ここで、事前実行部１１は、実行結果としてｒｅｔ命令まで到達できたか否かを判断する（ステップＳ５５）。事前実行部１１は、実行結果としてｒｅｔ命令まで到達できなかったと判断した場合（ステップＳ５５：Ｎｏ）、ｉに１を加算して（ステップＳ５６）、シンボリック実行の準備に戻って処理を繰り返す。
【０１４６】
一方、事前実行部１１は、ｒｅｔ命令まで到達できたと判断した場合（ステップＳ５５：Ｙｅｓ）、実行開始アドレスと、スタックポインタのオフセットと、をオフセット辞書に追加する（ステップＳ５７）。ここで、実行開始アドレスとは、コード領域の先頭からｉバイト目の位置のアドレスのことであり、ＲＯＰアドレスとみなせる。
【０１４７】
そして、事前実行部１１は、ｉがコード領域の終端まで到達したか否かを判断する（ステップＳ５８）。事前実行部１１は、ｉがコード領域の終端まで到達していないと判断した場合（ステップＳ５８：Ｎｏ）、ｉに１を加算して（ステップＳ５６）、シンボリック実行の準備に戻って処理を繰り返す。一方、事前実行部１１は、ｉがコード領域の終端まで到達していたと判断した場合（ステップＳ５８：Ｙｅｓ）、オフセット辞書を出力して（ステップＳ５９）、オフセット辞書生成処理を終了する。
【０１４８】
［検査対象未知文書ファイルの判定までの処理手順］
次に、攻撃コード検知装置１０による検査対象未知文書ファイル３００に対する判定の流れを説明する。図１４は、図１に示す攻撃コード検知装置１０が検査対象未知文書ファイル３００を、ＲＯＰチェーンを持つ悪性文書ファイルか否かを判定するまでの処理手順を示すフローチャートである。
【０１４９】
図１４に示すように、攻撃コード検知装置１０は、検査対象未知文書ファイル３００を入力データとして取得する（ステップＳ６１）。そして、攻撃コード検知装置１０では、この入力された検査対象未知文書ファイル３００に対し、図１０に示す処理手順と同様に、ファイル形式判定部１２１がファイルの形式を判定し（ステップＳ６２）、デコード部１２２が、検査対象未知文書ファイル３００に、エンコードされた領域が存在するか否かを判断する（ステップＳ６３）。
【０１５０】
そして、デコード部１２２は、入力された検査対象未知文書ファイル３００にエンコードされた領域が存在すると判断した場合には（ステップＳ６３：Ｙｅｓ）、エンコード方法を検出して、対応するデコードを実施する（ステップＳ６４）。
【０１５１】
そして、入力された検査対象未知文書ファイル３００にエンコードされた領域が存在しないとデコード部１２２が判断した場合（ステップＳ６３：Ｎｏ）、または、ステップＳ６４終了後、検知部１２４は、確率モデルＤＢ３０から、検査対象未知文書ファイル３００のファイル形式に対応した良性文書ファイル及び悪性文書ファイルの確率モデルのモデルパラメータを取り出す（ステップＳ６５）。また、検知部１２４は、オフセット辞書ＤＢ２０から、検査するライブラリファイルに対応したオフセット辞書を取り出す（ステップＳ６６）。
【０１５２】
ここで、この検査するライブラリファイルとは、検査対象未知文書ファイル３００に、このライブラリファイルを用いたＲＯＰチェーンが含まれていないかを検査するものである。ＲＯＰチェーンに用いられたライブラリファイルが分かっている場合は、検知部１２４は、そのライブラリファイルについてのみ検査してもよい。また、ＲＯＰチェーンに用いられたライブラリファイルが不明な場合は、検知部１２４は、考えられるライブラリファイルすべてを順に検査していってもよい。検査するライブラリファイルは、前記の通り、アプリケーションがメモリ上にロードするNon-ASLRなライブラリファイルに限られるため、すべてを検査しても大きな計算時間はかからない。
【０１５３】
そして、検知部１２４は、この確率モデルとオフセット辞書を用いて、検査対象未知文書ファイル３００におけるＲＯＰチェーンの有無を検査する検知処理を行う（ステップＳ６７）。この検知部１２４におけるＲＯＰチェーンの検査の結果、検査対象未知文書ファイル３００が、ＲＯＰチェーンによる攻撃を行わないと判定した場合には、制御部１２は、この検査対象未知文書ファイル３００について、ビューアアプリケーション等のアプリケーションを実行可能とする。
【０１５４】
［検知処理の処理手順］
次に、図１４に示す検知処理の流れについて説明する。図１５は、図１４に示す検知処理（ステップＳ６７）の処理手順を示すフローチャートである。
【０１５５】
図１５に示すように、検知部１２４は、まず、入力された検査対象未知文書ファイル３００のバイト列を、観測系列Ｏとして抽出する（ステップＳ７１）。そして、検知部１２４は、良性文書ファイルの確率モデルをθＢｅｎとして、（２）式を用いて、確率Ｐ（Ｏ｜θＢｅｎ）、すなわち、ＬＢｅｎを算出する（ステップＳ７２）。また、検知部１２４は、ＲＯＰチェーンを含んだ悪性文書ファイルの確率モデルのモデルパラメータをθＭａｌとし、確率Ｐ（Ｏ｜θＭａｌ）を算出する（ステップＳ７３）。これらの確率は、前述の通り、フォワードアルゴリズムによって計算できる。
【０１５６】
続いて、検知部１２４は、ＯからＲＯＰアドレスと解釈できる全てのバイト列を抽出する（ステップＳ７４）。そして、検知部１２４は、抽出したバイト列をそれぞれオフセット辞書で検索し、それぞれのバイト列がＲＯＰアドレスであると仮定したとき、オフセット辞書を用いて抽出したＲＯＰアドレスのリンク先となるＲＯＰアドレスを計算する（ステップＳ７５）。検知部１２４は、リンク元のＲＯＰ（アドレス１）の位置と、リンク先のＲＯＰ（アドレス１）の位置をそれぞれｉ，ｊとし、その組み合わせの集合をＪｘ∋（ｉ，ｊ）とする（ステップＳ７６）。
【０１５７】
続いて、検知部１２４は、先ほど算出したＰ（Ｏ｜θＭａｌ），θＭａｌ，Ｊｘ∋（ｉ，ｊ），Ｏから、（４）〜（６）式を用いて、尤度ＬＭａｌを算出する（ステップＳ７７）。そして、検知部１２４は、算出したＬＢｅｎ及びＬＭａｌから、（７）式を用いて、尤度比Ｚを算出する（ステップＳ７８）。続いて、検知部１２４は、Ｚが、予め決められた閾値ｔより大きいか否かを判断する（ステップＳ７９）。
【０１５８】
検知部１２４は、Ｚが、予め決められた閾値ｔより大きいと判断した場合（ステップＳ７９：Ｙｅｓ）、検査対象未知文書ファイル３００はＲＯＰチェーンを含む悪性文書ファイルであると検知する（ステップＳ８０）。
【０１５９】
これに対し、検知部１２４は、Ｚが、予め決められた閾値ｔ以下であると判断した場合（ステップＳ７９：Ｎｏ）、検査対象未知文書ファイル３００はＲＯＰチェーンを含まないと検知する（ステップＳ８１）。そして、検知部１２４は、この検査対象未知文書ファイル３００に対する検知結果を出力して（ステップＳ８２）、検知処理を終了する。
【０１６０】
［実施の形態の効果］
以上のように、本実施の形態に係る攻撃コード検知装置１０は、事前に、ＲＯＰチェーンを含む悪性文書ファイルの特徴を学習した確率モデルと、良性文書ファイルの特徴を学習した確率モデルと、をそれぞれ生成する。また、攻撃コード検知装置１０は、ＲＯＰガジェットに用いられるライブラリファイルを事前に解析することにより、ＲＯＰアドレスとスタックポインタのオフセットとを対応付けて記憶させたオフセット辞書を生成する。そして、攻撃コード検知装置１０は、生成した確率モデルとオフセット辞書とに基づき、検査対象未知文書ファイル３００に対し、悪性文書ファイルらしさを示す尤度と良性文書ファイルらしさを示す尤度とを算出する。この尤度計算の際には、攻撃コード検知装置１０は、ＲＯＰチェーンが実行された際にＲＯＰガジェット同士が正しく繋がるか否かを考慮する。そして、攻撃コード検知装置１０は、尤度比検定により、ＲＯＰチェーンを含んだ悪性文書ファイルを検知する。
【０１６１】
これによって、実施の形態に係る攻撃コード検知装置１０は、この未知の文書をビューアアプリケーションで開くことなく、静的に検査できるため、文書ファイルの悪性判定を高速に実現することができる。
【０１６２】
また、攻撃コード検知装置１０では、実際の環境下に合わせて、アドレスや定数を分割し、分割したバイト単位で、バイト列（観測系列）の出力確率をモデルパラメータとして求めるとともに、実際の環境下に合わせて、潜在変数（ラベル）の数や潜在変数の遷移状態を考慮して、遷移系列の遷移確率、及び、潜在系列の初期状態確率をモデルパラメータとして生成している。このため、本実施の形態によれば、実際の環境下に対応させながら、ＲＯＰチェーンの遷移状態を含めたモデルパラメータを用いて検知を行うことができるため、高精度なＲＯＰチェーンの検知を実現できる。
【０１６３】
さらに、本実施の形態では、オフセット辞書に基づいてＲＯＰガジェットが正しく繋がる、正当なＲＯＰチェーンか否かの観点を確率計算に取り入れている。そのため、攻撃コード検知装置１０は、良性文書ファイル中に偶発的に発生したＲＯＰチェーンらしさの高いバイト列に対しても、過検知を起こさずに検査することができるため、過検知を低減した高精度なＲＯＰチェーンの検知を実現できる。
【０１６４】
このように、本実施の形態に係る攻撃コード検知装置１０によれば、アプリケーションプログラムの実行を伴わない静的な手法によってＲＯＰチェーンを含んだ悪性文書ファイルの特徴を捉えることができるため、高速で高精度な検知を実現できる。さらに、攻撃コード検知装置１０は、事前のライブラリファイルの解析に基づいてＲＯＰチェーンの正当性を検証することによって、高速性を損なうことなく、少ないオーバーヘッドで過検知を低減し、高精度なＲＯＰチェーン検知を実現できる。
【０１６５】
上述したように、本実施の形態は、ＲＯＰチェーンを含んだ悪性文書ファイルの検知に有用であり、多数の文書ファイルに対して、高速性を損なうことなく検査を実施することに適している。このため、本実施の形態に係る攻撃コード検知装置１０、攻撃コード検知方法及び攻撃コード検知プログラムを、ネットワーク監視装置とともにネットワークに導入することによって、ネットワークを通過する多数の文書ファイルがＲＯＰチェーンを含む悪性なものであるかどうかの検査を行うことが可能である。
【０１６６】
なお、本実施の形態では、検知部１２４は、ＲＣＩの検証を踏まえ、確率モデルを用いて、検査対象未知文書ファイル３００が悪性文書ファイルか否かを検知した例を説明したが、これに限らない。例えば、検知部１２４は、非特許文献２に記載の決定論的手法を用いる場合にも、ＲＣＩの検証を適用して検知を行うこともできる。具体的には、検知部１２４は、攻撃者が用いる既知のアドレスを特徴文字列として蓄積しておく。そして、検知部１２４は、検査対象未知文書ファイル３００の規定の長さのデータ系列の中に、蓄積された特徴文字列が複数含まれ、さらに、これらの特徴文字列についてＲＣＩが崩れていない場合には、検査対象未知文書ファイル３００が悪性文書ファイルであることを検知する。
【０１６７】
また、本実施の形態では、文書ファイルに埋め込まれたＲＯＰチェーンを前提としているが、文書ファイルでないデータであっても、そのバイト列の分布に何らかの傾向があるものであれば、同様に検知可能である。したがって、本実施の形態では、例えば、ＲＯＰチェーンを含んだ通信データの検知にも利用できる。具体的には、本実施の形態は、画像ファイル、動画ファイル、実行ファイル等、いずれのファイルにも適用可能である。
【０１６８】
［他の実施の形態］
[学習の方法]
本実施形態では系列の学習に確率モデルを用いたが、必ずしも確率モデルであることを要しない。前提として、ＲＯＰチェーンの静的検知の問題は、系列データを学習する構造学習という問題であると捉えられ、さらに、本実施の形態では、ＲＯＰチェーンの静的検知にＲＣＩによる制約を付加しているため、制約付き構造学習という問題として捉えることができる。こうした制約付き構造学習は、本実施の形態に記載の確率モデルを用いた高速な近似計算手法のほか、構造化パーセプトロン（詳細は、Ming-Wei  Chang,  Lev  Ratinov  and  Dan  Roth，  “Structured  learning  with  constrained  conditional  models”，Machine  learning  88.3  (2012):  399-431.参照）のような確率モデル以外の学習モデルでも解けることが知られている。そのため、必ずしも確率モデルであることを要しない。
【０１６９】
［システム構成等］
図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部又は一部を、各種の負荷や使用状況等に応じて、任意の単位で機能的又は物理的に分散・統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部又は任意の一部が、ＣＰＵ及び当該ＣＰＵにて解析実行されるプログラムにて実現され、或いは、ワイヤードロジックによるハードウェアとして実現され得る。
【０１７０】
また、本実施形態において説明した各処理のうち、自動的に行われるものとして説明した処理の全部又は一部を手動的におこなうこともでき、或いは、手動的におこなわれるものとして説明した処理の全部又は一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【０１７１】
［プログラム］
図１６は、プログラムが実行されることにより、攻撃コード検知装置１０が実現されるコンピュータの一例を示す図である。コンピュータ１０００は、例えば、メモリ１０１０、ＣＰＵ１０２０を有する。また、コンピュータ１０００は、ハードディスクドライブインタフェース１０３０、ディスクドライブインタフェース１０４０、シリアルポートインタフェース１０５０、ビデオアダプタ１０６０、ネットワークインタフェース１０７０を有する。これらの各部は、バス１０８０によって接続される。
【０１７２】
メモリ１０１０は、ＲＯＭ（Read  Only  Memory）１０１１及びＲＡＭ１０１２を含む。ＲＯＭ１０１１は、例えば、ＢＩＯＳ（Basic  Input  Output  System）等のブートプログラムを記憶する。ハードディスクドライブインタフェース１０３０は、ハードディスクドライブ１０９０に接続される。ディスクドライブインタフェース１０４０は、ディスクドライブ１１００に接続される。例えば磁気ディスクや光ディスク等の着脱可能な記憶媒体が、ディスクドライブ１１００に挿入される。シリアルポートインタフェース１０５０は、例えばマウス１１１０、キーボード１１２０に接続される。ビデオアダプタ１０６０は、例えばディスプレイ１１３０に接続される。
【０１７３】
ハードディスクドライブ１０９０は、例えば、ＯＳ１０９１、アプリケーションプログラム１０９２、プログラムモジュール１０９３、プログラムデータ１０９４を記憶する。すなわち、攻撃コード検知装置１０の各処理を規定するプログラムは、コンピュータ１０００により実行可能なコードが記述されたプログラムモジュール１０９３として実装される。プログラムモジュール１０９３は、例えばハードディスクドライブ１０９０に記憶される。例えば、攻撃コード検知装置１０における機能構成と同様の処理を実行するためのプログラムモジュール１０９３が、ハードディスクドライブ１０９０に記憶される。なお、ハードディスクドライブ１０９０は、ＳＳＤ（Solid  State  Drive）により代替されてもよい。
【０１７４】
また、上述した実施形態の処理で用いられる設定データは、プログラムデータ１０９４として、例えばメモリ１０１０やハードディスクドライブ１０９０に記憶される。そして、ＣＰＵ１０２０が、メモリ１０１０やハードディスクドライブ１０９０に記憶されたプログラムモジュール１０９３やプログラムデータ１０９４を必要に応じてＲＡＭ１０１２に読み出して実行する。
【０１７５】
なお、プログラムモジュール１０９３やプログラムデータ１０９４は、ハードディスクドライブ１０９０に記憶される場合に限らず、例えば着脱可能な記憶媒体に記憶され、ディスクドライブ１１００等を介してＣＰＵ１０２０によって読み出されてもよい。或いは、プログラムモジュール１０９３及びプログラムデータ１０９４は、ネットワーク（ＬＡＮ、ＷＡＮ等）を介して接続された他のコンピュータに記憶されてもよい。そして、プログラムモジュール１０９３及びプログラムデータ１０９４は、他のコンピュータから、ネットワークインタフェース１０７０を介してＣＰＵ１０２０によって読み出されてもよい。
【０１７６】
以上、本発明者によってなされた発明を適用した実施形態について説明したが、本実施形態による本発明の開示の一部をなす記述及び図面により本発明は限定されることはない。すなわち、本実施形態に基づいて当業者等によりなされる他の実施形態、実施例及び運用技術等は全て本発明の範疇に含まれる。
【符号の説明】
【０１７７】
１０  攻撃コード検知装置
１１  事前実行部
１２  制御部
１３  出力部
１４  記憶部
２０  オフセット辞書データベース（ＤＢ）
３０  確率モデルＤＢ
１００  ラベル付き悪性文書ファイル
１２１  ファイル形式判定部
１２２  デコード部
１２３  学習部
１２４  検知部
２００  ラベル付き良性文書ファイル
３００  検査対象未知文書ファイル
４００  学習データライブラリファイル
【図１】
0006527295.tif 000010
【図２】
0006527295.tif 000011
【図３】
0006527295.tif 000012
【図４】
0006527295.tif 000013
【図５】
0006527295.tif 000014
【図６】
0006527295.tif 000015
【図７】
0006527295.tif 000016
【図８】
0006527295.tif 000017
【図９】
0006527295.tif 000018
【図１０】
0006527295.tif 000019
【図１１】
0006527295.tif 000020
【図１２】
0006527295.tif 000021
【図１３】
0006527295.tif 000022
【図１４】
0006527295.tif 000023
【図１５】
0006527295.tif 000024
【図１６】
0006527295.tif 000025