(57)【要約】  攻撃コード検知装置（１０）は、ＲＯＰコードを含む既知のラベル付き悪性文書ファイル（１００）を学習データとして、文書ファイルの構成要素であるバイト列の特徴と、ＲＯＰコードの構成要素であるバイト列の特徴とを学習したモデルを生成する学習部（１２３）と、モデルを基に、検査対象未知文書ファイル（２００）に含まれるＲＯＰコードを検知する検知部（１２４）と、検知結果を基に検査対象未知文書ファイル（２００）がＲＯＰにより攻撃を実行する悪性なデータ系列であるか否かを判定する悪性判定部（１２５）と、を有する。
2017146094.tif 000002
【特許請求の範囲】
【請求項１】
ＲＯＰ(Return  Oriented  Programming)コードを含む既知の悪性データ系列を学習データとして、データ系列の構成要素であるバイト列の特徴と、ＲＯＰコードの構成要素であるバイト列の特徴と、を学習したモデルを生成する学習部と、
前記モデルを基に、検査対象の未知のデータ系列に含まれる前記ＲＯＰコードを検知する検知部と、
前記検知部の検知結果を用いて、前記検査対象の未知のデータ系列がＲＯＰにより攻撃を実行する悪性データ系列であるか否かを判定する悪性判定部と、
を有することを特徴とする攻撃コード検知装置。
【請求項２】
前記検知部は、前記モデルを基に、前記検査対象の未知のデータ系列を構成するバイト列に含まれるデータ系列の構成要素、或いは、前記ＲＯＰコードの構成要素を求め、前記検査対象の未知のデータ系列に含まれる前記ＲＯＰコードを検知することを特徴とする請求項１に記載の攻撃コード検知装置。
【請求項３】
前記学習部は、前記データ系列の構成要素であるバイトに前記データ系列の構成要素であることを示すデータラベルが付される一方、前記ＲＯＰコードの構成要素であるバイトに前記ＲＯＰコードであることを示すＲＯＰラベルが付された前記悪性データ系列を学習することによって、前記悪性データ系列におけるバイト列を観測系列とし、ラベル列を潜在系列としたモデルを生成し、
前記検知部は、前記モデルを基に、前記検査対象の未知のデータ系列のバイト列に、該バイト列を出力する確率が最も高いラベルの組み合わせを有するラベル列を付与し、付与したラベル列の中に前記ＲＯＰラベルを含むか否かを検知し、
前記悪性判定部は、前記検知部が前記付与したラベル列の中に前記ＲＯＰラベルを含むことを検知した場合には、前記検査対象の未知のデータ系列が前記悪性データ系列であると判定し、前記検知部が前記付与したラベル列の中に前記ＲＯＰラベルをないことを検知した場合には、前記検査対象の未知のデータ系列が前記ＲＯＰによる攻撃を行う悪性なデータ系列でないと判定することを特徴とする請求項２に記載の攻撃コード検知装置。
【請求項４】
前記学習部は、潜在変数である前記ラベルごとに、観測変数である各バイトの出力確率を対応付けた前記観測変数の出力確率、前記潜在変数ごとに、遷移可能である前記潜在変数への遷移確率が対応付けられた前記潜在変数間の遷移確率、及び、前記潜在系列の初期状態確率、をモデルパラメータとして有するモデルを生成し、
前記検知部は、前記モデルを基に、前記検査対象の未知のデータ系列におけるバイト列に対し、取り得る全てのラベルの組み合わせのうち、最も尤もらしいラベルの組み合わせを有するラベル列を確率的に求め付与することを特徴とする請求項３に記載の攻撃コード検知装置。
【請求項５】
前記検知部は、前記検査対象の未知のデータ系列の長さをＴとした場合、前記モデルを基に、取り得るラベル列をＳ＝ｓ１，ｓ２，・・・，ｓＴとし、観測したバイト列をＯ＝ｏ１，ｏ２，・・・，ｏＴとし、モデルのモデルパラメータをθとしたときに、確率Ｐ（Ｓ，Ｏ；θ）が最も高くなるラベル列Ｓ＊をバイト列Ｏについて求め、該求めたラベル列Ｓ＊をバイト列Ｏに付与することを特徴とする請求項４に記載の攻撃コード検知装置。
【請求項６】
前記学習部は、ＲＯＰコードの含まれたデータ系列に対して手動或いは所定の動的解析によるラベル付き悪性データ系列手法に基づいて、各バイトにラベル付けが実施された前記悪性データ系列を学習したモデルを生成することを特徴とする請求項１〜５のいずれか一つに記載の攻撃コード検知装置。
【請求項７】
前記悪性データ系列は、文書ファイルであることを特徴とする１〜６のいずれか一つに記載の攻撃コード検知装置。
【請求項８】
攻撃コード検知装置が実行する攻撃コード検知方法であって、
前記攻撃コード検知装置が、ＲＯＰコードを含む既知の悪性データ系列を学習データとして、データ系列の構成要素であるバイト列の特徴と、ＲＯＰコードの構成要素であるバイト列の特徴と、を学習したモデルを生成する工程と、
前記攻撃コード検知装置が、前記モデルを基に、検査対象の未知のデータ系列に含まれる前記ＲＯＰコードを検知する工程と、
前記攻撃コード検知装置が、検知結果を用いて、前記検査対象の未知のデータ系列がＲＯＰにより攻撃を実行する悪性なデータ系列であるか否かを判定する工程と、
を含んだことを特徴とする攻撃コード検知方法。
【請求項９】
ＲＯＰコードを含む既知の悪性データ系列を学習データとして、データ系列の構成要素であるバイト列の特徴と、ＲＯＰコードの構成要素であるバイト列の特徴と、を学習したモデルを生成するステップと、
前記モデルを基に、検査対象の未知のデータ系列に含まれる前記ＲＯＰコードを検知するステップと、
検知結果を用いて、前記検査対象の未知のデータ系列がＲＯＰにより攻撃を実行する悪性なデータ系列であるか否かを判定するステップと、
をコンピュータに実行させるための攻撃コード検知プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、攻撃コード検知装置、攻撃コード検知方法及び攻撃コード検知プログラムに関する。
【背景技術】
【０００２】
近年、悪性文書ファイルによる脅威が顕在化している。悪性文書ファイルとは、内容を閲覧するためにこのファイルをビューアアプリケーションで開くと、攻撃が開始され、マルウェアの感染に至るように構成された文書ファイルである。【０００３】
このような悪性文書ファイルの多くは、文書ファイル内に脆弱性を攻略するエクスプロイトコードを持つ。このエクスプロイトコードとは、悪意のある動作を実現するために、脆弱性を攻略するためのコードである。攻撃は、攻撃者の任意のコードを実行させることを目指して脆弱性を攻略するものが多く、悪性文書ファイルは、エクスプロイトコードを用いて脆弱性を攻略し、攻撃対象に攻撃コードを実行させ、最終的にマルウェアをダウンロードして実行させる。この攻撃コードとして、シェルコードやＲＯＰ(Return  Oriented  Programming)コードが用いられる。【０００４】
まず、シェルコードとは、攻撃者が作成した機械語コード片であり、作成したコードに応じて、アプリケーションに任意の動作をさせることができるものである。シェルコードによる攻撃を実現するためには、メモリへの書き込みによってシェルコードを注入し、それを実行させる必要がある。ただし、近年では、書き込み可能なメモリ領域を実行不可にするデータ実行防止機構の普及により、シェルコードのみで攻撃を成功させることは難しくなってきている。【０００５】
それにともなって、ＲＯＰ攻撃と呼ばれる新たな攻撃手法の脅威が顕在化してきている。ＲＯＰ攻撃とは、脆弱性を攻略してコールスタックを上書きすることでリターン先を掌握し、ret命令の繰り返しによってライブラリなどの既存のコードを継ぎ接ぎすることで、任意のコード実行を実現する攻撃手法である。なお、ＲＯＰでリターンした先に存在する、継ぎ接ぎされる既存のコードは、ＲＯＰガジェットと呼ばれる。【０００６】
このＲＯＰ攻撃は、以下の手順で実現される。まず、攻撃者は、バッファオーバーフローなどの脆弱性を突いて、コールスタックを書き換えられることを確認する。これによって、攻撃者は、以降のリターン先を掌握できるようになる。続いて、攻撃者は、コールスタックを上書きするコードを生成する。このとき、攻撃者は、リターンの繰り返しによってライブラリなどの既存のコードを継ぎ接ぎし、任意の動作を実現できるコードを生成する。この生成されたコードを、ＲＯＰコードと呼ぶ。そして、攻撃者は、コールスタックをＲＯＰコードで上書きさせることによって、攻撃対象に対し、攻撃者の任意のコードを実行させる。以上が一般的なＲＯＰの手順である。このＲＯＰ攻撃では、シェルコードを注入することなく、任意のコードを実行させることが可能である。【０００７】
このＲＯＰ攻撃は、データ実行防止機構に影響されずに任意コード実行が可能であるものの、攻撃対象の環境によって、ＲＯＰコードの長さに制約があり、自由な攻撃を実現できない場合も少なくない。したがって、近年では、攻撃手法として、短いＲＯＰコードによってデータ実行防止機構を回避し、実際の悪性な動作は、シェルコードによって実施する手法が多い。特に、脆弱性を攻略してＲＯＰコードを実行し、シェルコードを実行可能な状態にしてから該シェルコードを実行することによって、マルウェアのダウンロードなどの攻撃を行う文書ファイルが発見されている。【０００８】
以上のような悪性文書ファイルによる脅威を検知し、対処するためには、文書ファイルの悪性判定が必要となる。この悪性文書ファイルを判定する方法として、文書ファイル中にエクスプロイトコードや攻撃コードが含まれているか否かを検知する方法がある。【０００９】
ここで、エクスプロイトコードは、文書ファイル中に含まれている場合と、含まれていない場合とが存在する。例えば、ＰＤＦ（Portable  Document  Format）形式のように、スクリプトエンジンや、プラグインの脆弱性を攻略することが多い悪性文書ファイルは、エクスプロイトコードを具備している可能性が高い。一方で、ＯＬＥ（Object  Linking  and  Embedding）形式のように、ビューアアプリケーションのフォーマットの扱いの不備に存在する脆弱性を攻略することが多い悪性文書ファイルでは、エクスプロイトコードを持たない場合が少なくない。そのため、攻撃コードの検知が有効な手法となる。【００１０】
しかしながら、攻撃コードの一つであるシェルコードの検知が困難な場合がある。例えば、シェルコードがエンコードされており、実行の直前にデコードされるという手法が存在するためである。この場合、シェルコードの特徴がエンコードによって隠蔽されるため、シェルコードの検知が難しくなる。したがって、シェルコードの検知による悪性判定は、正しく機能しない場合がある。以上より、攻撃コードのうち、ＲＯＰコードを検知する技術が重要となってきている。このＲＯＰコードを検知する手法として、従来、以下に挙げる手法が提案されている。【００１１】
例えば、非特許文献１には、次のような手法が提案されている。非特許文献１記載の手法では、まず、実行命令を監視し、call命令実行時にスタックにプッシュされるリターンアドレスを、シャドウスタックに保存しておく。そして、ret命令実行時にリターンする先となるリターンアドレスと、シャドウスタックの最上位に保存されているアドレスとを比較することによって、適切にリターンしているかを検証し、ＲＯＰを検知する。非特許文献１には、この手法によれば、実験によって、誤検知なくＲＯＰを検知できることが記載されている。【００１２】
また、例えば、非特許文献２には、仮想環境上で、検査対象の文書ファイルをビューアアプリケーションで開き、メモリスナップショットを取得して解析を行う手法が提案されている。この解析として、まず、メモリスナップショット中に含まれているアドレスを抽出して、ＲＯＰガジェットの候補がそれぞれどんな動作をするかをプロファイルする。そして、このプロファイルを基に、ＲＯＰコード全体のプロファイルを行っている。【００１３】
そして、非特許文献３には、ＲＯＰコードの特徴に基づいて、ポリシーベースで静的に検知する手法が提案されている。この手法では、シグネチャに依存せずに静的にＲＯＰコードを検知でき、良性の文書ファイルに対する誤検知も非常に少ないとされる。
【先行技術文献】
【非特許文献】
【００１４】
【非特許文献１】L.  Davi，  A.  Sadeghi,  and  M.  Winandy,  “ROPdefender:  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
【非特許文献２】B.  Stancill,  K.  Z.  Snow,  N.  Otterness,  F.  Monrose,  L.  Davi  and  A.  Sadeghi,  “Check  My  Profile:  Leveraging  Static  Analysis  for  Fast  and  Accurate  Detection  of  ROP  Gadgets”,  Volume  8145  of  the  series  Lecture  Notes  in  Computer  Science,  pp62-81，RAID,  2013
【非特許文献３】田中  恭之，後藤  厚宏，  “悪性文書ファイル内のROP攻撃コード静的判定手法”,  情報処理学会論文誌，Vol.56，No.9，1693-1705（Sep,  2015）
【発明の概要】
【発明が解決しようとする課題】
【００１５】
しかしながら、非特許文献１記載の動的手法では、実行命令の監視が必要であり、かつ、検査対象の文書ファイルを仮想環境上でビューアアプリケーションを用いて開かなければならない上に、実行命令の監視の際に、ＤＢＩ(Dynamic  Binary  Instrumentation)  技術を用いているため、ビューアアプリケーション自体の実行速度も低下することから、ファイルの検査に一定の時間を必要とするという問題があった。【００１６】
また、非特許文献２記載の手法では、ＤＢＩ技術を用いた動的解析よりも短時間で実施でき、さらに、ＲＯＰコード中のアドレスが、どのようなガジェットを指しているかの対応付けも可能であるものの、仮想環境での実行や、メモリスナップショットの取得に時間がかかるため、一定の時間を必要とするという問題があった。【００１７】
そして、非特許文献３記載の手法では、決定論的な検知手法を採用しているため、ポリシーを知る攻撃者には、回避されてしまう可能性が高いという問題があった。また、非特許文献３の中で提案されているポリシーでは、例えば、ごく短いＲＯＰコードや、複数のライブラリにまたがって構成されたＲＯＰコードを、検知できない可能性が高いという問題があった。【００１８】
本発明は、上記に鑑みてなされたものであって、攻撃者によるＲＯＰ検知の回避を防ぎながら、高速かつ高精度なＲＯＰコードの検知を実現することができる攻撃コード検知装置、攻撃コード検知方法及び攻撃コード検知プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１９】
上述した課題を解決し、目的を達成するために、本発明に係る攻撃コード検知装置は、ＲＯＰコードを含む既知の悪性データ系列を学習データとして、データ系列の構成要素であるバイト列の特徴と、ＲＯＰコードの構成要素であるバイト列の特徴と、を学習したモデルを生成する学習部と、モデルを基に、検査対象の未知のデータ系列に含まれるＲＯＰコードを検知する検知部と、検知部の検知結果を用いて、検査対象の未知のデータ系列がＲＯＰにより攻撃を実行する悪性なデータ系列であるか否かを判定する悪性判定部と、を有することを特徴とする。
【発明の効果】
【００２０】
本発明によれば、攻撃者によるＲＯＰ検知の回避を防ぎながら、高速かつ高精度なＲＯＰコードの検知を実現することができる。
【図面の簡単な説明】
【００２１】
【図１】図１は、実施の形態１に係る攻撃コード検知装置の構成の一例を説明するための図である。
【図２】図２は、図１に示すラベル付き悪性文書ファイルの一例を示す図である。
【図３】図３は、図２に示すファイルにおけるＲＯＰコード部分を説明するための図である。
【図４】図４は、図３の表の左側部分の１行目から５行目のバイト及びラベルを模式的に対応付けた図である。
【図５】図５は、潜在系列（ラベル列）の潜在変数となるラベルの遷移の例を示した図である。
【図６】図６は、各潜在変数（ラベル）について潜在系列の初期状態確率を対応付けた表を示す図である。
【図７】図７は、潜在変数（ラベル）ごとに、観測変数（バイト）の出力確率を対応付けた表を示す図である。
【図８】図８は、潜在変数（ラベル）間の遷移確率を、遷移する潜在変数の組み合わせごとに対応付けた表を示す図である。
【図９】図９は、６４ｂｉｔ環境に対応させたラベルの遷移の例を示す図である。
【図１０】図１０は、図１に示す攻撃コード検知装置が確率モデルを生成するまでの処理手順を示すフローチャートである。
【図１１】図１１は、図１０に示す確率モデル生成処理の処理手順を示すフローチャートである。
【図１２】図１２は、図１に示す検知部が想定する全てのラベル列の組み合わせを説明するための図である。
【図１３】図１３は、図１に示す検知部が、検査対象ファイルのバイト列に付与するラベル列の例を説明するための図である。
【図１４】図１４は、図１に示す攻撃コード検知装置が検査対象未知文書ファイルを判定するまでの処理手順を示すフローチャートである。
【図１５】図１５は、図１４に示す検知処理の処理手順を示すフローチャートである。
【図１６】図１６は、プログラムが実行されることにより、攻撃コード検知装置が実現されるコンピュータの一例を示す図である。
【発明を実施するための形態】
【００２２】
以下、図面を参照して、本発明の一実施形態を詳細に説明する。なお、この実施形態により本発明が限定されるものではない。また、図面の記載において、同一部分には同一の符号を付して示している。
【００２３】
［実施の形態１］
実施の形態１に係る攻撃コード検知装置について、攻撃コード検知装置の概略構成、及び、攻撃コード検知装置における処理の流れ及び具体例を説明する。
【００２４】
この実施の形態１に係る攻撃コード検知装置は、事前に、ＲＯＰコードを含む既知の悪性データ系列を用いて、文書ファイル部分とＲＯＰコード部分とのそれぞれが有するバイト列の特徴を学習した確率モデルを生成する。そして、この攻撃コード検知装置は、生成した確率モデルに基づき、検査対象である未知の文書に対し、この文書を構成するバイト列に、文書ファイルの構成要素であることを示すラベル（文書ラベル）或いはＲＯＰコードの構成要素であることを示すラベル（ＲＯＰラベル）をラベリングする。これによって、実施の形態１に係る攻撃コード検知装置は、この未知の文書をビューアアプリケーションで開くことなく、この未知の文書がＲＯＰコード部分を含むか否かを検知する。
【００２５】
したがって、実施の形態１に係る攻撃コード検知装置は、検査対象の未知の文書に含まれるＲＯＰコード部分の検知を、いわゆるヒューリスティック判定で高速に実現する。ヒューリスティック判定とは、これまでの学習に基づいて、ＲＯＰコードらしさを定義し、その定義に従って判定するものである。
【００２６】
［攻撃コード検知装置の構成］
そこで、図１を参照して、実施の形態１に係る攻撃コード検知装置の構成について説明する。図１は、実施の形態１に係る攻撃コード検知装置の構成の一例を説明するための図である。
【００２７】
図１に示すように、実施の形態１に係る攻撃コード検知装置１０は、入力部１１、制御部１２、出力部１３、記憶部１４及び確率モデルデータベース（ＤＢ）２０を有する。
【００２８】
入力部１１は、キーボードやマウス等の入力デバイスで構成され、外部からの情報の入力を受け付け、制御部１２に入力する。入力部１１は、ラベル付き悪性文書ファイル１００、或いは、検査対象未知文書ファイル２００の入力を受け付け、制御部１２に出力する。ラベル付き悪性文書ファイル１００は、ＲＯＰコードを含む既知の悪性データ系列であり、文書ファイルの構成要素であるバイトに文書ラベルが付与される一方、ＲＯＰコードの構成要素であるバイトにＲＯＰラベルが付与された悪性データ系列である。検査対象未知文書ファイル２００は、未知の文書ファイルである。
【００２９】
制御部１２は、各種の処理手順などを規定したプログラム及び所要データを格納するための内部メモリを有し、これらによって種々の処理を実行する。例えば、制御部１２は、ＣＰＵ（Central  Processing  Unit）やＭＰＵ（Micro  Processing  Unit）などの電子回路である。制御部１２は、ファイル形式判定部１２１、デコード部１２２、学習部１２３、検知部１２４及び悪性判定部１２５を有する。
【００３０】
ファイル形式判定部１２１は、入力される全ての文書ファイルに対し、いずれのファイル形式によって構成されているファイルであるかを判定する。ファイル形式判定部１２１は、入力された文書ファイルについて、この文書ファイルのヘッダやファイル構造の特徴に基づいて、ファイルの形式を判別する。例えば、ファイルの形式として、ＤＯＣ、ＸＬＳ、ＰＰＴ、ＰＤＦなどが想定される。
【００３１】
デコード部１２２は、文書ファイルの形式によってはエンコードされている領域が存在するため、エンコードされた領域があれば、このエンコードされた領域をデコードする。
【００３２】
学習部１２３は、ラベル付き悪性文書ファイル１００を学習データとして、文書ファイルの構成要素であるバイト列の特徴と、ＲＯＰコードの構成要素であるバイト列の特徴と、を学習した確率モデルを生成する。学習部１２３は、生成した確率モデルを、確率モデルＤＢ２０にモデルパラメータの形で記憶させる。
【００３３】
検知部１２４は、確率モデルＤＢ２０に記憶された確率モデルに基づいて、検査対象未知文書ファイル２００のデータ系列に含まれるＲＯＰコードを検知する。具体的には、検知部１２４は、確率モデルを基に、検査対象の未知のデータ系列を構成するバイト列に対して、文書ファイルの構成要素であるか、或いは、ＲＯＰコードの構成要素であるかのラベリングを行い、検査対象未知文書ファイル２００のデータ系列に含まれるＲＯＰコードを検知する。すなわち、検知部１２４は、検査対象未知文書ファイル２００に対し、この文書を構成するバイト列に、文書ラベル或いはＲＯＰラベルをラベリングすることによって、検査対象未知文書ファイル２００の構成要素にＲＯＰコード部分が含まれているか否かの検知を行う。
【００３４】
悪性判定部１２５は、検知部１２４が検知したＲＯＰコード部分の有無に基づいて、検査対象の検査対象未知文書ファイル２００のデータ系列がＲＯＰにより攻撃を実行する悪性なデータであるか否かを判定する。悪性判定部１２５は、検知部１２４が検査対象未知文書ファイル２００にＲＯＰコード部分が含まれることを検知した場合には、検査対象未知文書ファイル２００が悪性なデータであることを判定する。一方、悪性判定部１２５は、検知部１２４が検査対象未知文書ファイル２００にＲＯＰコード部分が含まれていないことを検知した場合には、検査対象未知文書ファイル２００がＲＯＰによる攻撃を行う悪性なデータでないことを判定する。
【００３５】
出力部１３は、例えば、液晶ディスプレイやプリンタ等であって、攻撃コード検知に関する情報を含む各種情報を出力する。また、出力部１３は、外部装置との間で、各種データの入出力を司るインタフェースであってもよく、外部装置に各種情報を出力してもよい。
【００３６】
記憶部１４は、ＲＡＭ（Random  Access  Memory）、フラッシュメモリ（Flash  Memory）等の半導体メモリ素子、または、ハードディスク、光ディスク等の記憶装置によって実現され、攻撃コード検知装置１０を動作させる処理プログラムや、処理プログラムの実行中に使用されるデータなどが記憶される。
【００３７】
確率モデルＤＢ２０は、学習部１２３によって生成された確率モデルをモデルパラメータの形で蓄積する。確率モデルＤＢ２０は、攻撃コード検知装置１０によって管理される。もちろん、確率モデルＤＢ２０は、他の装置（サーバ等）によって管理されていてもよく、この場合には、学習部１２３は、出力部１３の通信インタフェースを介して、生成した確率モデルを、確率モデルＤＢ２０の管理サーバ等に出力して、確率モデルＤＢ２０に記憶させる。
【００３８】
［ラベル付き悪性文書ファイルの構成］
次に、ラベル付き悪性文書ファイル１００について説明する。図２は、図１に示すラベル付き悪性ファイル１００の一例を示す図である。ラベル付き悪性文書ファイル１００は、実際の悪性文書ファイルを調査し得られたものであり、例えば、図２のファイルＤに示すように、エクスプロイトコード部、シェルコード部、ＲＯＰコード部等を含む。学習部１２３は、例えば、このようなファイルＤを、学習するためのデータとして用い、文書ファイルの構成要素であるバイト列の特徴と、ＲＯＰコードの構成要素であるバイト列の特徴と、を学習した確率モデルを生成する。
【００３９】
図３は、図２に示すファイルＤ（ラベル付き悪性文書ファイル１００）におけるＲＯＰコード部分を説明するための図である。図３は、説明のために、ＲＯＰコード部分及びその前後の部分のデータ系列の具体例を示す。図３では、ＲＯＰコード部分とともにＲＯＰコード部分の直前の文書ファイルの一部バイト値として「0xff」、及び、ＲＯＰコード部分の直後の文書ファイルの一部バイト値として「0x31」を示す。
【００４０】
ここでは、リトルエンディアンの環境下で、４バイトで構成されるアドレスや定数を１バイトごとに分割し、最下位のバイトから順に記録した例を示している。そこで、図３では、分割された各バイトの値を、表Ｔａの左列に、記録順に一列に配置している。以降については、この列をバイト列として説明する。
【００４１】
図３に示すように、攻撃コード検知装置１０では、ラベル付き悪性文書ファイル１００として、ラベル付き悪性文書ファイル１００のそれぞれのバイト値に、各バイトの由来を表すラベルが対応付けられて組になったものが用いられている。由来とは、そのバイト値が文書ファイルの構成要素か、ＲＯＰコードの構成要素かを示すものである。なお、図３では、各バイト値にそれぞれ対応付けられたラベルの名前は、表Ｔａの右列に、組となるバイトの配置に合わせて一列に配置している。以降については、この列をラベル列として説明する。
【００４２】
ここで、ＲＯＰコードの構成要素には、具体的には、ＲＯＰガジェットアドレス、定数、及び、ジャンクコードの３つがある。ＲＯＰガジェットアドレスは、ＲＯＰガジェットを指し示すアドレス値である。定数は、ＲＯＰで関数呼び出しをする際の引数である。そして、ジャンクコードは、スタックポインタの位置を調整するためにあるもので、攻撃の際に参照されないコードである。
【００４３】
以降では、上記の３つの構成要素をそれぞれ、「アドレス」、「定数」、「ジャンク」と表記する。また、本実施の形態１は、文書ファイルの構成要素を「文書ラベル」と表記する。
【００４４】
そして、ＲＯＰコードの構成要素には、ＲＯＰ（アドレス１，２，３，４）ラベル、ＲＯＰ（定数１，２，３，４）ラベル、ＲＯＰ（ジャンク）ラベルを用いている。ここで、「１，２，３，４」の数字は、４バイトで構成されるアドレスや定数のうち、何バイト目のバイトであるかを示すインデックスである。リトルエンディアンの環境下では、ＲＯＰ（アドレス１）やＲＯＰ（定数１）のラベルには、アドレスや定数の最下位バイトが対応し、ＲＯＰ（アドレス４）やＲＯＰ（定数４）のラベルには、最上位バイトが対応する。
【００４５】
例えば、図３の表Ｔａの左側部分の上から２行目から始まる「0x0101acd9」というＲＯＰアドレスに対しては、バイト値「0xd9」にＲＯＰ（アドレス１）ラベルが付与されており、バイト値「0xac」にＲＯＰ（アドレス２）ラベルが付与されており、バイト値「0x01」にＲＯＰ（アドレス3）ラベルが付与されており、バイト値「0x01」にはＲＯＰ（アドレス４）ラベルが付与されている。同様に、表Ｔａの右側部分の１行目から始まる「0x00003000」という定数に対しては、バイト値「0x00」にＲＯＰ（定数１）ラベルが付与されており、バイト値「0x30」にＲＯＰ（定数２）ラベルが付与されており、バイト値「0x00」にＲＯＰ（定数３）ラベルが付与されており、バイト値「0x00」にＲＯＰ（定数４）ラベルが付与されている。
【００４６】
このように、攻撃コード検知装置１０においては、学習用のデータとして、ラベル付き悪性文書ファイル１００のそれぞれのバイトに、文書ラベル或いはＲＯＰラベルが対応付けられたものを用いる。
【００４７】
なお、ラベルの設計はこれに限るものではなく、例えば、文書ラベルを文書ファイルの形式にあわせてさらに細かく分解してもよい。また、テキスト文書が含まれるワードドキュメントストリーム、様々なデータが含まれるデータストリーム、マクロプログラムが含まれるマクロストレージなどでは、それぞれバイト列の分布が異なると考えられるため、これらを分けるなどが考えられる。
【００４８】
また、学習データとなるラベル付き悪性文書ファイル１００は、予め作成されたものである。ラベル付き悪性文書ファイル１００の作成は、ＲＯＰコードが含まれる悪性文書ファイルを発見し、この発見した悪性文書ファイルを用いて、所定の方法でバイトに分割する。続いて、手動或いは動的解析によって、各バイトに、ラベルを付与する。
【００４９】
例えば、手動によってラベルを付与する場合には、一般に流通している、脆弱性に対するＰｏＣ（Proof-of-Concept）コードなどに記載されているＲＯＰアドレスを参照して、文書ファイル中に埋め込まれたＲＯＰコードを抽出する。そして、アドレス値から、ＲＯＰが用いるライブラリの種類を調べ、ＲＯＰアドレスを確認しながらラベル付けをしていく。
【００５０】
また、動的解析によってラベルを付与する場合は、非特許文献１に示す手法を用いることもできる。すなわち、実行命令やスタックの状態などを監視することによってＲＯＰを検知するシステムを用いて、ＲＯＰコード部分を抽出する。そして、このシステムでは、ラベル付けについても、実行されたＲＯＰガジェットのアドレスを参照し、付与している。
【００５１】
［学習部の学習処理］
学習部１２３は、上述したような、ラベル付き悪性文書ファイル１００のバイトに、文書ラベル或いはＲＯＰラベルが対応付けられたものを用いて、文書ファイル部分とＲＯＰコード部分とのそれぞれが有するバイト列の特徴を学習した確率モデルを生成する。
【００５２】
図４は、図３の表Ｔａの左側部分の１行目から５行目のバイト及びラベルを模式的に対応付けた図である。上述したように、本実施の形態１では、各バイトに各バイトの由来を表すラベルが対応付けた学習データを用意している。すなわち、文書ファイルの各バイトに、文書ラベルと複数のＲＯＰラベルとの中からいずれか一つをラベル付けしたものである。このため、各バイトの背後には、いずれかのラベルが潜んでいると言える。そして、攻撃検知対象のＲＯＰ攻撃では、ＲＯＰコードにより、短いＲＯＰガジェット間を次々に遷移させることによって、コードを継ぎ接ぎし、任意の動作を実現できるコードを生成するものである。ＲＯＰコードの構成は、遷移していくＲＯＰアドレスを基本としていて、ＲＯＰアドレスによる関数呼び出しがあれば定数が続き、さらにスタックの調整が必要であればジャンクが連なる、というように、それぞれ前後で関連性がある。このため、各バイトの背後にそれぞれ潜むラベルは、他のラベルへと遷移するものと言える。
【００５３】
したがって、図４に示すように、文書ファイルから観測可能な系列であるバイト列の背後には、確率的に遷移する潜在的な状態の系列であるラベル列が潜んでおり、それぞれの状態ごとに、確率的にバイト値を出力するというモデルが考えられる。なお、観測可能な系列（観測系列）にはバイト列が対応し、潜在的な状態の系列（潜在系列）にはラベル列が対応する。したがって、学習部１２３は、潜在系列からの観測変数の出力確率を、確率モデルのモデルパラメータの一つとして生成する。
【００５４】
そして、潜在系列（ラベル列）の潜在変数となる各ラベルは、他のラベルへと遷移する特徴を有する。図５は、潜在系列（ラベル列）の潜在変数となるラベルの遷移の例を示した図である。例えば、ＲＯＰコード検出の問題に適用可能な、隠れマルコフモデルや条件付き確率場のようなグラフィカルモデルでは、潜在変数がどのように遷移するかが一つの重要な要素となる。
【００５５】
ここでは、潜在変数（ラベル）の遷移の特徴として、図５の矢印Ｒ１，Ｒ２に示すように、アドレスラベル（ＲＯＰアドレス１〜４ラベル）や定数ラベル（ＲＯＰ定数１〜４ラベル）は、４バイト分のleft-to-rightの一方通行の形になっていることが挙げられる。これは、３２ｂｉｔ環境下では、アドレスや定数が４バイト単位であるためである。
【００５６】
そして、潜在変数の遷移の特徴として、文書ラベルからは、文書ラベル、アドレスラベル、または、ジャンクラベルにのみ遷移すること（図５の矢印Ｙ１〜Ｙ３参照）が挙げられる。これは、文書の直後に定数が来るＲＯＰコードは存在し得ないためである。
【００５７】
ＲＯＰコード検知の際には、このような特徴を基にＲＯＰコードの有無を検知するため、学習部１２３は、さらに、潜在変数の遷移状態を確率的に示すモデル、すなわち、潜在変数間の遷移確率を、確率モデルのモデルパラメータの一つとして生成する。
【００５８】
以上より、学習部１２３は、観測変数の出力確率、潜在変数間の遷移確率及び潜在系列の初期状態確率をモデルパラメータとして持つモデルを想定し、図６〜図８に例示するような確率モデルの生成を行う。図６は、各潜在変数（ラベル）について潜在系列の初期状態確率を対応付けた表を示す図である。図７は、潜在変数（ラベル）ごとに、観測変数（バイト）の出力確率を対応付けた表を示す図である。図８は、潜在変数（ラベル）間の遷移確率を、遷移する潜在変数の組み合わせごとに対応付けた表を示す図である。
【００５９】
まず、学習部１２３が、モデルパラメータのうち観測変数の出力確率を生成するまでの処理について説明する。上述したように、文書ファイルのバイト列が観測系列に対応し、ラベル列が潜在系列に対応する。学習部１２３は、まず、学習データとして、既知のラベル付き悪性文書ファイル１００を学習データとして受け取る（例えば、図３の表Ｔａ参照）。
【００６０】
続いて、潜在変数の初期状態確率πについて、文書ラベルに対応する潜在変数から始まる確率π文書を１、それ以外のラベルに対応する潜在変数から始まる確率を０として設定する。ＲＯＰコードから始まる文書ファイルは、ファイル形式上、考えにくいためである。学習部１２３は、このため、初期状態確率として、文書ラベルには「１」が対応付けられ、文書以外のラベルには「０」が対応付けられた表Ｔ１（図６参照）を、この潜在系列の初期状態確率を示すモデルパラメータとして生成し、確率モデルＤＢ２０に格納する。
【００６１】
そして、学習部１２３は、全ての潜在変数（ラベル）に対して、そのラベルが観測変数（バイト）を出力する確率を計算する。ここで、観測変数の取り得る値はバイト値であるため、その集合Ｘは、Ｘ＝｛0x00,…,0xFF｝となる。また、潜在変数の取り得る値はラベルであるため、その集合Ｌは、Ｌ＝｛文書,ＲＯＰ（アドレス１）,…,ＲＯＰ（アドレス４）,ＲＯＰ（定数１）,…,ＲＯＰ（定数４）,ＲＯＰ（ジャンク）｝となる。
【００６２】
このため、例えば、文書ラベルがバイト値「0x00」を出力する確率は、「文書ラベルの付いている0x00の値を持つバイト数」を「文書ラベルの付いている全バイト数」で除することによって計算することができる。この計算を、バイト値「0x00」からバイト値「0xFF」についてそれぞれ計算する。これによって、文書ラベルが、各バイト値「0x00」からバイト値「0xFF」をそれぞれ出力する確率が計算できる。この計算を全てのラベルについて計算する。
【００６３】
学習部１２３は、これらの計算を行うことによって、潜在変数（ラベル）ごとに、それぞれの観測変数（バイト）の出力確率を対応付けた表Ｔ２（図７参照）を、観測変数の出力確率を示すモデルパラメータとして生成し、確率モデルＤＢ２０に格納する。
【００６４】
この観測変数の出力確率として、Ｌのうちｉ番目のものをｌｉ，Ｘのうちｊ番目のものをｘｊとして、ｌｉがｘｊを出力する確率をｂｉ，ｊとする。その場合、表Ｔ２に例示するように、例えば「文書」ラベルについては、「0x00」から「0xFF」までのバイト値を出力する確率「ｂ文書,0x00」から「ｂ文書,0xFF」が対応付けられ、「ＲＯＰ（アドレス１）」ラベルについては、「0x00」から「0xFF」までの全ての取り得るバイト値を出力する確率「ｂROP（アドレス１）,0x00」から「ｂROP（アドレス１）,0xFF」が対応付けられたものである。
【００６５】
次に、学習部１２３が、モデルパラメータのうち潜在変数間の遷移確率を生成するまでの処理について説明する。この場合、学習部１２３は、全てのあり得る潜在変数（ラベル）の組について、ラベル間の遷移確率を計算する。まず、学習部１２３は、図５を用いて説明した、アドレスラベルや定数ラベルが４バイト分のleft-to-rightの一方通行の形になるというラベルの遷移の特徴、文書ラベルからは、文書ラベル、アドレスラベル、または、ジャンクラベルにのみ遷移するというラベルの遷移の特徴、及び、図５に示すラベルの遷移状態関係に基づいて、全てのあり得るラベルの組を求める。
【００６６】
この全てのあり得る潜在変数（ラベル）の組について、潜在変数間の遷移確率を計算するには、潜在変数間の遷移回数を集計することで計算できる。例えば、ＲＯＰ（アドレス４）ラベルからＲＯＰ（ジャンク）ラベルへの遷移確率は、「ＲＯＰ（アドレス４）ラベルからＲＯＰ（ジャンク）ラベルへの遷移回数」を「ＲＯＰ（アドレス４）ラベルからの全ての遷移回数」で除することによって計算することができる。この計算を、全てのあり得る潜在変数の組について計算する。
【００６７】
学習部１２３は、全てのあり得る潜在変数の組について潜在変数間の遷移確率を計算することによって、潜在変数の組み合わせ（遷移元のラベルと遷移先のラベルとの組み合わせ）ごとに、遷移する確率を対応付けた表Ｔ３（図８参照）を、潜在変数間の遷移確率を示すモデルパラメータとして生成し、確率モデルＤＢ２０に格納する。
【００６８】
この潜在変数間の遷移確率として、Ｌのうちｉ番目のものをｌｉ，ｊ番目のものをｌｊとして、ｌｉからｌｊに遷移する確率をａｉ，ｊとする。その場合、表Ｔ３に例示するように、「文書」ラベルから「ＲＯＰ（アドレス１）」ラベルへの遷移確率には、「ａ文書,ＲＯＰ（アドレス１）」が対応付けられている。そして、表Ｔ３に例示するように、「文書」ラベルから、各「ＲＯＰ（アドレス２）」ラベルから「文書」ラベルについても、遷移確率「ａ文書,ＲＯＰ（アドレス２）」から「ａ文書,文書」がそれぞれ対応付けられている。さらに、他のラベルについても同様に、全てのあり得る遷移先のラベルへの遷移確率がそれぞれ対応付けられている。
【００６９】
さらに、学習部１２３は、ＲＯＰコードのアドレス部分の構成に用いられるＤＬＬ等のファイルが判明している場合は、そのファイル中のＲＯＰガジェット候補のアドレスを基に再学習する。なお、学習部１２３がアドレスを学習するために、前提として、このファイルがメモリ上にロードされる際のアドレスが固定である必要がある。この再学習によって、学習データのＲＯＰコードに含まれていないアドレスが検査対象で用いられていても、検知率を高く保つことが期待できる。
【００７０】
この再学習は、モデルパラメータのうち、ＲＯＰ（アドレス１）ラベルからＲＯＰ（アドレス４）ラベルの潜在状態における出力確率を更新することで実現できる。まず、学習部１２３は、ファイル中からＲＯＰガジェット候補のアドレス一覧を抽出する。この抽出は、既存のソフトウェアを用いて実現できることが知られている。
【００７１】
そして、学習部１２３は、抽出したＲＯＰガジェット候補のアドレスを１バイトごとに分割し、１バイト目をＲＯＰ（アドレス１）、２バイト目をＲＯＰ（アドレス２）、というように、バイトごとに各ラベルを対応付け、出力確率の計算を行う。例えば、ＲＯＰ（アドレス１）のラベルがバイト値「0x00」を出力する確率は、「１バイト目が0x00の値を持つアドレス数」を「全アドレス数」で除することによって計算することができる。この計算を「ＲＯＰ（アドレス１）」から「ＲＯＰ（アドレス４）」までのラベルについて、それぞれバイト値「0x00」からバイト値「0xFF」まで行うことによって、各出力確率を計算し、モデルパラメータを更新することで、再学習する。
【００７２】
続いて、学習部１２３は、このように生成された確率モデルの中で、遷移確率、出力確率の中に、値が「０」となるものがあれば、平滑化処理を行う。平滑化処理とは、パラメータのベクトルの中に確率「０」の次元が存在する場合に、この確率を「０」以外の値に修正する手法である。これは、ゼロ頻度問題と呼ばれる、学習データ中に現れずに出現確率が「０」となっていたものが認識対象中に現れた場合に、うまく認識できなくなるという問題への対策となる。この平滑化処理の手法として、加算スムージングやKneser-neyスムージングなどの手法があるが、もちろん、これらの手法に限るものではない。
【００７３】
また、確率モデルを生成した後、ラベル付けはされていないが、ＲＯＰコードが含まれていることが分かっている悪性文書ファイルがあるとき、これを再学習することによって確率モデルを洗練できる場合がある。
【００７４】
例えば、学習部１２３は、採用している確率モデルが隠れマルコフモデルの場合は、Baum-Welchアルゴリズムなどを用いてモデルを再学習してもよい。なお、系列ラベリングを実現する学習手法としては、隠れマルコフモデル、条件付き確率場、構造化サポートベクターマシンなどがあるが、もちろん、これらの手法に限るものではない。
【００７５】
なお、３２ｂｉｔ環境下での確率モデルの生成について説明したが、もちろん、６４ｂｉｔ環境下においても、確率モデルを生成することが可能である。図９は、６４ｂｉｔ環境に対応させたラベルの遷移の例を示す図である。６４ｂｉｔ環境では、レジスタ幅が８バイトとなるため、ＲＯＰアドレス及び定数も８バイトとなる。
【００７６】
したがって、確率モデルもそれに合わせて変更し、潜在変数（ラベル）が増えるとともに、４バイトごとに遷移していたＲＯＰアドレス部分と定数部分が、８バイトごとの遷移となっている。具体的には、図９に示すように、潜在変数のうち、ＲＯＰアドレスラベル及びＲＯＰ定数ラベルは８まで増える。なお、６４ｂｉｔ環境の場合も、アドレスラベル（ＲＯＰアドレス１〜８ラベル）や定数ラベル（ＲＯＰ定数１〜８ラベル）は、８バイト分のleft-to-rightの一方通行の形になり（例えば、矢印Ｒ３，Ｒ４参照）、文書ラベルからは、文書ラベル、アドレスラベル、または、ジャンクラベルにのみ遷移する（図９の矢印Ｙ１’〜Ｙ３’参照）。
【００７７】
もちろん、上述した３２ｂｉｔ、６４ｂｉｔ環境の例に限るものではなく、他の環境においても、該環境に応じて、ＲＯＰアドレス及び定数の潜在変数（ラベル）の数と遷移の連続数とを変化させることで、確率モデルの生成が可能である。
【００７８】
以上に説明した処理を行うことによって、学習部１２３は、観測変数の出力確率、潜在変数間の遷移確率、潜在系列の初期状態確率をモデルパラメータとして持つ確率モデルを生成する。
【００７９】
［確率モデルを生成するまでの流れ］
次に、攻撃コード検知装置１０が確率モデルを生成するまでの流れについて説明する。図１０は、図１に示す攻撃コード検知装置１０が確率モデルを生成するまでの処理手順を示すフローチャートである。
【００８０】
図１０に示すように、制御部１２は、まず、確率モデルＤＢ２０を確認し、各ファイル形式に対応する確率モデルのモデルパラメータが格納されているか否かを判断する（ステップＳ１１）。制御部１２は、各ファイル形式に対応する確率モデルのモデルパラメータが格納されていると判断した場合には（ステップＳ１１：Ｙｅｓ）、確率モデルのモデルパラメータの生成を終了する。
【００８１】
これに対し、制御部１２は、各ファイル形式に対応する確率モデルのモデルパラメータが格納されていないと判断した場合には（ステップＳ１１：Ｎｏ）、ラベル付き悪性文書ファイル１００を入力データとして（ステップＳ１２）、学習を開始する。この入力されたラベル付き悪性文書ファイル１００に対し、まず、ファイル形式判定部１２１が、ヘッダやファイル構造の特徴から、ファイルの形式を判定する（ステップＳ１３）。ここで、ファイルの形式としては、例えば、ＤＯＣ、ＸＬＳ、ＰＰＴ、ＲＴＦ、ＰＤＦ等を想定している。
【００８２】
続いて、デコード部１２２は、入力されたラベル付き悪性文書ファイル１００に、エンコードされた領域が存在するか否かを判断する（ステップＳ１４）。デコード部１２２は、入力されたラベル付き悪性文書ファイル１００にエンコードされた領域が存在すると判断した場合には（ステップＳ１４：Ｙｅｓ）、エンコード方法を検出して、対応するデコードを実施する（ステップＳ１５）。このエンコード方法の検出としては、既知のエンコード方法のパターンマッチングを用いる。
【００８３】
そして、入力されたラベル付き悪性文書ファイル１００にエンコードされた領域が存在しないとデコード部１２２が判断した場合（ステップＳ１４：Ｎｏ）、または、ステップＳ１５終了後、学習部１２３は、この既知のラベル付き悪性文書ファイル１００とそのファイル形式とから、ファイル形式に対応する確率モデルを生成する確率モデル生成処理を実行する（ステップＳ１６）。
【００８４】
学習部１２３は、生成した確率モデルを、モデルパラメータの形で、確率モデルＤＢ２０に格納して（ステップＳ１７）、処理を終了する。なお、本実施例では文書ファイルを対象としたROPコードの検知、悪性判定について記述しているが、これに限らず、任意のデータ系列に対して同様の手法を適用することができる。
【００８５】
［確率モデル生成処理の流れ］
次に、図１０に示す確率モデル生成処理の流れについて説明する。図１１は、図１０に示す確率モデル生成処理（ステップＳ１６）の処理手順を示すフローチャートである。
【００８６】
図１１に示すように、学習部１２３は、ラベル付き悪性文書ファイル１００を入力されると（ステップＳ２１）、このラベル付き悪性文書ファイル１００から、ＲＯＰコード部分及びその前後の部分のデータ系列を用いて学習を行う。
【００８７】
まず、学習部１２３は、潜在変数の初期状態確率を、文書ラベルに対応する潜在変数から始まる確率（π文書）を１、それ以外のラベルに対応する潜在変数から始まる確率（例えば、πＲＯＰ（アドレス１））を０として設定する（ステップＳ２２）。学習部１２３は、初期状態確率として、文書ラベルには「１」が対応付けられ、文書以外のラベルには「０」が対応付けられた表Ｔ１（図６参照）を、この潜在系列の初期状態確率を示すモデルパラメータとして生成する。
【００８８】
次に、学習部１２３は、全ての潜在変数（ラベル）ｌｉに対して、そのラベルが観測変数（バイト）を出力する確率を計算するために、まず、演算対象であるｌｉのｉを１とし、Ｌの１番目のラベルとする（ステップＳ２３）。続いて、このラベルｌｉにおける観測変数（バイト）「0x00」から「0xFF」の出力確率Ｐ（ｏｔ＝0x00｜ｓｔ＝ｌｉ）〜Ｐ（ｏｔ＝0xFF｜ｓｔ＝ｌｉ）を計算する（ステップＳ２４）。ここで、ｏｔおよびｓｔは、長さＴの観測系列（バイト列）Ｏ＝ｏ１，ｏ２，・・・，ｏＴおよび対応する潜在系列（ラベル列）Ｓ＝ｓ１，ｓ２，・・・，ｓＴにおける時刻ｔの変数である。この計算は、上述したように、例えば、ラベルｌｉがバイト値「0x00」を出力する確率は、「ラベルｌｉの付いている0x00の値を持つバイト数」を「ラベルｌｉの付いている全バイト数」で除することによって計算する。学習部１２３は、この計算を、ラベルｌｉについて、バイト値「0x00」からバイト値「0xFF」ごとに、それぞれ計算して、ラベルｌｉが、各バイト値「0x00」からバイト値「0xFF」をそれぞれ出力する確率を求める。
【００８９】
学習部１２３は、全てのラベルについて観測変数（バイト）の出力確率Ｐ（ｏｔ＝0x00｜ｓｔ＝ｌｉ）〜Ｐ（ｏｔ＝0xFF｜ｓｔ＝ｌｉ）を計算したか否かを判断する（ステップＳ２５）。学習部１２３は、全てのラベルについて観測変数（バイト）「0x00」から「0xFF」の出力確率Ｐ（ｏｔ＝0x00｜ｓｔ＝ｌｉ）〜Ｐ（ｏｔ＝0xFF｜ｓｔ＝ｌｉ）を計算していないと判断した場合には（ステップＳ２５：Ｎｏ）、ｉに１を加算して計算対象のｌｉを次のラベルとし（ステップＳ２６）、ステップＳ２４に戻り、このラベルについて観測変数（バイト）の出力確率Ｐ（ｏｔ＝0x00｜ｓｔ＝ｌｉ）〜Ｐ（ｏｔ＝0xFF｜ｓｔ＝ｌｉ）を計算する。
【００９０】
一方、学習部１２３は、全てのラベルについて観測変数（バイト）の出力確率Ｐ（ｏｔ＝0x00｜ｓｔ＝ｌｉ）〜Ｐ（ｏｔ＝0xFF｜ｓｔ＝ｌｉ）を計算したと判断した場合には（ステップＳ２５：Ｙｅｓ）、この計算によって、潜在変数（ラベル）ごとに、観測系列（バイト列）のそれぞれの観測変数（バイト）の出力確率を対応付けた表Ｔ２（図７参照）を、観測変数の出力確率を示すモデルパラメータとして生成することができる。
【００９１】
続いて、学習部１２３は、全てのあり得る潜在変数（ラベル）の組ｌｉ，ｌｊについて、潜在変数間（ｌｉ→ｌｊ）の遷移確率（Ｐ（ｓｔ＋１＝ｌｊ｜ｓｔ＝ｌｉ））を計算する（ステップＳ２７）。なお、ｌｉは、遷移元のラベルを示し、ｌｊは、遷移先のラベルを示す。
【００９２】
このステップＳ２７における計算は、上述したように、潜在変数間の遷移回数を集計することで計算する。例えば、ＲＯＰ（アドレス４）ラベルからＲＯＰ（ジャンク）ラベルへの遷移確率は、「ＲＯＰ（アドレス４）ラベルからＲＯＰ（ジャンク）ラベルへの遷移回数」を「ＲＯＰ（アドレス４）ラベルからの全ての遷移回数」で除することによって計算することができる。この計算を、全てのあり得る潜在変数の組について計算する。学習部１２３は、この計算によって、潜在変数の組み合わせ（遷移元のラベルと遷移先のラベルとの組み合わせ）ごとに、遷移する確率を対応付けた表Ｔ３（図８参照）を、潜在変数間の遷移確率を示すモデルパラメータとして生成することができる。
【００９３】
そして、学習部１２３は、ＲＯＰコードのアドレス部分の構成に用いられるＤＬＬ等のファイルが判明しているか否かを判断する（ステップＳ２８）。学習部１２３は、ＲＯＰコードのアドレス部分の構成に用いられるファイルが判明している場合には（ステップＳ２８：Ｙｅｓ）、そのファイル中のＲＯＰガジェット候補のアドレスを基に再学習する(ステップＳ２９)。
【００９４】
続いて、学習部１２３は、ＲＯＰコードのアドレス部分の構成に用いられるファイルが判明していない場合（ステップＳ２８：Ｎｏ）、または、ステップＳ２９処理後、遷移確率、出力確率の中に、値が「０」となるものが現れたゼロ頻度問題が発生しているか否かを判断する（ステップＳ３０）。学習部１２３は、ゼロ頻度問題が発生していると判断した場合には（ステップＳ３０：Ｙｅｓ）、平滑化処理を行う（ステップＳ３１）。
【００９５】
そして、学習部１２３は、ゼロ頻度問題が発生していないと判断した場合には（ステップＳ３０：Ｎｏ）、または、ステップＳ３１の平滑化処理終了後、生成した確率モデルのモデルパラメータを確率モデルＤＢ２０に格納して（ステップＳ３２）、確率モデル生成処理を終了する。
【００９６】
以上に説明した処理を行うことによって、学習部１２３は、潜在変数であるラベルごとに、観測変数である各バイトの出力確率を対応付けた観測変数（バイト）の出力確率と、潜在変数ごとに、遷移可能である潜在変数への遷移確率が対応付けられた潜在変数間の遷移確率と、潜在系列の初期状態確率と、をモデルパラメータとして有する確率モデルを生成する。後述する検知部１２４は、この確率モデルを用いて、検査対象未知文書ファイル２００のバイト列に対し、最も尤もらしいラベルの組み合わせを有するラベル列を付与し、検査対象未知文書ファイル２００におけるＲＯＰコードの有無を検知している。
【００９７】
［検知部の処理］
そこで、次に、検知部１２４の検知処理を説明する。検知部１２４は、学習部１２３が生成した確率モデルを用いて、検査対象未知文書ファイル２００のバイト列に対し、最も尤もらしいラベルの組み合わせを確率的に求めて付与する。言い換えると、検知部１２４は、検査対象未知文書ファイル２００のバイト列に対し、最も尤もらしいラベル列をラベリングする。検知部１２４は、このラベル列の中にＲＯＰコードの構成要素を示すラベルが含まれている場合に、この部分をＲＯＰコードとして検知する。
【００９８】
具体的には、まず、検知部１２４は、ファイル形式判定部１２１が判定したファイル形式に対応する確率モデルのモデルパラメータをθとし、該モデルパラメータθに対応する確率モデルを確率モデルＤＢ２０から取得する。
【００９９】
そして、検知部１２４は、検査対象ファイルのバイト列を、観測系列Ｏとして抽出する。続いて、検知部１２４は、Ｔを観測系列Ｏの長さとして、潜在系列（ラベル列）をＳ＝ｓ１，ｓ２，・・・，ｓＴとし、観測系列（バイト列）をＯ＝ｏ１，ｏ２，・・・，ｏＴとし、確率モデルのモデルパラメータをθとする。そして、検知部１２４は、確率モデルに基づいて、観測系列（バイト列）の長さに対して、取り得る全ての組み合わせの潜在系列（ラベル列）を想定する。なお、ｓ１，ｓ２，・・・，ｓＴは、それぞれ潜在系列をなす潜在変数（ラベル）であるため、ｓ１，ｓ２，・・・，ｓＴ∈Ｌであり、ｏ１，ｏ２，・・・，ｏＴは、それぞれ観測系列をなす観測変数（バイト）であるため、ｏ１，ｏ２，・・・，ｏＴ∈Ｘである。
【０１００】
まず、検知部１２４が想定する、バイト列の長さに対して取り得る全てのラベル列の組み合わせについて説明する。図１２は、検知部１２４が想定する全てのラベル列の組み合わせを説明するための図である。図１２に示す表Ｔ４には、時刻ｔ（１，２，３，・・・，Ｔ）に、観測系列（バイト列）Ｏ（ｏ１，ｏ２，・・・，ｏＴ）が対応付けられている。さらに、表Ｔ４には、バイト列Ｏ（ｏ１，ｏ２，・・・，ｏＴ）について、取り得る全ての潜在系列（ラベル列）Ｓ（ｓ１，ｓ２，・・・，ｓＴ）の各組み合わせが対応付けられている。
【０１０１】
例えば、ラベル列（ｓ１，ｓ２，・・・，ｓＴ）の組み合わせとして、ラベル列（ｓ１，ｓ２，・・・，ｓＴ）欄の最も左側の列に示すように、全てのバイト値に対して「文書」ラベルが対応付けられる組み合わせ「１」がある。また、その右側の列に示すように、バイト（ｏ１）に「文書」ラベル、バイト（ｏ２）に「文書」ラベル、バイト（ｏ３）に「ＲＯＰ（アドレス１）」ラベル、バイト（ｏ４）（不図示）〜（ｏＴ）にはそれぞれ「文書」ラベルが対応付けられた組み合わせ「２」がある。表Ｔ４では、バイト列Ｏ（ｏ１，ｏ２，・・・，ｏＴ）について、このようなラベル列Ｓ（ｓ１，ｓ２，・・・，ｓＴ）の組み合わせが「Ｋ」通りあることが示されている。
【０１０２】
検知部１２４は、この「Ｋ」通りのラベル列の組み合わせを、観測変数の出力確率、潜在変数間の遷移確率及び潜在系列の初期状態確率を参照することによって想定する。このように、検知部１２４は、確率モデルに基づいて、バイト列の長さに対して、取り得る全てのラベルの組み合わせを求めた後、これらの各組み合わせの潜在系列（ラベル列）がバイト列を出力する確率Ｐ（Ｓ，Ｏ；θ）を、モデルパラメータθに基づいて計算する。
【０１０３】
具体的には、検知部１２４は、まず、組み合わせ「１」のラベル列について、このラベル列のそれぞれのラベル（全て「文書」ラベル）から、各ラベルに対応するバイト列のバイト値（「0x30」，「0x00」，「0x00」，・・・・，「0xff」）を出力する確率Ｐ（Ｓ，Ｏ；θ）をバイト値ごとにそれぞれ計算する。続いて、検知部１２４は、次の組み合わせ「２」について、ラベル列のそれぞれのラベル（「文書」,「文書」，「ＲＯＰ（アドレス１）」，・・・，「文書」）から、各ラベルに対応するバイト列のバイト値（「0x30」，「0x00」，「0x00」，・・・・，「0xff」）を出力する確率Ｐ（Ｓ，Ｏ；θ）をバイト値ごとにそれぞれ演算する。この計算を、組み合わせ「Ｋ」についてまで実行する。なお、Ｐ（Ｓ，Ｏ；θ）は、観測系列の長さをＴ、潜在系列の初期状態がｋである確率をπｋ、潜在変数（ラベル）ｌｉからｌｊに遷移する確率をａｉ，ｊ、潜在変数（ラベル）ｌｊが観測変数（バイト）ｘｋを出力する確率をｂｊ，ｋとしたとき、以下の（１）式によって求められる。
【０１０４】
【数１】
2017146094.tif 000003
【０１０５】
そして、検知部１２４は、この確率に対する計算結果を基に、各組み合わせの中から、確率が最も高くなる組み合わせのラベル列を選択し、検査対象ファイルのバイト列に付与する。図１３は、検知部１２４が、検査対象ファイルのバイト列に付与するラベル列の例を説明するための図である。ここで、例えば、図１２の表Ｔ４のうち、組み合わせ「ｋ」のラベル列が、確率が最大となる組み合わせのラベル列である場合には、検知部１２４は、図１３の表Ｔ５に示すように、観測系列（バイト列）Ｏに対し、組み合わせ「ｋ」のラベル列を、バイト列Ｏに対応付ける遷移系列（ラベル列）Ｓ＊として対応付ける。
【０１０６】
このように、検知部１２４は、確率モデルを基に、検査対象未知文書ファイル２００のデータ系列のバイト列Ｏに、該バイト列を出力する確率が最も高いラベルの組み合わせを有するラベル列Ｓ*を付与する。言い換えると、検知部１２４は、確率モデルを用いて、確率モデルを基に、バイト列Ｏに対し、取り得る全てのラベルの組み合わせを求め、該求めたラベルの組み合わせのうち、最も尤もらしいラベルの組み合わせを有するラベル列Ｓ*を確率的に求め付与する。
【０１０７】
そして、検知部１２４は、この検査対象の文書ファイルのバイト列Ｏに付与されたラベル列Ｓ*の中に、ＲＯＰコードの構成要素を示すラベルがあれば、この部分をＲＯＰコード部分として検知する。
【０１０８】
以上に説明した処理を行うことによって、検知部１２４は、検査対象のデータ系列に含まれるＲＯＰコード部分の有無を検知する。悪性判定部１２５は、検知部１２４の検知したＲＯＰコード部分の有無に応じて、検査対象のデータ系列がＲＯＰにより攻撃を実行する悪性なデータ系列であるか否かを判定する。
【０１０９】
なお、系列の長さが長くなればなるほど、全ての取り得るラベルの組み合わせのラベル列Ｓに対して、確率Ｐ（Ｓ，Ｏ；θ）を計算することは、計算量の増加のために難しくなる。このような場合に、動的計画法に基づいて、計算量を削減できる場合がある。例えば、隠れマルコフモデルや条件付き確率場であれば、ビタビアルゴリズムを利用できるため、このような手法を用いてＳ＊を求めてもよい。
【０１１０】
［検査対象の未知文書ファイルの判定までの流れ］
次に、攻撃コード検知装置１０による検査対象未知文書ファイル２００に対する判定の流れを説明する。図１４は、図１に示す攻撃コード検知装置１０が検査対象未知文書ファイル２００を判定するまでの処理手順を示すフローチャートである。
【０１１１】
図１４に示すように、攻撃コード検知装置１０は、検査対象未知文書ファイル２００を入力データとして取得する（ステップＳ４１）。そして、この入力された検査対象未知文書ファイル２００に対し、図１０に示すステップＳ１２〜ステップＳ１３と同様に、ファイル形式判定部１２１がファイルの形式を判定し（ステップＳ４２）、エンコードされた領域が存在する場合には(ステップＳ４３：Ｙｅｓ)、デコード部１２２がデコードを実施する（ステップＳ４４）。
【０１１２】
そして、エンコードされた領域が存在しない場合(ステップＳ４３：Ｎｏ)、または、ステップＳ４４のデコード終了後、制御部１２は、確率モデルＤＢ２０から、検査対象未知文書ファイル２００のファイル形式に対応したモデルパラメータを取り出す（ステップＳ４５）。そして、検知部１２４は、このモデルパラメータ（確率モデル）を用いて、検査対象未知文書ファイル２００におけるＲＯＰコードの有無を検知する検知処理を行う（ステップＳ４６）。この検知部１２４におけるＲＯＰコードの検知結果は、悪性判定部１２５に出力される。
【０１１３】
続いて、悪性判定部１２５は、検知部１２４の検知結果を基に、検査対象未知文書ファイル２００内にＲＯＰコードが存在するか否かを判定する（ステップＳ４７）。悪性判定部１２５は、検査対象未知文書ファイル２００内にＲＯＰコードが存在すると判定した場合には（ステップＳ４７：Ｙｅｓ）、この検査対象未知文書ファイル２００を悪性文書ファイルと判定する（ステップＳ４８）。これに対し、悪性判定部１２５は、検査対象未知文書ファイル２００内にＲＯＰコードが存在しないと判定した場合には（ステップＳ４７：Ｎｏ）、検査対象未知文書ファイル２００が、ＲＯＰコードによる攻撃は行われないと判定し（ステップＳ４９）、制御部１２は、この検査対象未知文書ファイル２００について、ビューアアプリケーション等のアプリケーションを実行可能とする。
【０１１４】
［検知処理の流れ］
次に、図１４に示す検知処理の流れについて説明する。図１５は、図１４に示す検知処理の処理手順を示すフローチャートである。
【０１１５】
図１５に示すように、検知部１２４は、入力された検査対象未知文書ファイル２００のバイト列を、観測系列Ｏとして抽出する（ステップＳ５１）。そして、検知部１２４は、観測系列（バイト列）Ｏの長さＴに対して、取り得る全てのラベルの組み合わせである潜在系列（ラベル列）Ｓ（ｓ１，ｓ２，・・・，ｓＴ）のうち、最初の演算対象となるラベルの組み合わせ（潜在系列；ラベル列）Ｓを設定する（ステップＳ５２）。例えば、図１２のラベルの組み合わせ「１」を最初の演算対象として設定する。
【０１１６】
そして、検知部１２４は、観測変数の出力確率、潜在変数間の遷移確率及び潜在系列の初期状態確率を参照することによって、演算対象となるラベル列Ｓが観測系列Ｏを出力する確率Ｐ（Ｓ，Ｏ；θ）を、モデルパラメータθに基づいて計算する（ステップＳ５３）。
【０１１７】
続いて、検知部１２４は、演算対象となる次のラベルの組み合わせ（ラベル列）Ｓがあるか否かを判断する（ステップＳ５４）。検知部１２４は、演算対象となる次のラベルの組み合わせ（ラベル列）Ｓがあると判断した場合には（ステップＳ５４：Ｙｅｓ）、演算対象として、次の組み合わせのラベル列Ｓを設定し（ステップＳ５５）、ステップＳ５３において、この組み合わせのラベル列に対しても、確率Ｐ（Ｓ，Ｏ；θ）を計算する。
【０１１８】
これに対し、検知部１２４は、演算対象となる次の組み合わせのラベル列Ｓがないと判断した場合（ステップＳ５４：Ｎｏ）、取り得る全ての組み合わせのラベル列についての計算が終了したと判断し、この確率に対する計算結果を基に、各組み合わせの中から、最も高い確率を示す組み合わせのラベル列を、バイト列Ｏに対応付けるラベル列Ｓ＊と選択する（ステップＳ５６）。言い換えると、検知部１２４は、検査対象未知文書ファイル２００のバイト列Ｏに対して、最も尤もらしい組み合わせのラベル列を検査対象ファイルのバイト列に付与する。
【０１１９】
そして、検知部１２４は、検査対象未知文書ファイル２００のバイト列Ｏに付与したラベル列Ｓ＊の中にＲＯＰコードを示すラベルがあるか否かを判断する（ステップＳ５７）。検知部１２４は、ＲＯＰコードを示すラベルがあると判断した場合（ステップＳ５７：Ｙｅｓ）、この検査対象未知文書ファイル２００は、ＲＯＰコードを含むファイルであると検知する（ステップＳ５８）。一方、検知部１２４は、ＲＯＰコードを示すラベルがないと判断した場合（ステップＳ５７：Ｎｏ）、この検査対象未知文書ファイル２００は、ＲＯＰコードを含まないファイルであると検知する（ステップＳ５９）。
【０１２０】
検知部１２４は、この検査対象未知文書ファイル２００に対する検知結果を、悪性判定部１２５に出力して（ステップＳ６０）、検知処理を終了する。
【０１２１】
［第１の実施の形態の効果］
以上のように、本実施の形態１においては、事前に、文書ファイルの構成要素であるバイト列の特徴と、ＲＯＰコードの構成要素であるバイト列の特徴と、を学習した確率モデルを生成する。そして、実施の形態１においては、生成した確率モデルを基に、検査対象の未知の文書ファイルを構成するバイト列に対して、文書ファイルの構成要素であるか、ＲＯＰコードの構成要素であるかのラベリングを行っている。したがって、本実施の形態１によれば、検査対象の未知の文書ファイルをビューアアプリケーション等のアプリケーションで開くことなく、該文書ファイルの構成要素を推定することができるため、ＲＯＰコードの検知および抽出、文書ファイルの悪性判定を、ヒューリスティック手法で高速に実現することができる。
【０１２２】
また、本実施の形態１では、実際の環境下に合わせて、アドレスや定数を分割し、分割したバイト単位で、バイト列（観測系列）の出力確率をモデルパラメータとして求めるとともに、実際の環境下に合わせて、潜在変数（ラベル）の数や潜在変数の遷移状態を考慮して、遷移系列の遷移確率、及び、潜在系列の初期状態確率をモデルパラメータとして生成している。このため、実施の形態１によれば、実際の環境下に対応させながら、ＲＯＰコードの遷移状態を含めたモデルパラメータを用いて検知を行うことができるため、高精度なＲＯＰコードの検知を実現できる。
【０１２３】
このように、本実施の形態１によれば、アプリケーションプログラムの実行を伴わない静的な手法によってＲＯＰコードの特徴を捉えることができるため、高速で高精度な検知を実現でき、さらに、頑強なヒューリスティック手法を用いて検知を行っているため、攻撃者による検知の回避を防ぐことが可能である。
【０１２４】
上述したように、本実施の形態１は、文書ファイル中に含まれるＲＯＰコードの検出に有用であり、多数の文書ファイルに対して高速に検査を実施することに適している。このため、本実施の形態１に係る攻撃検知装置１０、攻撃コード検知方法及び攻撃コード検知プログラムを、ネットワーク監視装置と共にネットワークに導入することによって、ネットワークを通過する多数の文書ファイルがＲＯＰコードを含む悪性なものであるかどうかの検査を行うことが可能である。
【０１２５】
また、本実施の形態１では、文書ファイルに埋め込まれたＲＯＰコードを前提としているが、文書ファイルでないデータであっても、そのバイト列の分布に何らかの傾向があるものであれば、同様にＲＯＰコードを検出可能である。したがって、本実施の形態１は、例えば、通信データ中のＲＯＰコードの検出にも利用できる。具体的には、本実施の形態１は、画像ファイル、動画ファイル、実行ファイル等、いずれのファイルに適用可能である。
【０１２６】
［他の実施の形態］
［システム構成等］
図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部又は一部を、各種の負荷や使用状況等に応じて、任意の単位で機能的又は物理的に分散・統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部又は任意の一部が、ＣＰＵ及び当該ＣＰＵにて解析実行されるプログラムにて実現され、或いは、ワイヤードロジックによるハードウェアとして実現され得る。
【０１２７】
また、本実施形態において説明した各処理のうち、自動的に行われるものとして説明した処理の全部又は一部を手動的におこなうこともでき、或いは、手動的におこなわれるものとして説明した処理の全部又は一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【０１２８】
［プログラム］
図１６は、プログラムが実行されることにより、攻撃コード検知装置１０が実現されるコンピュータの一例を示す図である。コンピュータ１０００は、例えば、メモリ１０１０、ＣＰＵ１０２０を有する。また、コンピュータ１０００は、ハードディスクドライブインタフェース１０３０、ディスクドライブインタフェース１０４０、シリアルポートインタフェース１０５０、ビデオアダプタ１０６０、ネットワークインタフェース１０７０を有する。これらの各部は、バス１０８０によって接続される。
【０１２９】
メモリ１０１０は、ＲＯＭ（Read  Only  Memory）１０１１及びＲＡＭ１０１２を含む。ＲＯＭ１０１１は、例えば、ＢＩＯＳ（Basic  Input  Output  System）等のブートプログラムを記憶する。ハードディスクドライブインタフェース１０３０は、ハードディスクドライブ１０９０に接続される。ディスクドライブインタフェース１０４０は、ディスクドライブ１１００に接続される。例えば磁気ディスクや光ディスク等の着脱可能な記憶媒体が、ディスクドライブ１１００に挿入される。シリアルポートインタフェース１０５０は、例えばマウス１１１０、キーボード１１２０に接続される。ビデオアダプタ１０６０は、例えばディスプレイ１１３０に接続される。
【０１３０】
ハードディスクドライブ１０９０は、例えば、ＯＳ１０９１、アプリケーションプログラム１０９２、プログラムモジュール１０９３、プログラムデータ１０９４を記憶する。すなわち、攻撃コード検知装置１０の各処理を規定するプログラムは、コンピュータ１０００により実行可能なコードが記述されたプログラムモジュール１０９３として実装される。プログラムモジュール１０９３は、例えばハードディスクドライブ１０９０に記憶される。例えば、攻撃コード検知装置１０における機能構成と同様の処理を実行するためのプログラムモジュール１０９３が、ハードディスクドライブ１０９０に記憶される。なお、ハードディスクドライブ１０９０は、ＳＳＤ（Solid  State  Drive）により代替されてもよい。
【０１３１】
また、上述した実施形態の処理で用いられる設定データは、プログラムデータ１０９４として、例えばメモリ１０１０やハードディスクドライブ１０９０に記憶される。そして、ＣＰＵ１０２０が、メモリ１０１０やハードディスクドライブ１０９０に記憶されたプログラムモジュール１０９３やプログラムデータ１０９４を必要に応じてＲＡＭ１０１２に読み出して実行する。
【０１３２】
なお、プログラムモジュール１０９３やプログラムデータ１０９４は、ハードディスクドライブ１０９０に記憶される場合に限らず、例えば着脱可能な記憶媒体に記憶され、ディスクドライブ１１００等を介してＣＰＵ１０２０によって読み出されてもよい。或いは、プログラムモジュール１０９３及びプログラムデータ１０９４は、ネットワーク（ＬＡＮ、ＷＡＮ等）を介して接続された他のコンピュータに記憶されてもよい。そして、プログラムモジュール１０９３及びプログラムデータ１０９４は、他のコンピュータから、ネットワークインタフェース１０７０を介してＣＰＵ１０２０によって読み出されてもよい。
【０１３３】
以上、本発明者によってなされた発明を適用した実施形態について説明したが、本実施形態による本発明の開示の一部をなす記述及び図面により本発明は限定されることはない。すなわち、本実施形態に基づいて当業者等によりなされる他の実施形態、実施例及び運用技術等は全て本発明の範疇に含まれる。
【符号の説明】
【０１３４】
１０  攻撃コード検知装置
１１  入力部
１２  制御部
１３  出力部
１４  記憶部
２０  確率モデルデータベース（ＤＢ）
１００  ラベル付き悪性文書ファイル
１２１  ファイル形式判定部
１２２  デコード部
１２３  学習部
１２４  検知部
１２５  悪性判定部
２００  検査対象未知文書ファイル
【図１】
2017146094.tif 000004
【図２】
2017146094.tif 000005
【図３】
2017146094.tif 000006
【図４】
2017146094.tif 000007
【図５】
2017146094.tif 000008
【図６】
2017146094.tif 000009
【図７】
2017146094.tif 000010
【図８】
2017146094.tif 000011
【図９】
2017146094.tif 000012
【図１０】
2017146094.tif 000013
【図１１】
2017146094.tif 000014
【図１２】
2017146094.tif 000015
【図１３】
2017146094.tif 000016
【図１４】
2017146094.tif 000017
【図１５】
2017146094.tif 000018
【図１６】
2017146094.tif 000019
【国際調査報告】
2017146094.tif 000020
2017146094.tif 000021
2017146094.tif 000022