(57)【特許請求の範囲】
【請求項１】
入力データから攻撃コードを検出する攻撃コード検出装置であって、
前記入力データの中から、所定のデータ長の部分データ列を複数取り出す取得手段と、
前記複数の部分データ列について、各部分データ列の数値が所定の範囲に集中する度合を評価する評価手段と、
前記評価手段による評価結果に基づいて、前記入力データにおける前記攻撃コードの検出結果を出力する出力手段と
を備えることを特徴とする攻撃コード検出装置。
【請求項２】
前記評価手段は、前記複数の部分データ列について、特定の数値に該当する部分データ列が存在するか否かについて更に評価を行う
ことを特徴とする請求項１に記載の攻撃コード検出装置。
【請求項３】
前記特定の数値は、メモリにおけるコードの実行権を制御する所定の関数の引数である
ことを特徴とする請求項２に記載の攻撃コード検出装置。
【請求項４】
前記評価手段は、前記各部分データ列の数値が所定の範囲に集中する度合の評価として、部分データ列間の差分の大きさが所定の閾値よりも小さいか否かの評価を行う
ことを特徴とする請求項１ないし３のうちいずれか１項に記載の攻撃コード検出装置。
【請求項５】
前記評価手段は、前記取得手段により取得される部分データ列が、コンピュータのメモリ空間におけるユーザ領域外のアドレスを示す場合に、当該部分データ列を前記評価の対象外とする
ことを特徴とする請求項１ないし４のうちいずれか１項に記載の攻撃コード検出装置。
【請求項６】
前記攻撃コードはＲＯＰコードであることを特徴とする請求項１ないし５のうちいずれか１項に記載の攻撃コード検出装置。
【請求項７】
コンピュータを、請求項１ないし６のうちいずれか１項における攻撃コード検出装置における各手段として機能させるためのプログラム。
【請求項８】
入力データから攻撃コードを検出する攻撃コード検出装置が実行する攻撃コード検出方法であって、
前記攻撃コード検出装置が、前記入力データの中から、所定のデータ長の部分データ列を複数取り出す取得ステップと、
前記攻撃コード検出装置が、前記複数の部分データ列について、各部分データ列の数値が所定の範囲に集中する度合を評価する評価ステップと、
前記攻撃コード検出装置が、前記評価ステップによる評価結果に基づいて、前記入力データにおける前記攻撃コードの検出結果を出力する出力ステップと
を備えることを特徴とする攻撃コード検出方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータの脆弱性を狙った不正プログラムを検出する技術に関連するものである。
【背景技術】
【０００２】
コンピュータの脆弱性を狙った不正プログラムによる攻撃が重要な問題となっている。通常、そのような攻撃により、コンピュータシステムの脆弱性が明らかになると、脆弱性を無くすための脆弱性パッチがリリースされ、ユーザに配布される。しかし、脆弱性パッチがリリースされる前に、攻撃手法やツールが公になって、攻撃が行われるゼロデイ攻撃が後を絶たない。
【０００３】
上記の攻撃の特徴は、ＤＥＰ（Ｄａｔａ  Ｅｘｅｃｕｔｉｏｎ  Ｐｒｅｖｅｎｔｉｏｎ、データ実行防止）等のコンピュータ側の防御手法を回避するために、ＲＯＰ（Ｒｅｔｕｒｎ  Ｏｒｉｅｎｔｅｄ  Ｐｒｏｇｒａｍｍｉｎｇ）に代表されるコードリユースという攻撃手法が多く用いられることである。コードリユースを正確にとらえるためにはその性質上、コンピュータ側のメモリ状態を把握する必要がある。例えば、特許文献１には、ホストコンピュータ側でメモリ状態を把握して攻撃を回避する技術が開示されている。
【０００４】
また、昨今の標的型攻撃では、攻撃コードを埋め込んだ悪性文書ファイルを送付し、被害者がファイルを開くことでマルウェア感染等が引き起こされ、情報の搾取等がなされるケースが多い。このような悪性文書ファイルにも最新のものについてはＲＯＰ攻撃コードが含まれているケースが出てきている。例えば、特許文献２には、文書ファイルから悪意のあるシェルコード等を動的に検出する技術が記載されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１１−２５８０１９号公報
【特許文献２】特開２０１３−２３９１４９号公報
【非特許文献１】三村 守，田中 英彦 : Handy Scissors:悪性文書ファイルに埋め込まれた実行ファイルの自動抽出ツール，情報処理学会論文誌，Vol.54，No.3，pp.1211-1219(Mar. 2013)．
【非特許文献２】大坪 雄平，三村 守，田中 英彦 : ファイル構造検査による悪性 MS 文書ファイル検知手法の検知, 情報処理学会研究報告, Vol.2013-IOT-22, No.16 (2013).
【非特許文献３】Boldewin, F.: Analyzing MSOffice malware with OfficeMalScanner (2009), http://www.reconstructer.org/code.html
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかし、例えば特許文献２に記載されたような動的解析により攻撃コード（悪意のあるシェルコード等）を検出する手法は、攻撃コードにより試験環境が被害を受ける可能性があり危険であるとともに、エクスプロイトコード等を作動させるためにＯＳやアプリケーションのバージョン・パッチレベルを適切に合わせた特定の環境を整えなければならない等、解析に手間がかかるという問題がある。
【０００７】
本発明は上記の点に鑑みてなされたものであり、文書ファイル等の入力データ内の攻撃コードを静的解析により検出する技術を提供することを目的とする。
【課題を解決するための手段】
【０００８】
本発明の実施の形態によれば、入力データから攻撃コードを検出する攻撃コード検出装置であって、
前記入力データの中から、所定のデータ長の部分データ列を複数取り出す取得手段と、
前記複数の部分データ列について、各部分データ列の数値が所定の範囲に集中する度合を評価する評価手段と、
前記評価手段による評価結果に基づいて、前記入力データにおける前記攻撃コードの検出結果を出力する出力手段とを備える攻撃コード検出装置が提供される。
【０００９】
また、本発明の実施の形態によれば、入力データから攻撃コードを検出する攻撃コード検出装置が実行する攻撃コード検出方法であって、
前記攻撃コード検出装置が、前記入力データの中から、所定のデータ長の部分データ列を複数取り出す取得ステップと、
前記攻撃コード検出装置が、前記複数の部分データ列について、各部分データ列の数値が所定の範囲に集中する度合を評価する評価ステップと、
前記攻撃コード検出装置が、前記評価ステップによる評価結果に基づいて、前記入力データにおける前記攻撃コードの検出結果を出力する出力ステップと
を備えることを特徴とする攻撃コード検出方法が提供される。
【発明の効果】
【００１０】
文書ファイル等の入力データ内の攻撃コードを静的解析により検出する技術を提供できる。
【図面の簡単な説明】
【００１１】
【図１】悪性文書ファイルの動作を説明するための図である。
【図２】ＲＯＰコードを含む悪性文書ファイルの内容例を示す図である。
【図３】本発明の実施の形態に係る悪性文書ファイル検出装置１００の機能構成図である。
【図４】悪性文書ファイル内のＲＯＰコードを説明するための図である。
【図５】ＲＯＰコードの例を示す図である。
【図６】メモリ領域の例を示す図である。
【図７】攻撃コード判定部１０３における動作例を示すフローチャートである。
【図８】ダブルワード間の比較の例を示す図である。
【図９】疑似コード例１を示す図である。
【図１０】疑似コード例２を示す図である。
【発明を実施するための形態】
【００１２】
以下、図面を参照して本発明の実施の形態を説明する。なお、以下で説明する実施の形態は一例に過ぎず、本発明が適用される実施の形態は、以下の実施の形態に限られるわけではない。例えば、本実施の形態では、ＲＯＰコードの検知を例として説明しているが、本発明の適用先はこれに限らず、ＲＯＰコードと同様の特性を有する他の攻撃コードにも適用可能である。
【００１３】
（攻撃コードと防御メカニズム等について）
本発明の実施の形態では、文書ファイルからＲＯＰコードを静的に特定する技術が提供されるが、当該技術の理解を促進するために、まず、既存の攻撃コードと防御メカニズム、及びその回避手法等について説明する。
【００１４】
図１（ａ）は、コンピュータ上でユーザが通常の悪性文書ファイルを開いた場合における各コードの実行動作を示す図である。図１（ａ）に示すように、ユーザが悪性文書ファイルを開くと、まず、閲覧ソフトの脆弱性を攻撃するエクスプロイトコードが作動する。エクスプロイトコードは、閲覧ソフトの制御権をコントロールできるようにするまでの役割を担う。制御権が取られると、シェルコードが実行される。シェルコードは文書ファイル内に埋め込まれた実行ファイル（マルウェア）を取り出して実行する。マルウェアが実行されると、例えば、ユーザ情報の搾取等が行われる。
【００１５】
上記のような悪意のあるシェルコードの実行を防止する技術としてＤＥＰ（Ｄａｔａ  Ｅｘｅｃｕｔｉｏｎ  Ｐｒｅｖｅｎｔｉｏｎ）がある。エクスプロイトコードにより制御権を取られ配置されるシェルコードは、メモリ上のプログラム領域ではなく、スタックやヒープと呼ばれるデータ領域内に配置される。ＤＥＰは、このようなデータ領域内に配置されたコードの実行を防止する機能である。ＤＥＰは、メモリの特定の部分がデータの保持のみを目的にしていることをマークし、プロセッサがその領域を実行不可能であると認識することによって機能する。
【００１６】
ＲＯＰは、ＤＥＰを回避するための手法の一つである。ＲＯＰは、リターン（ｒｅｔ命令）で終わるコードの断片（ＲＯＰｇａｄｇｅｔと呼ばれる）をつなぎ合わせて、実行させたい処理を実現するものであり、スタックに実行したいコードのアドレスを積み上げておき、それに従って処理がジャンプしていくように調整することで、攻撃者が意図した様々なコード実行を可能とする。この場合、コードの実行は通常のコード領域で行われるため、ＤＥＰによる防御は働かない。
【００１７】
ただし、ＲＯＰのみで複雑な処理を行うことは困難であるため、ＲＯＰを利用して、データ領域の実行権を変更させる命令、つまり、ＤＥＰを解除する命令（例：ＶｉｒｔｕａｌＰｒｏｔｅｃｔ関数）を実行させることで、データ領域に配置されたシェルコードを実行可能にして、当該シェルコードを実行させる制御が行われる。
【００１８】
ＲＯＰを回避する手法としてはＡＳＬＲ（Ａｄｄｒｅｓｓ  Ｓｐａｃｅ  Ｌａｙｏｕｔ  Ｒａｎｄｏｍｉｚａｔｉｏｎ）がある。ＡＳＬＲは、アドレス空間をＯＳ起動時にランダム化するものであり、これにより、攻撃者がＡＰＩ関数やスタック・ヒープの固定的な既知アドレスを利用することに対抗し得る。
【００１９】
しかし、例えば当該ＯＳが３２ｂｉｔのＯＳである場合、攻撃者はランダム化されたアドレス空間をスキャンして必要なアドレスを見つけ出すことによって、現実時間・現実試行回数内でＡＳＬＲを回避可能である。また、ＤＬＬ（Ｄｙｎａｍｉｃ  Ｌｉｎｋ  Ｌｉｂｒａｒｙ）によっては、ランダム化が行われないものも存在し、これを悪用した手法が用いられている。また、ＡＳＬＲによるランダム化が行われる場合であっても、脆弱性を利用して特定のＤＬＬのベースアドレスを得ることで動的にＲＯＰコードを組み立てる手法も存在する。
【００２０】
図１（ｂ）は、ＤＥＰ等の防御メカニズムを回避するＲＯＰコードを含む悪性文書ファイルの動作例を説明するための図である。
【００２１】
図１（ｂ）は、ＲＯＰコード実行と復号コード実行を含む点が図１（ａ）と異なる。図１（ｂ）の場合、暗号化したシェルコードが用いられ、シェルコードは復号コードによって復号されてから実行される。また、復号コードを実行するためには、復号コードが配置されているメモリ領域に実行権限が必要なため、ＤＥＰ回避のためのＲＯＰコードが実行される。また、安定して攻撃を成功させるために、ＲＯＰコードに加えて（又はＲＯＰコードに代えて）、ＳＥＨ（Ｓｔｒｕｃｔｕｒｅｄ  Ｅｘｃｅｐｔｉｏｎ  Ｈａｎｄｌｉｎｇ）コードが実行される場合が多い。
【００２２】
（本実施の形態における検出対象コードについて）
図２に、ＲＯＰコード等の悪性コードを含む悪性文書ファイルの内容例を示す。図２に示す悪性文書ファイル内のＲＯＰ（ＳＥＨ含む）コード部は、前記のようにＤＥＰ回避や安定動作を目的とし、後続する復号コード部の外に配置され、復号コードの実行権を付与する。ＲＯＰコードは復号コード部の外に配置されることから暗号化されない。ただし、ＲＯＰコードは１００Ｂｙｔｅ程度、ＳＥＨコードは１０Ｂｙｔｅ程度であり、ＳＥＨコードについては短いため特徴を捕らえるのは困難と考えられることから、本実施の形態では、静的解析によりＲＯＰコードの特徴を捕らえることで、文書ファイルにおけるＲＯＰコードの有無を判定し、文書ファイルが悪性文書ファイルであるか否かを判定することとしている。このように、ＲＯＰコードは復号コード内に含めることはできず平文で現れることから、静的解析で高速に検出することが可能である。
【００２３】
文書ファイルを悪性文書ファイルであると特定するためには、文書ファイルにおけるいずれかの悪性コードを検出できればよいが、以下で説明する観点から、本実施の形態では、悪性文書ファイルに含まれる各種の悪性コードのうち、ＲＯＰコードを検出対象としている。
【００２４】
エクスプロイトコード部は、脆弱性を発動させるためのコードであるため、特徴が現れやすく意図的な暗号化は難しいため特定がしやすいが、ゼロデイのように未知の脆弱性の場合は特定ができない。また、復号コード部は、暗号化シェルコードを復号する目的で数１０Ｂｙｔｅ程度からなり、ＸＯＲ等の論理演算を用いる単純な物が多く、正常なコードと区別が困難である。ポリモーフィックコードを生成するエンコーダの場合、サイズが大きくなり特徴を捕らえられる可能性があるものの本実施の形態では、対象としていない。
【００２５】
シェルコード部はいくつかの共通した特徴を持つ。その中でも多くのコードはＡＰＩ関数アドレスの自己解決を行う為にＰＥＢ（Ｐｒｏｃｅｓｓ  Ｅｎｖｉｒｏｎｍｅｎｔ  Ｂｌｏｃｋ）を参照するため判定が可能である。しかし容易に暗号化や難読化が行われ、特に複数回暗号化を行う手法であるマルチエンコーディングが行われると検出が困難となるので対象としない。
【００２６】
一方、前記のように、ＲＯＰコードは復号コード内に含めることはできず平文で現れることから、静的解析で高速に検出することが可能である。また、本実施の形態の手法により、特定の関数の引数等の既知の文字列に頼らない未知のＤＬＬに対するＲＯＰコードを検出可能である。
【００２７】
（装置構成）
図３に、本発明の実施の形態に係る悪性文書ファイル検出装置１００の機能構成図を示す。悪性文書ファイル検出装置１００は、オフラインで設置し、検査対象の文書ファイル（入力データ）を手動で入力することにより悪性文書ファイルの検出することとしてもよいし、ネットワーク上に設置し、ネットワーク上で文書ファイルを取得することで悪性文書ファイルの検出を行うこととしてもよい。なお、悪性文書ファイル検出装置１００を攻撃コード検出装置と称してもよい。また、本実施の形態の「文書ファイル」は特定の種類に限定されず、どのようなものでもよい。また、攻撃コード検出の対象は文書ファイルに限られず、本発明に係る技術により、任意の入力データから攻撃コードを検出できる。
【００２８】
図３に示すように、悪性文書ファイル検出装置１００は、文書ファイル入力部１０１、文書ファイル格納部１０２、攻撃コード判定部１０３、及び判定結果出力部１０４を備える。
【００２９】
文書ファイル入力部１０１は、悪性文書ファイルか否かを検査する対象とする文書ファイルを入力する。入力された文書ファイルは文書ファイル格納部１０２に格納される。攻撃コード判定部１０３は、対象の文書ファイルを静的に解析することにより、文書ファイルに攻撃コードが含まれているか否かの判定を行う。本実施の形態において、有無判定の対象とする攻撃コードはＲＯＰコードである。攻撃コード判定部１０３の処理内容については後述する。
【００３０】
判定結果出力部１０４は、攻撃コード判定部１０３による攻撃コード有無の判定結果を出力する。攻撃コード有との判定結果が得られた場合、対象の文書ファイルは悪性文書ファイルであると判断できる。
【００３１】
本実施の形態に係る悪性文書ファイル検出装置１００は、例えば、１つ又は複数のコンピュータに、本実施の形態で説明する処理内容を記述したプログラムを実行させることにより実現可能である。すなわち、悪性文書ファイル検出装置１００が有する機能は、当該コンピュータに内蔵されるＣＰＵやメモリ、ハードディスクなどのハードウェア資源を用いて、悪性文書ファイル検出装置１００で実施される処理に対応するプログラムを実行することによって実現することが可能である。また、上記プログラムは、コンピュータが読み取り可能な記録媒体（可搬メモリ等）に記録して、保存したり、配布したりすることが可能である。また、上記プログラムをインターネットや電子メールなど、ネットワークを通して提供することも可能である。
【００３２】
（ＲＯＰコードの内部構成について）
本実施の形態における攻撃コード判定部１０３における処理内容は、ＲＯＰコードの内部構成と密接に関連するため、ここでＲＯＰコードの内部構成について説明する。
【００３３】
前述したように、ＲＯＰコードは、実行権限のあるメモリ領域のコード部分を繋いで利用することでＤＥＰを回避して任意のコードを実行可能とする。
【００３４】
発明者による調査の結果、攻撃コードとしてＲＯＰコードが用いられる場合、ＲＯＰを利用して自由度の高い任意のシェルコードを書くのではなく、後続するコード領域に実行権限を付与するものしか見られないことがわかっている。実行権限を付与可能な関数の例としてはＶｉｒｔｕａｌＰｒｏｔｅｃｔ、ＶｉｒｔｕａｌＡｌｌｏｃ、ＨｅａｐＣｒｅａｔｅ、ＳｅｔＰｒｏｃｅｓｓＤＥＰＰｏｌｉｃｙ、ＷｒｉｔｅＰｒｏｃｅｓｓＭｅｍｏｒｙ、ＮｔＳｅｔＩｎｆｏｒｍａｔｉｏｎＰｒｏｃｅｓｓ等がある。
【００３５】
ＲＯＰコードには、ＤＥＰを制御するＡＰＩ関数（例：ＶｉｒｔｕａｌＰｒｏｔｅｃｔ関数）に関するＲＯＰｇａｄｇｅｔコード、これらの関数に適切な引数等を準備するために用いられるＲＯＰｇａｄｇｅｔコード（通常のＲＯＰｇａｄｇｅｔコードと呼ぶ）、関数等への引数が含まれる。攻撃者は、スタックにこの２種類のＲＯＰｇａｄｇｅｔコード及び引数等を適切に積んでおき、ＲＯＰコードを実行し、シェルコード配置エリアのメモリ領域に実行権限を付与し、ＤＥＰを回避する。ＤＥＰが回避されると、復号コードの実行等、次の処理が開始される。
【００３６】
攻撃者は、安定して攻撃を成功させるためにメモリ空間に固定値として存在するＲＯＰｇａｄｇｅｔコードを用いようとする。ＡＳＬＲが機能している場合これが困難となるが前述した回避方法がある。発明者が調査したところ、ＡＳＬＲ非対応モジュールの物理アドレスを用いる攻撃方法が多数存在し、また逆にＡＳＬＲ非対応モジュールの数は限られることから、用いられるＲＯＰｇａｄｇｅｔコードの数は限定的であり、この物理アドレスに関する特徴を用いる検出手法が有効である。
【００３７】
悪性文書ファイル内でのＲＯＰコードは、上述したようにスタックの状態を作るため、例えば図４に示すように構成される。図４における個々の四角は１バイトを示す。３２ｂｉｔ環境において、Ｂで示すＤＥＰを制御するＡＰＩ関数に関するＲＯＰｇａｄｇｅｔコード、Ａで示す通常のＲＯＰｇａｄｇｅｔコードのそれぞれは４バイトの物理メモリアドレスである。
【００３８】
このようなＲＯＰコードの特徴を利用して、攻撃者が用いる既知のアドレスを検出することでＲＯＰコードを検出することが考えられる。しかし、未知のＡＳＬＲ非対応物理アドレスを用いる攻撃手法、もしくは、ＡＳＬＲ対応ＤＬＬでも、特定のＤＬＬベースアドレスを動的に攻撃コード内で取得して用いる攻撃手法が存在し、このような攻撃手法では、既知のアドレスを検出する手法によるＲＯＰコードの検出は難しくなる。
【００３９】
そこで、本実施の形態では、特定のＤＬＬ等の物理アドレスに依存しない方法でＲＯＰコードを検出する技術が用いられる。
【００４０】
ＡＳＬＲ非対応のあるＤＬＬから作成されたＲＯＰコードの例を図５に示す。図５においてアドレスはリトルエンディアンで配置されている。当該ＤＬＬのベースアドレスは非ＡＳＬＲであることから常に固定であり、０ｘ７Ｃ３４００００〜０ｘ７Ｃ３９６０００にロードされる。このことから、作成されるＲＯＰｇａｄｇｅｔは上位バイトが０ｘ７Ｃ３となり、図５において網掛けで示すように４バイト周期で現れる。
【００４１】
図６は、３２ｂｉｔＯＳにおけるメモリ空間を示す図である。図６には、上述したＤＬＬがロードされる領域を示している。図５で例に挙げたＤＬＬは、図６で斜線で示す部分にロードされ、ＲＯＰｇａｄｇｅｔとして悪用される。また、悪用される多くのＤＬＬはカーネル領域ではなく、ユーザ領域にロードされるものであるため、ＤＬＬを利用するＲＯＰコードにおける物理アドレスは最大で０ｘ７ＦＦＦＦＦＦＦとなると考えられる。つまり、図６にグレーで示す０ｘ８０００００００から０ｘＦＦＦＦＦＦＦＦのカーネル領域のアドレスは利用されないと考えられる。
【００４２】
また、図５に白で示した部分のうち、４０バイトから４７バイト目の値が０ｘ４０００００００であるが、これはＶｉｒｔｕａｌＰｒｏｔｅｃｔ関数での実行権を付与するのに必要な引数である。また、図５において、網掛けを除く白部分の文字列について、一般的な文書ファイルによく見られる０ｘ００や０ｘＦＦ等でなく、散らばりのある値となっていることも特徴の１つである。
【００４３】
上記の例のように、ＲＯＰコードを用いる攻撃者は、非ＡＳＬＲのＤＬＬを探し出してその固定アドレスを利用するため、ＲＯＰコードには、特定のアドレス空間に集中した物理アドレスが連続するという特徴がある。もしくは、ＡＳＬＲ対応のＤＬＬの場合でも、脆弱性を利用してそのＤＬＬのベースアドレスを知ることで固定アドレスを利用することが可能であるため、ＡＳＬＲ対応のＤＬＬの場合でも、ＲＯＰコードには、特定のアドレス空間に集中した物理アドレスが連続するという特徴があると考えられる。
【００４４】
（攻撃コード検出部１０３の動作例）
攻撃コード検出部１０３は、文書ファイルの中から上記のような特徴を検出することにより、ＲＯＰコードの有無を判定する処理を行う。
【００４５】
攻撃コード検出部１０３の処理の概要を図７のフローチャートを参照して説明する。図７に示す処理は、悪性文書ファイルか否かを検査する対象とする文書ファイルの先頭のバイトデータから、最後のバイトデータまで１バイトづつ順番に行うものである。なお、２５個のダブルワードを全部取得できなくなった時点で処理を終了することとしてもよい。また、ＲＯＰコードが検出された旨の判定結果が得られた時点で処理を終了してもよい。
【００４６】
図７の処理の前提として、文書ファイル入力部１０１から悪性文書ファイルか否かを検査する対象とする文書ファイルが入力され、当該文書ファイルが文書ファイル格納部１０２に格納されているものとする。攻撃コード検出部１０３は、文書ファイル格納部１０２から文書ファイルのデータを読み取り、以下で説明する処理を実行する。
【００４７】
ステップ１０１において、攻撃コード判定部１０３は、現在のバイト位置（処理開始時点であれば文書ファイルにおける最初のバイト）から４バイト分のデータであるダブルワードを取得する。本例では、文書ファイルにおいてリトルエンディアンで文字列が並んでいるものとし、それを考慮してダブルワードとする。以下の２５個のダブルワードを取得する場合も同様である。
【００４８】
ステップ１０２において、攻撃コード判定部１０３は、取得したダブルワードの値が所定アドレスよりも大きいか否かを判定し、大きい場合はステップ１０３に進み、大きくない場合はステップ１０４に進む。ステップ１０３において、攻撃コード判定部１０３は、文書ファイルにおける着目するバイトを１バイト進めてステップ１０１からの処理を再び行う。
【００４９】
本実施の形態では、上記の所定アドレスは、前述したユーザ領域の最大アドレス０ｘ７ＦＦＦＦＦＦＦである。本例では、ＲＯＰコードはユーザ領域にロードされたプログラムをＲＯＰｇａｄｇｅｔとして利用すると想定し、ユーザ領域の最大アドレスよりも大きなアドレスについては、ＲＯＰコードに含まれないものとしている。
【００５０】
ステップ１０４において、攻撃コード判定部１０３は、現在のバイト位置から連続する２５個のダブルワードを文書ファイルから取得し、当該２５ダブルワード間での比較、及び、２５ダブルワードにおける所定値有無によりスコアの算出を行う。
【００５１】
２５ダブルワード間での比較の処理の例を図８を参照して説明する。図８の例では、最初のダブルワードと、他の２４個のダブルワードのそれぞれとの比較処理を行う。本例において、比較処理とは、比較対象のダブルワード間の数値の差の絶対値が所定の閾値よりも小さいか（「以下」でもよい）どうかを判定し、小さい場合にスコアを加算する。この処理は、部分データ列の数値が所定の範囲に集中する度合を評価することの例である。なお、図８の処理例は一例に過ぎない。例えば、各ダブルワードを他の各ダブルワードと比較する（２５：２５）こととしてもよい。また、部分データ列（ダブルワード）の数値が所定の範囲に集中する度合を評価するために、部分データ列に関する分散、エントロピー等を計算し、所定閾値との比較等を行うこととしてもよい。
【００５２】
前述したように、ＲＯＰコードにおいては、特定のアドレス空間に集中した物理アドレスが現れるという特徴があることから、ステップ１０４の処理でこの特徴を見出そうとするのである。
【００５３】
また、２５ダブルワードにおける所定値有無における所定値とは、例えば、前述したメモリ権限を変更する関数（例：ＶｉｒｔｕａｌＰｒｏｔｅｃｔ関数）においてメモリ権限を変更（例：実行権付与）するために必要な引数（例：０ｘ４０００００００）である。２５ダブルワードの中に当該所定値が存在する場合、当該文書ファイルにＲＯＰコードが存在する可能性が高くなるため、大きなスコアを加算する。もしくは、当該所定値が存在することをＲＯＰコードが存在すると判定することの条件としてもよい。なお、所定値有無検査は必須ではなく、部分データ列の数値が所定の範囲に集中する度合を評価するのみによりＲＯＰコード有無判定を行うことも可能である。
【００５４】
ステップ１０５において、攻撃コード判定部１０３は、２５ダブルワードの検査結果により、所定の検出条件を満たすかどうかを判定し、満たす場合はステップ１０６に進み、満たさない場合はステップ１０３に進む。所定の検出条件とは、例えば、スコアが所定の閾値よりも大きいこと、もしくは、スコアが所定の閾値よりも大きいこと、かつ、上記の所定値が存在すること、等である。
【００５５】
ステップ１０６において、攻撃コード判定部１０３は、ＲＯＰコードが検出されたことを示す判定結果を判定結果出力部１０４に通知し、判定結果出力部１０４は、ＲＯＰコードが検出されたことを示す判定結果を出力する。
【００５６】
図９に、攻撃コード判定部１０３が実行する処理に対応する疑似コード例１を示す。疑似コード例１は図７に示した処理と基本的に同じ処理を示すが、より詳細な処理例を示している。
【００５７】
疑似コード例１に従った処理では、攻撃コード判定部１０３は、対象とする文書ファイルをバイナリデータとして、先頭から１バイト毎にチェックする（０１行、１９行）。攻撃コード判定部１０３は、１個目のダブルワード（４バイト）を読み出し（０２行）、ユーザ領域に存在する要件を満たしていれば（０２行）、１個目のダブルワードとそれに連続する２４個のダブルワードからなる２５個のダブルワード（１００バイト）を検査する（０７行〜１５行）。
【００５８】
この検査処理においては、図８に示したようにしてダブルワード間の差をとり、差が閾値を下回る場合にスコアを上げる（０８行、０９行）。また、図９の例では、２５個のダブルワード内に、ＶｉｒｔｕａｌＰｒｏｔｅｃｔ関数を用いて実行権を付与するために必要な引数があれば、ＲＯＰフラグを立てる（１２行、１３行）。図９の例では、ＲＯＰフラグが立ちスコアが閾値を超えていればＲＯＰコードが見つかったと判定する（１６行、１７行）。
【００５９】
図９の例における０８行での閾値（０ｘ１０００００００）については、発明者によりＲＯＰに用いられる代表的なＤＬＬを調査した結果から得られたものであるが、これは一例であり、他の閾値を使用してもよい。
【００６０】
また、ＲＯＰフラグを立てるかどうかを判定するための引数については、０ｘ４０００００００以外にもいくつかのパターンがあるが多くはないことが確認されている。
【００６１】
図９に示す疑似コード例１では、０ｘ４０００００００等の引数をＲＯＰコード判定の決定要因にしていたが、これを決定要因にせず、スコアを上げる材料としてもよい。その場合の疑似コード例である疑似コード例２を図１０に示す。
【００６２】
図１０における１２行と１３行に示すように、ダブルワードが引数に一致した場合に、スコアを大きく上げることとしている。他の処理については図９の場合と同様である。
【００６３】
図１０の例のようにスコアのみでもＲＯＰコードの検出が可能である。また、図１０において、引数のスコア加算を入れずにＲＯＰコードを検出することも可能である。このように、スコアのみで検出する方式では、関数仕様が未知の実行権限付与関数が使用されるＲＯＰコードも検出することが可能である。
【００６４】
なお、上記のように、ダブルワード間での差が所定閾値を下回る場合にスコアを上げる方式の場合、このような関係にあるダブルワードを含む良性文書ファイルを悪性文書ファイルであると誤検出する可能性があり得る。このような誤検出としては、例えば、良性文書ファイルにおいて終端文字列等として頻繁に使用される文字列（例：０ｘ００、０ｘ＊＊＊＊００００）や１バイト周期で現れる同一文字列があるが、いずれもＲＯＰコードの構成はできなくなるので、これらを評価の対象外とすることで誤検出を回避可能である。
【００６５】
また、ＲＯＰコードには必ず無意味なＪＵＮＫコード（例：ＦＦＦＦＦＦＦＦ）が入ることから、１つ又は複数の無意味コードを定義し、検査対象の複数の部分データ列（ダブルワード）の中に含まれる無意味コードの数を判定条件に追加することとしてもよい。例えば、無意味コードが所定数個以上あればスコアを加算するといった処理を行うことができる。
【００６６】
また、本実施の形態では、３２ｂｉｔ環境を想定しているが、６４ｂｉｔ環境でも本実施の形態に係る技術を同様に適用可能である。６４ｂｉｔ環境であれば、文書ファイル（入力データ）を８バイトずつ区切り、評価を行う。
【００６７】
（実施の形態のまとめ、効果等）
以上、説明したように、本実施の形態により、入力データから攻撃コードを検出する攻撃コード検出装置であって、前記入力データの中から、所定のデータ長の部分データ列を複数取り出す取得手段と、前記複数の部分データ列について、各部分データ列の数値が所定の範囲に集中する度合を評価する評価手段と、前記評価手段による評価結果に基づいて、前記入力データにおける前記攻撃コードの検出結果を出力する出力手段とを備える攻撃コード検出装置が提供される。
【００６８】
前記評価手段は、前記複数の部分データ列について、特定の数値に該当する部分データ列が存在するか否かについて更に評価を行うこととしてもよい。前記特定の数値は、例えば、メモリにおけるコードの実行権を制御する所定の関数の引数である。
【００６９】
前記評価手段は、前記各部分データ列の数値が所定の範囲に集中する度合の評価として、例えば、部分データ列間の差分の大きさが所定の閾値よりも小さいか否かの評価を行う。また、前記評価手段は、前記取得手段により取得される部分データ列が、コンピュータのメモリ空間におけるユーザ領域外のアドレスを示す場合に、当該部分データ列を前記評価の対象外とすることとしてもよい。前記攻撃コードは例えばＲＯＰコードである。
【００７０】
本実施の形態により、ＲＯＰコードを文書ファイルの静的解析により特定することが可能となる。本実施の形態では、静的に解析することから、解析時間が短い、ＯＳや文書閲覧ソフト等複数のバージョンを準備しての解析環境が不要、ファイルを動作させないことから安全である等、のメリットがある。またＲＯＰコードを検出することで、ゼロデイ等未知の脆弱性をつくタイプの攻撃コードが埋め込まれた悪性文書ファイルでも検出可能である。
【００７１】
悪性文書ファイルに埋め込まれた悪性コードを静的解析により検出する既存技術として、非特許文献１〜３に記載された技術がある。非特許文献１では、悪性文書ファイルに埋め込まれた実行ファイル（マルウェア本体）を複数のエンコード方式への対応や総当たり方式による鍵の探索により自動抽出するＨａｎｄｙ  Ｓｃｉｓｓｏｒｓが提案されている。
【００７２】
また、非特許文献２では、文書ファイルのサイズや構造に関する情報を検査することで悪性文書ファイルを検知する手法が提案されている。また、非特許文献３においては、鍵の探索機能を持つツールとしてＯｆｆｉｃｅＭａｌＳｃａｎｎｅｒが開示されている。
【００７３】
いずれも既存のアンチウィルスソフトと比較して高い悪性文書検知性能を有するものの、いずれにおいても本実施の形態で説明したようなＲＯＰコードの特徴に着目した静的解析による検出手法は示されていない。本実施の形態に係る技術を用いることで、非特許文献１〜３に記載された技術では検知できないＲＯＰコードを含む悪性文書ファイルを検知することが期待できる。
【００７４】
本発明は、上記の実施の形態に限定されることなく、特許請求の範囲内において、種々変更・応用が可能である。
【符号の説明】
【００７５】
１００  悪性文書ファイル検出装置
１０１  文書ファイル入力部
１０２  文書ファイル格納部
１０３  攻撃コード判定部
１０４  判定結果出力部
【図１】
0006297425.tif 000002
【図２】
0006297425.tif 000003
【図３】
0006297425.tif 000004
【図４】
0006297425.tif 000005
【図５】
0006297425.tif 000006
【図６】
0006297425.tif 000007
【図７】
0006297425.tif 000008
【図８】
0006297425.tif 000009
【図９】
0006297425.tif 000010
【図１０】
0006297425.tif 000011