(57)【要約】【課題】不正なプログラムにより攻撃や侵入されたアプリケーションの異常な動作を検知することを課題とする。【解決手段】異常検知装置１００は、監視対象とする特定の関数がアプリケーションプログラムにより呼び出されるまでの関数間の正常な呼び出し関係と、監視対象とする特定の関数を呼び出すイベントに応じて特定の関数がアプリケーションプログラムにより呼び出されるまでの関数間の呼び出し関係とを比較する。そして、異常検知装置１００は、比較の結果、呼び出し関係が一致しない場合には、イベントに伴う関数の呼び出し動作を異常な動作として検知する。【選択図】図１
2011258019.tif 000002
【特許請求の範囲】
【請求項１】
アプリケーションプログラムによる異常な動作を検知する異常検知装置であって、
アプリケーションプログラムにより呼び出される関数の呼び出し履歴を記憶部に格納する格納部と、
監視対象とする特定の関数がアプリケーションプログラムにより呼び出されるまでの関数間の正常な呼び出し関係を該特定の関数ごとに予め記憶する正常順序記憶部と、
前記監視対象とする特定の関数がアプリケーションプログラムにより呼び出されるイベントが発生した場合に、該イベントの発生に伴って該特定の関数がアプリケーションプログラムにより呼び出されるまでの関数間の呼び出し関係を前記記憶部に記憶されている前記履歴から取得し、該記憶部から取得した呼び出し関係と、前記正常順序記憶部に記憶されている前記正常な呼び出し関係とを比較する比較部と、
前記比較部による比較の結果、前記記憶部から取得した呼び出し関係と前記正常な呼び出し関係とが一致しない場合には、前記イベントに伴う関数の呼び出し動作を異常な動作として検知する検知部と
を有することを特徴とする異常検知装置。
【請求項２】
前記比較部は、前記イベントの発生に伴い前記特定の関数が呼び出されるまでの呼び出し関係を前記記憶部に記憶されている前記履歴から取得する場合に、予め設定された所定ポイントまで該記憶部をトレースすることにより取得することを特徴とする請求項１に記載の異常検知装置。
【請求項３】
前記正常順序記憶部は、複数のＤＬＬを経由して前記特定の関数が呼び出されるまでの正常な呼び出し関係として、各ＤＬＬにおける関数の呼び出し関係を該ＤＬＬ間で紐づけた呼び出し関係を記憶することを特徴とする請求項１に記載の異常検知装置。
【請求項４】
前記正常順序記憶部は、ＤＬＬの先頭からの所定ポイントまでの相対アドレスという形式で、複数のＤＬＬを経由して前記特定の関数が呼び出されるまでの正常な呼び出し関係を記憶することを請求項３に記載の異常検知装置。
【請求項５】
アプリケーションプログラムによる異常な動作を検知する処理を異常検知装置としてのコンピュータに実行させる異常検知プログラムであって、
前記コンピュータに、
アプリケーションプログラムにより呼び出される関数の呼び出し履歴を記憶部に格納する格納手順と、
監視対象とする特定の関数がアプリケーションプログラムにより呼び出されるイベントが発生した場合に、該イベントの発生に伴って該特定の関数が呼び出されるまでの関数間の呼び出し関係を前記記憶部に記憶されている前記履歴から取得するとともに、該特定の関数がアプリケーションプログラムにより呼び出されるまでの関数間の正常な呼び出し関係を該特定の関数ごとに予め記憶する正常順序記憶部から該イベントの発生に伴って呼び出される該特定の関数の正常な呼び出し関係を取得し、該記憶部から取得した呼び出し関係と、該正常順序記憶部から取得した正常な呼び出し関係とを比較する比較手順と、
前記比較手順による比較の結果、前記記憶部から取得した呼び出し関係と、前記正常順序記憶部から取得した正常な呼び出し関係とが一致しない場合には、前記イベントに伴う関数の呼び出し動作を異常な動作として検知する検知手順と
を実行させることを特徴とする異常検知プログラム。
【請求項６】
前記比較手順は、前記イベントの発生に伴い前記特定の関数が呼び出されるまでの呼び出し関係を前記記憶部に記憶されている前記履歴から取得する場合に、予め設定された所定ポイントまで該記憶部をトレースすることにより取得することを特徴とする請求項５に記載の異常検知プログラム。
【請求項７】
前記比較手順は、複数のＤＬＬを経由して前記特定の関数が呼び出されるまでの正常な呼び出し関係として、各ＤＬＬにおける関数の呼び出し関係を該ＤＬＬ間で紐づけた呼び出し関係を該特定の関数ごとに記憶する前記正常順序記憶部から前記イベントの発生に伴って複数のＤＬＬを経由して呼び出される該特定の関数の正常な呼び出し関係を取得し、前記記憶部から取得した呼び出し関係と、該正常順序記憶部から取得した複数のＤＬＬを経由して呼び出される正常な呼び出し関係とを比較することを特徴とする請求項５に記載の異常検知プログラム。
【請求項８】
前記比較手順は、ＤＬＬの先頭からの所定位置までの相対アドレスという形式で、複数のＤＬＬを経由して前記特定の関数が呼び出されるまでの正常な呼び出し関係を記憶する前記正常順序記憶部から前記イベントの発生に伴って複数のＤＬＬを経由して呼び出される該特定の関数の正常な呼び出し関係を取得し、前記記憶部から取得した呼び出し関係と、該正常順序記憶部から取得した複数のＤＬＬを経由して呼び出される正常な呼び出し関係とを比較することを特徴とする請求項７に記載の異常検知プログラム。
【請求項９】
アプリケーションプログラムによる異常な動作を検知する異常検知装置に適用される異常検知方法であって、
アプリケーションプログラムにより呼び出される関数の呼び出し履歴を記憶部に格納する格納ステップと、
監視対象とする特定の関数がアプリケーションプログラムにより呼び出されるイベントが発生した場合に、該イベントの発生に伴って該特定の関数が呼び出されるまでの関数間の呼び出し関係を前記記憶部に記憶されている前記履歴から取得するとともに、該特定の関数がアプリケーションプログラムにより呼び出されるまでの関数間の正常な呼び出し関係を該特定の関数ごとに予め記憶する正常順序記憶部から該イベントの発生に伴って呼び出される該特定の関数の正常な呼び出し関係を取得し、該記憶部から取得した呼び出し関係と、該正常順序記憶部から取得した正常な呼び出し関係とを比較する比較ステップと、
前記比較ステップによる比較の結果、前記記憶部から取得した呼び出し関係と、前記正常順序記憶部から取得した正常な呼び出し関係とが一致しない場合には、前記イベントに伴う関数の呼び出し動作を異常な動作として検知する検知ステップと
を含むことを特徴とする異常検知方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、不正なプログラムにより攻撃や侵入されたアプリケーションを検知するための技術に関する。
【背景技術】
【０００２】
コンピュータシステムおよびネットワーク環境の普及に伴い、コンピュータシステムが有するセキュリティホールを狙って攻撃を仕掛け、コンピュータシステム内に侵入することを目的とした不正プログラムの蔓延が個人や企業を問わず社会的に重要な問題となっている。不正プログラムとは、例えば、コンピュータウイルスやワームなどのマルウェアのことである。
【０００３】
この不正プログラムは、コンピュータシステムの内部に侵入することにより、コンピュータに格納されているデータを破壊したり、コンピュータの外部へのコンピュータに格納されているデータを不正に送信したりする。あるいは、この不正プログラムは、侵入したコンピュータを基点として、新たに第三のコンピュータシステムに対する攻撃を仕掛けたりする。
【０００４】
コンピュータシステムで実行されるアプリケーションには、例えば、バッファオーバーフローなどのように、アプリケーションのプログラミング上のミスに起因する脆弱性、つまりセキュリティホールが存在する。攻撃者は、このセキュリティホールを利用して不正プログラムをコンピュータシステムに実行させる。例えば、バッファオーバーフローに起因するセキュリティホールには、不正なプログラムコードをコンピュータシステムに実行させることが可能となる場合が存在する。この結果、コンピュータシステムには、ワームへの感染や不正アクセスなどの重大なセキュリティ侵害が発生してしまう。
【０００５】
そこで、このような不正プログラムに対処するために、不正プログラムによる攻撃や侵入を検知する方法が種々提案されている。例えば、システム内部の挙動を監視することで不正プログラムによる攻撃や不正プログラムの侵入を検知する方法として、ＨＩＤＳ（Host  Based  Intrusion  Detection  System）が提案されている。このＨＩＤＳは、ホストコンピュータへのトラフィックのみを監視することにより、不正プログラムによる攻撃を検知する方法である。また、コンピュータシステム内のファイルの入出力イベントやプロセス生成イベント、コンピュータシステムによる外部通信を監視することにより、アクセスコントロールを契機とする不正プログラムの検知方法も提案されている。
【０００６】
そのほか、コンピュータシステム内のシステムコールやＡＰＩ（Application  Programming  Interface）の読み出し回数などの統計情報、関数のコールシーケンスを利用することにより、不正プログラムの攻撃や侵入を検知する方法も提案されている。
【先行技術文献】
【非特許文献】
【０００７】
【非特許文献１】“Intrusion  detection  using  sequences  of  system  calls”、Journal  of  Computer  Security  1998、［online］、［平成２０年９月２２日検索］、インターネット＜http://www.cs.unm.edu/~steveah/jcs-accepted.pdf＞
【非特許文献２】“Native  API  Based  Windows（登録商標）  Anomaly  Intrusion  Detection  Method  Using  SVM”，IEEE  International  Conference  on  Sensor  Networks，Ubiquitous，and  Trustworthy  Computing  2006.
【非特許文献３】“Security-Enhanced Linux”、［平成２１年５月２１日検索］、インターネット＜http://www.nsa.gov/research/selinux/＞
【発明の概要】
【発明が解決しようとする課題】
【０００８】
ところで、上述した不正プログラムの攻撃や侵入を検知する方法では、ファイルの入出力イベントやプロセス生成イベントを伴う正規のアプリケーションについて、不正プログラムの攻撃や侵入を検知することが困難である。例えば、不正プログラムの攻撃により制御を奪われた後のアプリケーションによるファイルの入出力イベントやプロセス生成イベントと、正常動作時のアプリケーションによるファイルの入出力イベントやプロセス生成イベントとの判別が困難であるということがその原因となっている。
【０００９】
特に、コンピュータシステムにおける使用頻度の高いＷｅｂブラウザは、頻繁に外部通信を行って、Ｗｅｂコンテンツをコンピュータ内に保存したり、拡張機能を追加したりする。また、Ｗｅｂブラウザにより追加される拡張機能、いわゆるプラグインは、独自にファイル出力を行ったり、プロセス生成を行ったり、外部通信を行ったりする。つまり、上述した不正プログラムの攻撃や侵入を検知する方法では、Ｗｅｂブラウザのように多機能を有するアプリケーションが不正なプログラムからの攻撃を受けてしまった場合、アプリケーションの不正な動作と正常な動作とを区別することが困難である。このため、コンピュータシステム内で動作するアプリケーションが、不正なプログラムにより攻撃を受け、その制御が奪われてしまっている状態にあるという事実を検知することも困難を極める。
【００１０】
本発明は、上記に鑑みてなされたものであって、不正なプログラムにより攻撃や侵入されたアプリケーションの異常な動作を検知することが可能な異常検知装置、異常検知プログラムおよび異常検知方法を提供することを目的とする。
【課題を解決するための手段】
【００１１】
上述した課題を解決し、目的を達成するために、本発明は、アプリケーションプログラムによる異常な動作を検知する異常検知装置であって、アプリケーションプログラムにより呼び出される関数の呼び出し履歴を記憶部に格納する格納部と、監視対象とする特定の関数がアプリケーションプログラムにより呼び出されるまでの関数間の正常な呼び出し関係を該特定の関数ごとに予め記憶する正常順序記憶部と、前記監視対象とする特定の関数がアプリケーションプログラムにより呼び出されるイベントが発生した場合に、該イベントの発生に伴って該特定の関数が呼び出されるまでの関数間の呼び出し関係を前記記憶部に記憶されている前記履歴から取得し、該記憶部から取得した呼び出し関係と、前記正常順序記憶部に記憶されている前記正常な呼び出し関係とを比較する比較部と、前記比較部による比較の結果、前記記憶部から取得した呼び出し関係と前記正常な呼び出し関係とが一致しない場合には、前記イベントに伴う関数の呼び出し動作を異常な動作として検知する検知部とを有することを特徴とする。
【発明の効果】
【００１２】
本発明によれば、不正なプログラムにより攻撃や侵入されたアプリケーションの異常な動作を検知できる。
【図面の簡単な説明】
【００１３】
【図１】図１は、実施例１に係る異常検知装置１００の構成を示す図である。
【図２】図２は、関数間の呼び出し関係を示すコールグラフの一例を示す図である。
【図３】図３は、監視対象とする特定の関数が呼び出されるまでの関数間の正常な呼び出し関係を表すモデル図である。
【図４】図４は、比較部１４２によるスタックトレースの概念を説明するための図である。
【図５】図５は、比較部１４２による比較の概念を説明するための図である。
【図６】図６は、比較部１４２のスタックトレースにより取得される関数間の呼び出し関係例を示すモデル図である。
【図７】図７は、実施例１に係る異常検知装置による処理の流れを示す図である。
【図８】図８は、シェルコードによって特定の関数が呼び出される場合の関数間の呼び出し関係を示す図である。
【図９】図９は、複数のＤＬＬを経由して特定の関数が呼び出されるまでの正常な呼び出し関係について説明するための図である。
【図１０】図１０は、異常検知プログラムを実行するコンピュータの一例を示す図である。
【発明を実施するための形態】
【００１４】
以下に、図面を参照しつつ、本願の開示する異常検知装置、異常検知プログラムおよび異常検知方法の一実施形態を詳細に説明する。
【実施例１】
【００１５】
以下に説明する実施例１では、本発明に係る異常検知装置、異常検知プログラムおよび異常検知方法の一実施形態として実施例１を説明する。なお、以下の実施例１により、本願の開示する発明が限定されるものではない。
【００１６】
［異常検知装置の概要および特徴（実施例１）］
実施例１に係る異常検知装置は、コンピュータシステム内部の異常な動作を検知することを概要とする。そして、実施例１に係る異常検知装置は、不正なプログラムにより攻撃や侵入されたアプリケーションの異常な動作を検知することを可能とする仕組みに特徴がある。
【００１７】
例えば、実施例１に係る異常検知装置は、監視対象とする特定の関数がアプリケーションプログラムにより呼び出されるまでの関数間の正常な呼び出し関係と、監視対象とする特定の関数を呼び出すイベントに応じて特定の関数がアプリケーションプログラムにより呼び出されるまでの関数間の呼び出し関係とを比較する。そして、実施例１に係る異常検知装置は、比較の結果、呼び出し関係が一致しない場合には、イベントに伴う関数の呼び出し動作を異常な動作として検知する。以下、実施例１に係る異常検知装置について具体的に説明する。
【００１８】
［異常検知装置の構成（実施例１）］
図１は、実施例１に係る異常検知装置１００の構成を示す図である。図１に示すように、実施例１に係る異常検知装置１００は、入力部１１０、出力部１２０、記憶部１３０および制御部１４０を有する。
【００１９】
入力部１１０は、ユーザによるデータ入力に用いられる。例えば、キーボードやマウスなどに該当する。出力部１２０は、データ出力に用いられる。例えば、モニタやディスプレイなどに該当する。
【００２０】
記憶部１３０は、制御部１４０による各種処理に必要なプログラムやデータ等を記憶する。そして、記憶部１３０は、特に本発明に密接に関連するものとして、スタックフレーム記憶部１３１および正解データ記憶部１３２を有する。
【００２１】
スタックフレーム記憶部１３１は、アプリケーションプログラムにより呼び出される関数の呼び出し履歴を記憶する。例えば、スタックフレーム記憶部１３１は、関数の呼び出し履歴として、アプリケーションプログラムなどによって関数が呼び出される際に設定されるスタックフレームを関数の呼び出し履歴として記憶する。このスタックフレームには、呼び出された関数の引数や関数内でローカルに定義されたローカル変数など、関数に関する情報が書き込まれているほか、この関数の呼び出し元である関数のアドレス、いわゆる「リターンアドレス」が書き込まれている。この「リターンアドレス」をたどることにより、関数間の呼び出し関係が明らかとなる。なお、既存技術を用いてスタックフレーム記憶部１３１に記憶されるデータ量を削減することもできる。既存技術としては、例えば、「"Anomaly  Detection  Using  Call  Stack  Information"、Proceedings  of  the  2003  IEEE  Symposium  on  Security  and  Privacy」を適用できる。
【００２２】
正解データ記憶部１３２は、監視対象とする特定の関数がアプリケーションプログラムにより呼び出されるまでの「関数間の正常な呼び出し関係（正解データ）」を特定の関数ごとに予め記憶する。監視対象とする特定の関数には、例えば、ファイル入出力やレジストリ操作、プロセス生成等を行う関数が含まれるものとする。なお、監視対象とする特定の関数がアプリケーションプログラムにより呼び出されるまでの関数間の正常な呼び出し関係は既存技術により予め収集できる。例えば、特定の関数が呼び出されるまでの正常な呼び出し関係を学習モデルを用いて収集する既存技術（特開２００８−１２９７１４号公報）が適用できる。
【００２３】
図２は、関数間の呼び出し関係を示すコールグラフの一例を示す図である。コールグラフとは、図２に示すように、関数間の呼び出し関係を示す構造データである。図２に示す「ｆｕｎｃ＿Ａ」〜「ｆｕｎｃ＿Ｈ」はそれぞれ関数を示す。例えば、正解データ記憶部１３２は、図２に「ｆｕｎｃ＿Ｅ」で示す関数が監視対象である場合に、図２に示すようなコールグラフ全体を正解データとして記憶してもよいが、記憶部１３０の記憶領域を圧迫する。そこで、監視対象の関数である「ｆｕｎｃ＿Ｅ」についての正解データとして、「ｆｕｎｃ＿Ａ」→「ｆｕｎｃ＿Ｂ」→「ｆｕｎｃ＿Ｃ」→「ｆｕｎｃ＿Ｅ」の呼び出し関係についてのデータのみを記憶する。また、例えば、図２に「ｆｕｎｃ＿Ｇ」で示す関数が監視対象である場合には、「ｆｕｎｃ＿Ｇ」で示す関数の正解データとして、「ｆｕｎｃ＿Ａ」→「ｆｕｎｃ＿Ｂ」→「ｆｕｎｃ＿Ｄ」→「ｆｕｎｃ＿Ｇ」の呼び出し関係についてのデータのみを記憶する。このようにすることで、記憶部１３０に記憶される正解データのデータ量を削減できる。
【００２４】
図３は、監視対象とする特定の関数が呼び出されるまでの関数間の正常な呼び出し関係を表すモデル図である。図３に示す「Ａ−Ｂ」は監視対象とする特定の関数を示し、図３に示す「Ａ」、「Ｂ」、「Ａ−１」、「Ａ−２」、「Ａ−３」、「Ｂ−１」、「Ｂ−２」はその他の関数を示す。図３に示すように、特定の関数「Ａ−Ｂ」が呼び出されるまでの関数間の正常な呼び出し関係として、例えば、次の３パターンが存在する場合も考えられる。１つ目は、「Ａ」→「Ａ−１」→「Ａ−Ｂ」である。２つ目は、「Ａ」→「Ａ−２」→「Ａ−３」→「Ａ−Ｂ」である。３つ目は、「Ｂ」→「Ｂ−１」→「Ｂ−２」→「Ａ−Ｂ」である。このような場合には、正解データ記憶部１３２は、例えば、特定の関数「Ａ−Ｂ」についての正解データとして、この３つのパターンに対応するデータを記憶する。なお、正解データは、例えば、関数のデータを記憶するために記憶部１３０内に割り当てられている記憶領域を示すアドレスに該当する。
【００２５】
なお、記憶部１３０は、例えば、ＲＡＭ（Random  Access  Memory）やフラッシュメモリ(flash  memory)などの半導体メモリ素子である。
【００２６】
制御部１４０は、所定の制御プログラム、各種の処理手順などを規定したプログラムおよび所要データを格納するための内部的な記憶部を有し、これらによって種々の処理を実行する。そして、制御部１４０は、特に本発明に密接に関連するものとして、格納部１４１、比較部１４２および検知部１４３を有する。
【００２７】
格納部１４１は、アプリケーションプログラムにより呼び出される関数の呼び出し履歴を記憶部１３０に格納する。例えば、格納部１４１は、アプリケーションプログラムにより関数が呼び出されると、その関数の情報を書き込むためのスタックフレームを設定する。そして、格納部１４１は、その関数の情報が書き込まれたスタックフレームをスタックフレーム記憶部１３１に格納する。
【００２８】
比較部１４２は、監視対象とする特定の関数がアプリケーションプログラムにより呼び出されるイベントが発生した場合に、その特定の関数が呼び出されるまでの関数間の呼び出し関係を正解データと比較する。
【００２９】
まず、比較部１４２は、監視対象とする特定の関数がアプリケーションプログラムにより呼び出されるイベントが発生すると、スタックフレーム記憶部１３１をトレースすることにより、イベントの発生に伴って特定の関数が呼び出されるまでの関数間の呼び出し関係をスタックフレーム記憶部１３１に記憶されている関数の呼び出し履歴から取得する。
【００３０】
図４は、比較部１４２によるスタックトレースの概念を説明するための図である。図４に示す「ｆｕｎｃ＿Ａ」〜「ｆｕｎｃ＿Ｃ」はそれぞれ関数を表するものとする。また、図４に示す「ｆｕｎｃ＿Ａ」が監視対象とする特定の関数に該当するものとする。そして、仮に、図４に示す「ｆｕｎｃ＿Ａ」についてのスタックフレームにはリターンアドレスとして図４に示す「ｆｕｎｃ＿Ｂ」のアドレスが書き込まれているものとし、図４に示す「ｆｕｎｃ＿Ｂ」についてのスタックフレームにはリターンアドレスとして図４に示す「ｆｕｎｃ＿Ｃ」のアドレスが書き込まれているものとする。
【００３１】
図４に示す場合において、比較部１４２は、「ｆｕｎｃ＿Ａ」の関数を呼び出すイベントが発生すると、「ｆｕｎｃ＿Ａ」の関数についてのスタックフレームを基点として、スタックフレーム記憶部１３１に記憶されているスタックフレームをトレースする。その結果、比較部１４２は、「ｆｕｎｃ＿Ａ」の関数が呼び出されるまでの関数間の呼び出し関係として、「ｆｕｎｃ＿Ｃ」→「ｆｕｎｃ＿Ｂ」→「ｆｕｎｃ＿Ａ」という関係を取得する。
【００３２】
比較部１４２は、スタックトレースによりイベントの発生に伴って特定の関数が呼び出されるまでの関数間の呼び出し関係を取得すると、続いて、この特定の関数が呼び出されるまでの関数間の正常な呼び出し関係を正解データ記憶部１３２から取得する。そして、比較部１４２は、スタックトレースにより取得した呼び出し関係と、正解データ記憶部１３２から取得した正常な呼び出し関係とを比較し、比較結果を後述する検知部１４３に送る。
【００３３】
図５は、比較部１４２による比較の概念を説明するための図である。図５に示す（１）は、監視対象とする特定の関数「ＦｕｎｃｔｉｏｎＡ」について、正解データ記憶部１３２から取得した関数間の正常な呼び出し関係を示すものとする。図５に示す（２）は、監視対象とする特定の関数「ＦｕｎｃｔｉｏｎＡ」について、スタックトレースにより取得した関数間の呼び出し関係を示すものとする。
【００３４】
図５に示す場合において、比較部１４２は、監視対象とする特定の関数「ＦｕｎｃｔｉｏｎＡ」について、正解データ記憶部１３２から取得した関数間の正常な呼び出し関係「ＦｕｎｃｔｉｏｎＤ→ＦｕｎｃｔｉｏｎＢ→ＦｕｎｃｔｉｏｎＡ」と、スタックトレースにより取得した関数間の呼び出し関係「ＦｕｎｃｔｉｏｎＣ→ＦｕｎｃｔｉｏｎＢ→ＦｕｎｃｔｉｏｎＡ」とを比較する。比較の結果、比較部１４２は、正解データ記憶部１３２から取得した関数間の正常な呼び出し関係「ＦｕｎｃｔｉｏｎＤ→ＦｕｎｃｔｉｏｎＢ→ＦｕｎｃｔｉｏｎＡ」と、スタックトレースにより取得した関数間の呼び出し関係「ＦｕｎｃｔｉｏｎＣ→ＦｕｎｃｔｉｏｎＢ→ＦｕｎｃｔｉｏｎＡ」とが一致しないので、関数間の呼び出し関係が一致しない旨の比較結果を後述する検知部１４３に送る。なお、監視対象とする「ＦｕｎｃｔｉｏｎＡ」がファイル出力を行う関数である場合には、例えば、「ＦｕｎｃｔｉｏｎＤ」は出力対象となるファイルのチェックを行う関数に該当し、「ＦｕｎｃｔｉｏｎＢ」は出力対象となるファイルのチェックに失敗した場合に所定の事前処理を行うを行う関数に該当する一連の処理が一例として想定される。
【００３５】
図６は、比較部１４２のスタックトレースにより取得される関数間の呼び出し関係例を示すモデル図である。図６に示す「Ａ−Ｂ」は監視対象とする特定の関数を示し、図６に示す「Ａ−２」、「Ａ−３」、「Ｂ−２」、「？」はその他の関数を示す。図６に示す（１）〜（４）は、特定の関数「Ａ−Ｂ」について、スタックトレースにより取得された関数間の呼び出し関係の一例を示す。例えば、図６の（１）は、「Ｂ−２」→「Ａ−３」→「Ａ−Ｂ」という呼び出し関係を示す。また、図６の（２）は、「Ａ−２」→「Ｂ−２」→「Ａ−Ｂ」という呼び出し関係を示す。また、図６の（３）は、「Ａ−２」→「Ａ−Ｂ」という呼び出し関係を示す。また、図６の（４）は、「？」→「Ａ−Ｂ」という呼び出し関係を示す。
【００３６】
例えば、特定の関数「Ａ−Ｂ」についての正解データとして、図２に示す関数間の呼び出し関係のモデル「Ａ」→「Ａ−１」→「Ａ−Ｂ」、「Ａ」→「Ａ−２」→「Ａ−３」→「Ａ−Ｂ」および「Ｂ」→「Ｂ−１」→「Ｂ−２」→「Ａ−Ｂ」に対応するデータが正解データ記憶部１３２に記憶されているものとする。この場合、比較部１４２は、図６に示す（１）〜（４）の関数間の呼び出し関係と、図２に示す正解データとを比較した結果、図６に示す（１）〜（４）が全て正解データと一致しないので、関数間の呼び出し関係が一致しない旨の比較結果を後述する検知部１４３に送ることとなる。
【００３７】
検知部１４３は、比較部１４２から送られてくる比較結果に基づいて、アプリケーションによる異常な動作を検知する。例えば、検知部１４３は、比較部１４２から送られてきた比較結果が、スタックトレースにより取得した呼び出し関係と、正解データ記憶部１３２から取得した正常な呼び出し関係とが一致する旨の比較結果であるか否かを判定する。判定の結果、監視対象とする特定の関数について、正解データ記憶部１３２から取得した関数間の正常な呼び出し関係と、スタックトレースにより取得した関数間の呼び出し関係とが一致しない旨の比較結果であった場合には、監視対象とする特定の関数の呼び出し動作を行ったアプリケーションの動作を異常な動作として検知する。
【００３８】
なお、制御部１４０は、ＣＰＵ（Central  Processing  Unit）やＭＰＵ（Micro  Processing  Unit）などの電子回路、ＡＳＩＣ（Application  Specific  Integrated  Circuit）やＦＰＧＡ(Field  Programmable  Gate  Array)などの集積回路に該当する。
【００３９】
また、異常検知装置１００は、例えば、パーソナルコンピュータやサーバなど、任意の情報処理装置に該当する。
【００４０】
［異常検知装置による処理（実施例１）］
図７を用いて、実施例１に係る異常検知装置による処理の流れを説明する。図７は、実施例１に係る異常検知装置による処理の流れを示す図である。
【００４１】
図７に示すように、比較部１４２は、監視対象とする特定の関数がアプリケーションプログラムにより呼び出されるイベントが発生すると（ステップＳ７１０，ＹＥＳ）、スタックフレーム記憶部１３１をトレースすることにより、該当の特定の関数が呼び出されるまでの関数間の呼び出し関係をスタックフレーム記憶部１３１から取得する（ステップＳ７２０）。
【００４２】
続いて、比較部１４２は、該当の関数が呼び出されるまでの関数間の正常な呼び出し関係を正解データ記憶部１３２から取得する（ステップＳ７３０）。そして、比較部１４２は、スタックトレースにより取得した呼び出し関係と、正解データ記憶部１３２から取得した正常な呼び出し関係とを比較する（ステップＳ７４０）。
【００４３】
検知部１４３は、比較部１４２から送られてきた比較結果が、スタックトレースにより取得した呼び出し関係と、正解データ記憶部１３２から取得した正常な呼び出し関係とが一致する旨の比較結果であるか否かを判定する（ステップＳ７５０）。判定の結果、スタックトレースにより取得した呼び出し関係と、正解データ記憶部１３２から取得した正常な呼び出し関係とが一致する旨の比較結果であった場合には（ステップＳ７５０，ＹＥＳ）、検知部１４３は処理を終了し、比較部１４２は上述したステップＳ７１０に対応する処理に戻る。一方、判定の結果、スタックトレースにより取得した呼び出し関係と、正解データ記憶部１３２から取得した正常な呼び出し関係とが一致しない旨の比較結果であった場合には（ステップＳ７５０，ＮＯ）、検知部１４３は、監視対象とする特定の関数の呼び出し動作を行ったアプリケーションの動作を異常な動作として検知する（ステップＳ７６０）。そして、検知部１４３は処理を終了し、比較部１４２は上述したステップＳ７１０に対応する処理に戻る。
【００４４】
［実施例１による効果］
図８は、シェルコードによって特定の関数が呼び出される場合の関数間の呼び出し関係を示す図である。図８に示す「ｆｕｎｃ＿Ａ」〜「ｆｕｎｃ＿Ｄ」はそれぞれ関数を示す。図８の（１）は、「ｆｕｎｃ＿Ａ」がシェルコードによって直接呼び出される場合を示す。図８の（２）は、シェルコードにより、「ｆｕｎｃ＿Ｂ」経由で「ｆｕｎｃ＿Ａ」が間接的に呼び出される場合を示す。図８の（３）は、シェルコードにより、「ｆｕｎｃ＿Ｄ」および「ｆｕｎｃ＿Ｃ」経由で「ｆｕｎｃ＿Ａ」が間接的に呼び出される場合を示す。シェルコードとは、セキュリティホールであるバッファオーバーフローを利用して、攻撃対象となるコンピュータの制御を乗っ取るために送り込まれるコード断片である。従来は、図８に示すように、例えば、シェルコードによって関数が呼び出されたとしても、シェルコードによる関数の呼び出しと、正常なアプリケーションプログラムによる関数の呼び出しとの区別ができなかった。
【００４５】
これに対して、上述してきたように、異常検知装置１００は、監視対象とする特定の関数がアプリケーションプログラムにより呼び出されるまでの関数間の正常な呼び出し関係をあらかじめ保有する。そして、異常検知装置１００は、監視対象とする特定の関数がアプリケーションプログラムにより呼び出されるまでの関数間の正常な呼び出し関係と、監視対象とする特定の関数を呼び出すイベントに応じて特定の関数がアプリケーションプログラムにより呼び出されるまでの関数間の呼び出し関係とを比較する。そして、異常検知装置１００は、比較の結果、呼び出し関係が一致しない場合には、イベントに伴う関数の呼び出し動作を異常な動作として検知する。このように、実施例１によれば、不正なプログラムにより攻撃や侵入されたアプリケーションの異常な動作を検知できる。
【００４６】
また、上述した実施例１において、比較部１４２は、スタックフレーム記憶部１３１を所定のポイントまでトレースすることにより、特定の関数が呼び出されるまでの関数間の呼び出し関係を取得するようにしてもよい。すなわち、比較部１４２は、監視対象となる関数の呼び出し開始時点であるエントリーポイントまでスタックフレーム記憶部１３１をトレースするのではなく、予め設定した所定数のスタックフレームまでトレースするようにしてもよい。このようにすることで、比較部１４２によるスタックトレースを簡略化できる。
【実施例２】
【００４７】
以下、本発明に係る異常検知装置、異常検知プログラムおよび異常検知方法の他の実施形態を説明する。
【００４８】
（１）複数のＤＬＬを経由して特定の関数が呼び出される場合に対処する方法
例えば、Windows（登録商標）では、複数のＤＬＬ（Dynamic  Link  Library）を経由して関数の呼び出しが行われるのが一般的である。ＤＬＬとは、複数のアプリケーションプログラムが共通して利用するような汎用性の高い関数を保存するライブラリである。アプリケーションプログラムは、汎用性の高い関数を必要に応じてＤＬＬからメモリに呼び出して利用できる。また、ＤＬＬは、関数の公開（エクスポート）と、外部のＤＬＬにより公開された関数の利用（インポート）が可能である。
【００４９】
ＤＬＬから関数が呼び出される場合には、ＤＬＬごとに、関数間の呼び出し関係を示すコールグラフが生成される。このため、複数のＤＬＬを経由して特定の関数が呼び出される場合には、関数間の呼び出し関係の比較を行うための準備が必要となる。そこで、複数のＤＬＬを経由して特定の関数が呼び出されるまでの正常な呼び出し関係として、各ＤＬＬにおける関数の呼び出し関係を該ＤＬＬ間で紐づけた呼び出し関係を正解データ記憶部１３２に予め記憶させておく。
【００５０】
図９は、複数のＤＬＬを経由して特定の関数が呼び出されるまでの正常な呼び出し関係について説明するための図である。図９に示す「ｆｕｎｃ＿Ａ１」、「ｆｕｎｃ＿Ａ２」「ｆｕｎｃ＿Ｂ１」、「ｆｕｎｃ＿Ｂ２」、「ＣｒｅａｔｅＦｉｌｅＡ」は関数である。そして、「ＤＬＬ＿Ａ」内の「ｆｕｎｃ＿Ｂ１」は、「ＤＬＬ＿Ｂ」からインポートした関数であり、「ＤＬＬ＿Ｂ」内の「ＣｒｅａｔｅＦｉｌｅＡ」は、「ｋｅｒｎｅｌ３２．ｄｌｌ」からインポートした関数である。そこで、ＤＬＬ内にインポートされた関数を元に、ＤＬＬ間の紐付けができる。例えば、図９に示すように、「ＤＬＬ＿Ａ」内にインポートされた関数「ｆｕｎｃ＿Ｂ１」を元に、「ＤＬＬ＿Ａ」と「ＤＬＬ＿Ｂ」とが紐付けられる。また、「ＤＬＬ＿Ｂ」内にインポートされた関数「ＣｒｅａｔｅＦｉｌｅＡ」を元に、「ＤＬＬ＿Ｂ」と「ｋｅｒｎｅｌ３２．ｄｌｌ」とが紐付けられる。
【００５１】
ここで、例えば、「ＣｒｅａｔｅＦｉｌｅＡ」が監視対象となる特定の関数である場合に、「ＤＬＬ＿Ａ」および「ＤＬＬ＿Ｂ」を経由して「ＣｒｅａｔｅＦｉｌｅＡ」が呼び出されるまでの関数間の呼び出し関係は、図９に示すように、「ｆｕｎｃ＿Ａ１」→「ｆｕｎｃ＿Ａ２」→「ｆｕｎｃ＿Ｂ１」→「ｆｕｎｃ＿Ｂ２」→「ＣｒｅａｔｅＦｉｌｅＡ」となる。したがって、複数のＤＬＬを経由して特定の関数「ＣｒｅａｔｅＦｉｌｅＡ」が呼び出されるまでの正常な呼び出し関係として、「ｆｕｎｃ＿Ａ１」→「ｆｕｎｃ＿Ａ２」→「ｆｕｎｃ＿Ｂ１」→「ｆｕｎｃ＿Ｂ２」→「ＣｒｅａｔｅＦｉｌｅＡ」を正解データ記憶部１３２に予め記憶させておく。このようにすることで、複数のＤＬＬを経由して特定の関数が呼び出される場合であっても、上述した実施例１と同様に関数間の呼び出し関係の比較を行うことができ、不正なプログラムにより攻撃や侵入されたアプリケーションの異常な動作を検知できる。
【００５２】
（２）ＤＬＬ先頭からの相対アドレスの形式で正解データを記憶
例えば、上述した（１）において、正解データ記憶部１３２に記憶する正解データの形式をＤＬＬ先頭からの相対アドレスの形式で記憶するようにしてもよい。例えば、図２に示すようなコールグラフでは、コールグラフのノード（例えば、「ｆｕｎｃ＿Ａ」のように関数を示すブロック）を示す識別子として関数の呼び出し元アドレスを利用する。しかしながら、アプリケーションプログラムによりＤＬＬが読み込まれる場合に、必ずしも同じアドレスに読み込まれるとは限らない。このため、例えば、関数の呼び出し元アドレスの形式として絶対アドレスの形式を用いると、ＤＬＬが読み込まれる場所によってＤＤＬ内部の関数の呼び出し元アドレスも異なってしまう。そこで、正解データ記憶部１３２に正解データを記憶する場合に、ＤＬＬの先頭からの相対アドレスの形式を用いる。例えば、ＤＤＬのデータが格納されているメモリ内のアドレスの先頭から、ＤＬＬ内の関数のデータが格納されているメモリ内のアドレスまでの位置関係を相対的に示したアドレスを用いる。これにより、ＤＬＬが読み込まれる場所によって、関数の呼び出し元アドレスが変更してしまうことを回避できる。
【００５３】
例えば、ＡＬＳＲ（Address  Layout  Space  Randomization）が有効な状態の場合、ＤＬＬのロード場所がランダムに決定される。上述したように、相対アドレスの形式で正解データ記憶部１３２に正解データを記憶することにより、ＡＬＳＲが有効な状態であっても、上述した実施例１の異常検知装置１００によるアプリケーションの異常な動作の検知処理（図７参照）を有効に機能させることができる。
【００５４】
（３）装置構成等
図１に示した異常検知装置１００の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。例えば、異常検知装置１００が有する各構成要素の分散・統合の具体的形態は図示のものに限られず、例えば、比較部１４２と検知部１４３と機能的または物理的に統合することもできる。このように、異常検知装置１００の全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。
【００５５】
（４）異常検知プログラム
また、上記の実施例１で説明した異常検知装置１００の各種の処理機能（例えば、図７等参照）は、あらかじめ用意されたプログラムをパーソナルコンピュータやワークステーションなどのコンピュータシステムで実行することによって実現することもできる。
【００５６】
そこで、以下では、図１０を用いて、上記の実施例１で説明した異常検知装置１００の処理機能と同様の処理機能を実現する異常検知プログラムを実行するコンピュータの一例を説明する。図１０は、異常検知プログラムを実行するコンピュータの一例を示す図である。
【００５７】
同図に示すように、異常検知装置としてコンピュータ２００は、各種演算処理を実行するＣＰＵ（Central  Processing  Unit）２１０を有する。また、コンピュータ２００は、ユーザからデータの入力を受け付ける入力装置２２０および出力装置２３０を有する。
【００５８】
なお、入力装置２２０は、例えば、キーボードやマウスなどに該当する。また、出力装置２３０は、モニタやディスプレイなどに該当する。なお、入力装置２２０がマウスを有する場合には、出力装置２３０が有するモニタと協働して、ポインティングデバイス機能を実現することもできる。また、入力装置２２０がタッチパッドなどの他の入力デバイスを有する場合にも、マウスの場合と同様にポインティングデバイス機能を実現できる。装置管理者は、ポインティングデバイス機能を利用して、コンピュータ２００に関する各種設定を行うこともできる。
【００５９】
また、コンピュータ２００は、図１０に示すように、記憶媒体からプログラム等を読取る媒体読取装置２４０と、ネットワークを介して他のコンピュータとの間でデータの授受を行うネットワークインターフェース装置２５０を有する。また、コンピュータ２００は、図１０に示すように、各種情報を一時記憶するＲＡＭ（Random  Access  Memory）２６０と、ハードディスク装置２７０とを有する。そして、各装置２１０〜２７０は、バス２８０に接続される。
【００６０】
なお、上述したＣＰＵ２１０の代わりに、例えば、ＭＰＵ（Micro  Processing  Unit）などの電子回路、ＡＳＩＣ（Application  Specific  Integrated  Circuit）やＦＰＧＡ(Field  Programmable  Gate  Array)などの集積回路を用いることもできる。また、ＲＡＭ２６０の代わりに、フラッシュメモリ(flash  memory)などの半導体メモリ素子を用いることもできる。
【００６１】
ハードディスク装置２７０には、上述した異常検知装置１００により実行される処理と同様の機能を発揮する異常検知プログラム２７１および異常検知用データ２７２が記憶されている。なお、この異常検知プログラム２７１を適宜分散させて、ネットワークを介して通信可能に接続された他のコンピュータの記憶部に記憶させておくこともできる。
【００６２】
そして、ＣＰＵ２１０が、異常検知プログラム２７１をハードディスク装置２７０から読み出してＲＡＭ２６０に展開することにより、図１０に示すように、異常検知プログラム２７１は異常検知プロセス２６１として機能する。異常検知プロセス２６１は、ハードディスク装置２７０から読み出した異常検知用データ２７２等の各種データを適宜ＲＡＭ２６０上の自身に割当てられた領域に展開し、この展開した各種データに基づいて各種処理を実行する。
【００６３】
なお、異常検知プロセス２６１は、例えば、図１に示した異常検知装置１００が有する制御部１４０の格納部１４１、比較部１４２および検知部１４３等にて実行される処理に対応する。
【００６４】
なお、異常検知プログラム２７１については、必ずしも最初からハードディスク装置２７０に記憶させておく必要はない。例えば、コンピュータ２００に挿入されるフレキシブルディスク（ＦＤ）、ＣＤ−ＲＯＭ、ＤＶＤディスク、光磁気ディスク、ＩＣカードなどの「可搬用の物理媒体」に各プログラムを記憶させておく。そして、コンピュータ２００がこれらから各プログラムを読み出して実行するようにしてもよい。
【００６５】
さらには、公衆回線、インターネット、ＬＡＮ、ＷＡＮなどを介してコンピュータ２００に接続される「他のコンピュータ（またはサーバ）」などに各プログラムを記憶させておく。そして、コンピュータ２００がこれらから各プログラムを読み出して実行するようにしてもよい。
【００６６】
（５）異常検知方法
上記の実施例１で説明した異常検知装置１００により、例えば、以下のような異常検知方法が実現される。
【００６７】
すなわち、アプリケーションプログラムにより呼び出される関数の呼び出し履歴を記憶部に格納する格納ステップと、監視対象とする特定の関数がアプリケーションプログラムにより呼び出されるイベントが発生した場合に、イベントの発生に伴って特定の関数が呼び出されるまでの関数間の呼び出し関係を記憶部に記憶されている履歴から取得するとともに、監視対象とする特定の関数がアプリケーションプログラムにより呼び出されるまでの関数間の正常な呼び出し関係を特定の関数ごとに予め記憶する正常順序記憶部からイベントの発生に伴って呼び出される特定の関数の正常な呼び出し関係を取得し、記憶部から取得した呼び出し関係と、正常順序記憶部から取得した正常な呼び出し関係とを比較する比較ステップと、比較ステップによる比較の結果、記憶部から取得した呼び出し関係と、正常順序記憶部から取得した正常な呼び出し関係とが一致しない場合には、イベントに伴う関数の呼び出し動作を異常な動作として検知する検知ステップとを含む異常検知方法が実現される。
【００６８】
なお、上述した記憶部は、例えば、図１に示すスタックフレーム記憶部１３１に該当し、上述した正常順序記憶部は、図１に示す正解データ記憶部１３２に該当し、上述した格納ステップは、図１に示す格納部１４１により実行される処理に該当し、上述した比較ステップは、図１に示す比較部１４２により実行される処理に該当し、上述した検知ステップは、図１に示す検知部１４３により実行される処理に該当する。
【産業上の利用可能性】
【００６９】
以上のように、本発明にかかる異常検知装置、異常検知プログラムおよび異常検知方法は、コンピュータシステム内部の異常な動作を検知する処理を行う場合に有用であり、特に、不正なプログラムにより攻撃や侵入されたアプリケーションの異常な動作を検知することに適している。
【符号の説明】
【００７０】
１００  異常検知装置
１１０  入力部
１２０  出力部
１３０  記憶部
１３１  スタックフレーム記憶部
１３２  正解データ記憶部
１４０  制御部
１４１  格納部
１４２  比較部
１４３  検知部
２００  コンピュータ
２１０  ＣＰＵ
２２０  入力装置
２３０  出力装置
２４０  媒体読取装置
２５０  ネットワークインターフェース装置
２６０  ＲＡＭ
２６１  異常検知プロセス
２７０  ハードディスク装置
２７１  異常検知プログラム
２７２  異常検知用データ
２８０  バス
【図１】
2011258019.tif 000003
【図２】
2011258019.tif 000004
【図３】
2011258019.tif 000005
【図４】
2011258019.tif 000006
【図５】
2011258019.tif 000007
【図６】
2011258019.tif 000008
【図７】
2011258019.tif 000009
【図８】
2011258019.tif 000010
【図９】
2011258019.tif 000011
【図１０】
2011258019.tif 000012