(57)【要約】  解析機能付与装置（１０）は、スクリプトエンジンを監視しながら実行し、ＡＰＩトレースとブランチトレースとを含む実行トレースを取得する実行トレース取得部（１２１）と、実行トレースを解析し、フックを施して解析用コードを挿入する箇所であるフックポイントを検出するフックポイント検出部（１２２）と、フックポイントでの監視に基づいて、解析用コードによってログ出力するメモリ監視箇所であるタップポイントを検出するタップポイント検出部（１２３）と、フックポイント及びタップポイントに基づいて、スクリプトエンジンにフックを施して解析機能を付与する解析機能付与部（１２４）と、を有する。
2020075335.tif 000002
【特許請求の範囲】
【請求項１】
スクリプトエンジンを監視しながら実行し、ＡＰＩ（Application  Programming  Interface）トレースとブランチトレースとを含む実行トレースを取得する取得部と、
前記実行トレースを解析し、フックを施して解析用コードを挿入する箇所であるフックポイントを検出する第１の検出部と、
前記フックポイントでの監視に基づいて、解析用コードによってログ出力するメモリ監視箇所であるタップポイントを検出する第２の検出部と、
前記フックポイント及び前記タップポイントに基づいて、スクリプトエンジンにフックを施して解析機能を付与する付与部と、
を有することを特徴とする解析機能付与装置。
【請求項２】
前記第１の検出部は、複数の条件を変えた前記実行トレースの間に見られる差分に基づいて前記フックポイントを検出する第１の解析部を有することを特徴とする請求項１に記載の解析機能付与装置。
【請求項３】
前記第１の解析部は、相同性の高い系列が特定の回数出現することを検出するアルゴリズムを用いて前記フックポイントを検出することを特徴とする請求項２に記載の解析機能付与装置。
【請求項４】
前記第１の解析部は、相同性の高い系列が特定の回数出現することを検出するアルゴリズムとして改変されたSmith-Watermanアルゴリズム用いることを特徴とする請求項３に記載の解析機能付与装置。
【請求項５】
前記第１の検出部は、解析対象の言語要素に対応したシステムＡＰＩからのバックトレースを適用して前記フックポイントを検出する第２の解析部を有することを特徴とする請求項１〜４のいずれか一つに記載の解析機能付与装置。
【請求項６】
前記第２の検出部は、タップポイントを持ったフックポイント候補をフックポイントとして確定することを特徴とする請求項１〜５のいずれか一つに記載の解析機能付与装置。
【請求項７】
解析機能付与装置が実行する解析機能付与方法であって、
スクリプトエンジンを監視しながら実行し、ＡＰＩ（Application  Programming  Interface）トレースとブランチトレースとを含む実行トレースを取得する工程と、
前記実行トレースを解析し、フックを施して解析用コードを挿入する箇所であるフックポイントを検出する工程と、
前記フックポイントでの監視に基づいて、解析用コードによってログ出力するメモリ監視箇所であるタップポイントを検出する工程と、
前記フックポイント及び前記タップポイントに基づいて、スクリプトエンジンにフックを施して解析機能を付与する工程と、
を含んだことを特徴とする解析機能付与方法。
【請求項８】
スクリプトエンジンを監視しながら実行し、ＡＰＩ（Application  Programming  Interface）トレースとブランチトレースとを含む実行トレースを取得するステップと、
前記実行トレースを解析し、フックを施して解析用コードを挿入する箇所であるフックポイントを検出するステップと、
前記フックポイントでの監視に基づいて、解析用コードによってログ出力するメモリ監視箇所であるタップポイントを検出するステップと、
前記フックポイント及び前記タップポイントに基づいて、スクリプトエンジンにフックを施して解析機能を付与するステップと、
をコンピュータに実行させるための解析機能付与プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、解析機能付与装置、解析機能付与方法及び解析機能付与プログラムに関する。
【背景技術】
【０００２】
マルウェアを用いたスパム（マルスパム）やファイルレスマルウェアなどの多様な攻撃の形態が生じるに伴って、悪性な挙動を示すスクリプト（悪性スクリプト）による攻撃の脅威が顕在化している。【０００３】
悪性スクリプトとは、スクリプトエンジンの提供する機能を悪用して攻撃を実現するプログラムである。一般に、オペレーティングシステム（ＯＳ（Operating  System））がデフォルトで有するスクリプトエンジンや、Ｗｅｂブラウザや文書ファイルのビューアなど、特定のアプリケーションの具備するスクリプトエンジンを用いて攻撃が実施される。【０００４】
こうしたスクリプトエンジンの多くは、ユーザの許可が必要な場合もあるものの、ファイル操作やネットワーク通信、プロセスの起動など、システムを介した挙動も実現可能である。したがって、悪性スクリプトを用いた攻撃は、実行ファイルのマルウェアを用いた攻撃と同様に、ユーザに対しての脅威となる。【０００５】
悪性スクリプトによる攻撃に対策を講じるためには、スクリプトの持つ挙動を正確に把握する必要がある。したがって、スクリプトを解析することによって、その挙動を明らかにする技術が希求される。【０００６】
悪性スクリプトを解析する際に生じる問題として、コードの難読化がある。悪性スクリプトの多くは、難読化と呼ばれる、解析を妨害する処理が施されている。難読化は、故意にコードの複雑さを高めることによって、コードの表層的な情報に基づいて解析するのを困難にする。すなわち、難読化は、スクリプトを実行せずに、コードから得られる情報で解析する、静的解析と呼ばれる解析方法を妨害する。【０００７】
特に、実行するコードの一部を外部から動的に取得する場合は、そのコードは実行しなければ得られないため、静的には解析できない。したがって、静的解析はその原理上、不可能となる。【０００８】
一方で、スクリプトを実行し、その振る舞いを監視することによって挙動を知る動的解析と呼ばれる手法は、前述のような難読化の影響を受けない。このため、悪性スクリプトの解析においては、動的解析に基づく手法が主に用いられている。【０００９】
悪性スクリプトの動的解析では、フックが一般に用いられる。フックとは、プログラム中の特定の箇所に、独自の処理を追加するための仕組みである。悪性スクリプトのコードを監視するために、フックを用いてログ出力処理を追加することで、スクリプトの実行状態を把握することで解析する。【００１０】
スクリプトを解析するためのフック手法として、フックを施す箇所によって大きく３つの方式が存在する。スクリプトレベルフック、システムレベルフック、スクリプトエンジンレベルフックである。【００１１】
スクリプトレベルフックは、解析対象のスクリプトに対して直接フックを施す方式である。悪性スクリプトは、前述の通り一般に難読化されているため、解析者に有用な情報を得られるフックの挿入箇所をスクリプト内から発見するのは容易ではない。したがって、フックは、特定の言語要素をオーバーライドすることによって実現される。ここで、言語要素とは、スクリプト言語がプログラマに提供する機能単位を指す。言語要素には、あらかじめ用意された関数やメソッド、ステートメントなどがある。例えば、JavaScript（登録商標）の提供するeval関数やdocument.writeメソッド、VBScriptの提供するCreateObjectステートメントは、それぞれ一つの言語要素である。【００１２】
システムレベルフックは、システムＡＰＩ（Application  Programming  Interface）やシステムコールにフックを施す方式である。システムレベルフックは、フックを施した上で、スクリプトエンジンのプロセスを監視しながらスクリプトを実行させることで、解析を実現する。【００１３】
スクリプトエンジンレベルフックは、スクリプトエンジン内の特定の機能にフックを施す方法である。一般に、スクリプトエンジンのプログラムコードのどの部分がフックを施したい箇所と対応しているかは自明でないため、スクリプトエンジンを解析するなどしてフックを施す箇所を特定する必要がある。その上で、スクリプトエンジンレベルフックでは、当該箇所にフックを施し、スクリプトを実行することによって解析する。【００１４】
これらは、いずれも実用されている方式であり、これらを応用した複数の解析手法が提案されている。たとえば、非特許文献１には、JavaScript  API  hookingと呼ばれる、JavaScriptの提供する関数のオーバーライドによってフックする方法で、JavaScriptを解析するフレームワークを作成する手法が記載されている。これは、スクリプトレベルフックの一例と言える。この手法によれば、JavaScriptで記述されたスクリプトの挙動を解析できる。【００１５】
また、非特許文献２には、仮想マシンモニタ（ＶＭＭ（Virtual  Machine  Monitor））上でハードウェアブレークポイントを用いてシステムコールをフックし、Windowsの特定のデータ構造を参照しながら実行することで、スレッドレベルでのシステムコールトレースのログを取得している。この手法によれば、スクリプトを実行中のスクリプトエンジンのシステムコールトレースを取得することで、スクリプトエンジン越しにスクリプトの挙動を解析できる。これは、システムレベルフックの一例と言える。【００１６】
非特許文献３には、ＶＭＭ上にテイント解析と呼ばれるデータフローを解析する機能を実装し、解析対象のコードを正確に追跡したＡＰＩフックを実現している。この手法によれば、スクリプトを実行中のスクリプトエンジンのＡＰＩを取得することで、やはりスクリプトエンジン越しにスクリプトの挙動を解析できる。これもまた、システムレベルフックの一例と言える。【００１７】
非特許文献４には、オープンソースのスクリプトエンジン（この文献ではActionScript）に改変を加えて、メソッドの呼び出しやプロパティへのアクセス、クラスの生成などをトレースする機能を付加している。これは、スクリプトエンジンレベルフックの一例といえる。この手法によれば、スクリプトの挙動を解析できる。
【先行技術文献】
【非特許文献】
【００１８】
【非特許文献１】柴田  龍平，羽田  大樹，横山  恵一,  “Js-Walker：JavaScript  API  hookingを用いた解析妨害JavaScriptコードのアナリスト向け解析フレームワーク”，コンピュータセキュリティシンポジウム2016  論文集，情報処理学会，pp.  951-957,  2016.
【非特許文献２】大月  勇人，瀧本  栄二，齋藤  彰一，毛利  公一，  “マルウェア観測のための仮想計算機モニタを用いたシステムコールトレース手法”，情報処理学会論文誌，Vol.  55，No.  9，pp.  2034-2046，2014．
【非特許文献３】Y.  Kawakoya,  M.  Iwamura,  E.  Shioji,  and  T.  Hariu,  “  API  Chaser:  Anti-analysis  Resistant  Malware  Analyzer”,  International  Workshop  on  Recent  Advances  in  Intrusion  Detection,  Springer,  pp.  123-143,  2013.
【非特許文献４】T.  Van  Overveldt,  C.  Kruegel,  and  G.  Vigna,  “FlashDetect:  ActionScript  3  Malware  Detection”,  International  Workshop  on  Recent  Advances  in  Intrusion  Detection,  Springer,  pp.  274-293,  2012.
【非特許文献５】B.  Dolan-Gavitt,  T.  Leek,  M.  Zhivich,  J.  Giffin,  and  W.  Lee,  “Virtuoso:  Narrowing  the  Semantic  Gap  in  Virtual  Machine  Introspection”,  Proceedings  of  the  IEEE  Symposium  on  Security  and  Privacy  (SP)  2011,  IEEE,  pp.  297-312,  2011.
【非特許文献６】B.  Dolan-Gavitt,  T.  Leek,  J.  Hodosh,  and  W.  Lee,  “Tappan  Zee  (North)  Bridge:  Mining  Memory  Accesses  for  Introspection”,  Proceedings  of  the  2013  ACM  SIGSAC  conference  on  Computer  &  Communications  Security,  ACM,  pp.  839-850,  2013.
【発明の概要】
【発明が解決しようとする課題】
【００１９】
しかしながら、非特許文献１に記載のスクリプトレベルフックによる手法では、ビルトイン関数など、言語要素のオーバーライドが可能であるという言語仕様に依存しており、そうした言語仕様を持った特定のスクリプト言語に対してのみ実現可能であるため、汎用性に乏しいという課題があった。【００２０】
また、非特許文献２及び非特許文献３に記載のシステムレベルフックによる手法では、解析対象のスクリプトと、監視箇所のシステムコールやシステムＡＰＩの間に隔たりがあるため、セマンティックギャップが生じるという課題があった。【００２１】
セマンティックギャップとは、意味上の隔たりのことを指す。スクリプト自身や、その近傍のスクリプトエンジンのレベルで監視した際に得られる情報と、スクリプトとの隔たりがあるシステムのレベルで監視した際に得られる情報とで、得られる情報量が変化することをセマンティックギャップという。【００２２】
たとえば、スクリプトのレベルではDocument.Cookie.Setという言語要素で観測されたCookieの操作が、システムのレベルではCookieに関するファイルへの単なるWriteFileとして観測される。これにより、Cookieの操作からファイルの操作へと意味上の情報量が減少している。これをセマンティクスの喪失と言い、セマンティックギャップによって生じる課題となる。【００２３】
そして、非特許文献４に記載のスクリプトエンジンレベルフックによる手法では、スクリプトエンジンというスクリプトの近傍で挙動を監視できるためセマンティックギャップは生じないものの、どのようにフックを実装するかがスクリプトエンジンの実装に依存するために自明でないという課題がある。すなわち、スクリプトエンジン中でフックを施して解析用のコードを挿入する箇所（フックポイントと呼ぶ）と、解析用のコードによってログとして出力されるメモリ監視箇所（タップポイントと呼ぶ）が分からないため、解析によって明らかにする必要がある。【００２４】
この解析作業は、オープンソースのスクリプトエンジンに対しては、ソースコードの解析によって実現できるが、ソースコードが得られるスクリプト言語に限られ、一定の工数も要する。さらに、プロプライエタリのスクリプトエンジンについては、バイナリのリバースエンジニアリングの必要があり、人手での実施には熟練したリバースエンジニアと多大な工数を要するため、現実的でない。さらに、そのリバースエンジニアリングの自動化は、確立されていない。【００２５】
一方、スクリプトエンジンレベルフックの課題は、スクリプトレベルフックやシステムレベルフックの抱える課題と異なり、原理的には解決が可能である。すなわち、スクリプトエンジンのバイナリからフックポイント及びタップポイントを検出し、自動的にフックを施すことができれば、任意のスクリプトエンジンに対して、セマンティックギャップのない解析機能を持たせられる。【００２６】
これに対し、非特許文献５及び非特許文献６では、ＶＭＭ上のＯＳの上で実行されるアプリケーションに対して、自動的なリバースエンジニアリングにより、特定の機能を持ったコード部分を抽出する解析手法と、タップポイントを検出する解析手法を提案している。【００２７】
しかしながら、非特許文献５及び非特許文献６に記載の手法では、フックポイントの検出は実現しておらず、適用対象もスクリプトエンジンではないため、スクリプトエンジンへの自動的なフックの実現には至っていないという課題があった。【００２８】
本発明は、上記に鑑みてなされたものであって、スクリプト言語の言語仕様によらずに任意に適用可能であり、セマンティックギャップを生じることのない解析機能の付与を実現できる解析機能付与装置、解析機能付与方法及び解析機能付与プログラムを提供することを目的とする。
【課題を解決するための手段】
【００２９】
上述した課題を解決し、目的を達成するために、本発明に係る解析機能付与装置は、スクリプトエンジンを監視しながら実行し、ＡＰＩトレースとブランチトレースとを含む実行トレースを取得する取得部と、実行トレースを解析し、フックを施して解析用コードを挿入する箇所であるフックポイントを検出する第１の検出部と、フックポイントでの監視に基づいて、解析用コードによってログ出力するメモリ監視箇所であるタップポイントを検出する第２の検出部と、フックポイント及びタップポイントに基づいて、スクリプトエンジンにフックを施して解析機能を付与する付与部と、を有することを特徴とする。
【発明の効果】
【００３０】
本発明によれば、スクリプト言語の言語仕様によらずに任意に適用可能であり、セマンティックギャップを生じることのない解析機能の付与を実現できる。
【図面の簡単な説明】
【００３１】
【図１】図１は、実施の形態に係る解析機能付与装置の処理の概要を例示する模式図である。
【図２−１】図２−１は、図１に示すテストスクリプトの一例を示す図である。
【図２−２】図２−２は、図１に示すテストスクリプトの一例を示す図である。
【図２−３】図２−３は、図１に示すテストスクリプトの一例を示す図である。
【図３】図３は、実行トレースの一例を示す図である。
【図４】図４は、図１に示す実行トレースデータベース（ＤＢ）が記憶するデータのデータ構成の一例を示す図である。
【図５】図５は、フックポイントＤＢが記憶するデータのデータ構成の一例を示す図である。
【図６】図６は、タップポイントＤＢが記憶するデータのデータ構成の一例を示す図である。
【図７】図７は、バックトレース解析部の処理の一例を示す図である。
【図８】図８は、差分実行解析部の処理の一例を示す図である。
【図９】図９は、改変を施したSmith-Watermanアルゴリズムの処理の一例を示す図である。
【図１０】図１０は、タップポイント検出部の処理の一例を示す図である。
【図１１】図１１は、実施の形態に係る解析機能付与方法の処理手順を示すフローチャートである。
【図１２】図１２は、図１１に示す実行トレース取得処理の処理手順を示すフローチャートである。
【図１３】図１３は、図１１に示すバックトレース解析処理の処理手順を示すフローチャートである。
【図１４】図１４は、図１１に示す差分実行解析処理の処理手順を示すフローチャートである。
【図１５】図１５は、図１４に示す改変Smith-Watermanアルゴリズム適用処理の処理手順を示すフローチャートである。
【図１６】図１６は、図１１に示すタップポイント検出処理の処理手順を示すフローチャートである。
【図１７】図１７は、図１１に示す解析機能付与処理の処理手順を示すフローチャートである。
【図１８】図１８は、プログラムが実行されることにより、解析機能付与装置が実現されるコンピュータの一例を示す図である。
【発明を実施するための形態】
【００３２】
以下、図面を参照して、本発明の一実施形態を詳細に説明する。なお、この実施形態により本発明が限定されるものではない。また、図面の記載において、同一部分には同一の符号を付して示している。
【００３３】
［実施の形態］
本実施の形態に係る解析機能付与装置について、解析機能付与装置の概略構成、及び解析機能付与装置における処理の流れ及び具体例を説明する。本実施の形態に係る解析機能付与装置は、テストスクリプトを用いてスクリプトエンジンバイナリを解析することにより、フックポイントとタップポイントを検出する。
【００３４】
ここで、フックポイントとは、フックを施して解析用コードを挿入する箇所である。本実施の形態においては、スクリプトエンジンの内部実装が持つ関数（内部関数と呼ぶ）を単位とし、フックはこの内部関数の先頭に施されるものとする。また、タップポイントとは、解析用コードによってログ出力するメモリ監視箇所であり、内部関数の引数のいずれかであるとする。
【００３５】
まず、この解析機能付与装置は、スクリプトエンジンバイナリに対して、システムＡＰＩのフックと、分岐命令のフックにより、ＡＰＩトレースとブランチトレースを含む実行トレースを取得する。ただし、ＡＰＩトレースは、実行されたシステムＡＰＩを記録したものであり、ブランチトレースは、実行された分岐を記録したものである。
【００３６】
そして、この解析機能付与装置は、この実行トレースを解析し、フックポイントを検出する。フックポイントの検出には、システムＡＰＩの呼び出しから遡って探索するバックトレース解析と、少しずつ条件を変えて取得した複数の実行トレースの差分を基に解析する差分実行解析の２つの解析手法を適用する。これらによって検出されたフックポイントを、フックポイントの候補とする。
【００３７】
さらに、この解析機能付与装置は、このフックポイント候補にフックを施して、フックされた関数の引数を探索することで、タップポイントを検出する。すなわち、解析機能付与装置は、フックポイント候補の関数の引数に、テストスクリプトの引数が見られれば、そのフックポイント候補を有効なフックポイントとして確定し、また、その引数をタップポイントとする。
【００３８】
そして、解析機能付与装置は、こうして得られたフックポイントとタップポイントに基づいて、スクリプトエンジンバイナリに対して、フックを施す。解析機能付与装置は、このフックによって、フックポイントに、フックポイントに対応した言語要素と、タップポイントのメモリをログ出力するコードを挿入する。解析機能付与装置では、このフックによって、スクリプトが実行された際に、スクリプト言語のどの言語要素が、どんな引数を伴って実行されたかがログ出力されるようになる。これにより、解析機能付与装置は、スクリプトエンジンに後付けでの解析機能の付与を実現する。
【００３９】
［解析機能付与装置１０の構成］
まず、図１を参照して、実施の形態に係る解析機能付与装置１０の構成について説明する。図１は、実施の形態に係る解析機能付与装置１０の構成の一例を説明するための図である。
【００４０】
図１に示すように、解析機能付与装置１０は、入力部１１、制御部１２、出力部１３、記憶部１４、実行トレースＤＢ２１、フックポイントＤＢ２２及びタップポイントＤＢ２３を有する。また、制御部１２は、実行トレース取得部１２１（取得部）、フックポイント検出部１２２（第１の検出部）、タップポイント検出部１２３（第２の検出部）、解析機能付与部１２４（付与部）を有する。また、フックポイント検出部１２２は、バックトレース解析部１２２１（第２の解析部）及び差分実行解析部１２２２（第１の解析部）を有する。そして、解析機能付与装置１０は、テストスクリプト及びスクリプトエンジンバイナリの入力を受け付ける。
【００４１】
入力部１１は、キーボードやマウス等の入力デバイスで構成され、外部からの情報の入力を受け付け、制御部１２に入力する。入力部１１は、テストスクリプト及びスクリプトエンジンバイナリの入力を受け付け、制御部１２に出力する。
【００４２】
ここで、テストスクリプトは、スクリプトエンジンを動的解析して実行トレースを取得する際に、入力されるスクリプトである。テストスクリプトの詳細は後述する。また、スクリプトエンジンバイナリは、スクリプトエンジンを構成する実行可能ファイルである。スクリプトエンジンバイナリは、複数の実行可能ファイルによって構成される場合がある。
【００４３】
制御部１２は、各種の処理手順などを規定したプログラム及び所要データを格納するための内部メモリを有し、これらによって種々の処理を実行する。例えば、制御部１２は、ＣＰＵ（Central  Processing  Unit）やＭＰＵ（Micro  Processing  Unit）などの電子回路である。制御部１２は、実行トレース取得部１２１、フックポイント検出部１２２、タップポイント検出部１２３、解析機能付与部１２４を有する。
【００４４】
実行トレース取得部１２１は、テストスクリプト及びスクリプトエンジンバイナリを入力として受け付ける。実行トレース取得部１２１は、スクリプトエンジンバイナリの実行を監視しながら、テストスクリプトを実行することで、実行トレースを取得する。実行トレースは、ＡＰＩトレースとブランチトレースで構成される。ＡＰＩトレースは、実行の際に、呼び出されたシステムＡＰＩとその引数を記録したものである。ブランチトレースは、実行の際の分岐命令の種類と、分岐元アドレスと分岐先アドレスを記録する。ＡＰＩトレースは、ＡＰＩフックと呼ばれる手法によって取得可能であり、ブランチトレースは命令フックによって取得可能であることが知られている。実行トレース取得部１２１は、取得した実行トレースを、実行トレースＤＢ２１に格納する。
【００４５】
フックポイント検出部１２２は、バックトレース解析部１２２１と差分実行解析部１２２２を有する。フックポイント検出部１２２は、実行トレースＤＢ２１に格納された実行トレースを取り出して解析し、フックポイントの候補を発見する。バックトレース解析部１２２１と差分実行解析部１２２２とは、いずれもこのフックポイントの候補を検出する役目を果たす。フックポイント検出部１２２は、実行トレースをバックトレース解析部１２２１に入力する。
【００４６】
バックトレース解析部１２２１は、実行トレースに対して、解析対象に関連したシステムＡＰＩの呼び出しを探索し、そこからのバックトレースによってフックポイント候補を検出する。言い換えると、バックトレース解析部１２２１は、解析対象の言語要素に対応したシステムＡＰＩからのバックトレースを適用してフックポイントを検出する。
【００４７】
差分実行解析部１２２２は、取得条件の異なる複数の実行トレースの差分を抽出し、特定の条件を満たす部分を発見することでフックポイント候補を検出する。差分実行解析部１２２２は、複数の条件を変えた実行トレースの間に見られる差分に基づいてフックポイントを検出する。この際、差分実行解析部１２２２は、相同性の高い系列が特定の回数出現することを検出するアルゴリズムを用いてフックポイントを検出する。例えば、差分実行解析部１２２２は、相同性の高い系列が特定の回数出現することを検出するアルゴリズムとして改変されたSmith-Watermanアルゴリズム用いる。
【００４８】
タップポイント検出部１２３は、フックポイント検出部１２２によって得られたフックポイント候補にフックを施し、そのフックが施された関数の引数のメモリを探索することで、タップポイントを検出する。タップポイント検出部１２３は、フックポイントでの監視に基づいて、解析用コードによってログ出力するメモリ監視箇所であるタップポイントを検出する。また、タップポイント検出部１２３は、タップポイントを持ったフックポイント候補を、フックポイントとして確定する。
【００４９】
解析機能付与部１２４は、得られたフックポイント及びタップポイントに対してフックを施し、フックポイントに対応した言語要素と、タップポイントに現れる引数をログ出力することで、スクリプトエンジンに解析機能を付与する。言い換えると、解析機能付与部１２４は、フックポイント及びタップポイントに基づいて、スクリプトエンジンにフックを施して解析機能を付与する。
【００５０】
出力部１３は、例えば、液晶ディスプレイやプリンタ等であって、解析機能付与に関する情報を含む各種情報を出力する。また、出力部１３は、外部装置との間で、各種データの入出力を司るインタフェースであってもよく、外部装置に各種情報を出力してもよい。
【００５１】
記憶部１４は、ＲＡＭ（Random  Access  Memory）、フラッシュメモリ（Flash  Memory）等の半導体メモリ素子、または、ハードディスク、光ディスク等の記憶装置によって実現され、解析機能付与装置１０を動作させる処理プログラムや、処理プログラムの実行中に使用されるデータなどが記憶される。
【００５２】
実行トレースＤＢ２１は、実行トレース取得部１２１が取得した実行トレースを記憶する。フックポイントＤＢ２２は、差分実行解析部１２２２が検出したフックポイント候補を記憶する。タップポイントＤＢ２３は、タップポイント検出部１２３が検出したタップポイントを記憶する。
【００５３】
［テストスクリプトの構成］
まず、テストスクリプトについて説明する。図２−１〜図２−３は、テストスクリプトの一例を示す図である。
【００５４】
テストスクリプトとは、スクリプトエンジンを動的解析する際に入力されるスクリプトである。このテストスクリプトは、スクリプトエンジンにおいて解析したい言語要素を指定する働きを果たす。したがって、本実施の形態では、解析対象の言語要素のみを含んだスクリプトを用いる。たとえば、CreateObjectという言語要素に関する処理を解析してこの言語要素のフックポイント及びタップポイントを獲得したい場合は、図２−１のように、CreateObjectのみを呼び出すテストスクリプトを作成する。このテストスクリプトは解析の事前に準備するものであり、手動で作成するものである。この作成には、対象のスクリプト言語の仕様に関する知識が必要となる。
【００５５】
バックトレース解析のためのテストスクリプトでは、言語要素の引数のうちで任意に設定可能なものに、特徴的な値を設定する。これにより、スクリプトで渡された引数が、スクリプトエンジンによって最終的にどのシステムＡＰＩに渡されたのかを判別する。
【００５６】
差分実行解析では、図２−２に示すテストスクリプト（差分実行解析用Ａ）と図２−３に示すテストスクリプト（差分実行解析用Ｂ）のように、複数のテストスクリプトを用いる。そして、差分実行解析では、それぞれに対する実行トレースを比較することで、フックポイントを検出する。テストスクリプトには、差分実行解析用Ａのように解析対象の言語要素を１回のみ呼び出すスクリプトと、差分実行解析用Ｂのように複数回呼び出すスクリプトとを用意する。これにより、解析機能付与装置１０は、実行トレースを比較した際に、複数回現れるトレース部分を捉えることで、言語要素に関わる部分を特定できる。
【００５７】
［実行トレースの構成］
次に、実行トレースについて説明する。図３は、実行トレースの一例を示す図である。実行トレースは、前述の通り、ＡＰＩトレースとブランチトレースによって構成されている。図３は、実行トレースの一部を切り出したものである。以降、図３を用いて実行トレースの構成を示す。
【００５８】
ブランチトレースのログ行は、たとえば、図３の１行目から１０行目に記載の書式になっており、「type」、「from」、「to」の3つの要素からなる。「type」には、実行された分岐命令がcall命令によるものか、jmp命令によるものか、ret命令によるものかが示される。また、「from」には分岐元のアドレスが示される。「to」には分岐先のアドレスが示される。
【００５９】
ＡＰＩトレースのログ行は、たとえば、図３の１１行目から１３行目に記載の書式になっており、「type」、「name」、「argindex」、「argname」、「arg」の5つの要素からなる。「type」には、ＡＰＩトレースのログ行であることが示されるため、ＡＰＩという値のみをとる。「name」には、ＡＰＩの名前が格納される。また、「argindex」には、ＡＰＩの何番目の引数であるかのインデックスが格納される。「argname」には引数の名前が格納される。「arg」には観測された引数の値が格納される。
【００６０】
［実行トレースＤＢの構成］
次に、実行トレースＤＢ２１が記憶するデータのデータ構成について説明する。図４は、実行トレースＤＢ２１が記憶するデータのデータ構成の一例を示す図である。
【００６１】
実行トレースＤＢ２１は、取得した実行トレースを格納するＤＢである。図４に示すように、実行トレースＤＢ２１は、「id」、「trace_id」、「image_name」、「branch_index」、「branch_type」、「src_addr」、「dst_addr」、「args」のテーブルスキーマを持つ。
【００６２】
「id」は、テーブル全体でユニークになるように割り振られる識別子であり、整数値を持つ。「trace_id」は、取得された実行トレースごとにユニークになるように割り振られる識別子であり、整数値を持つ。「image_name」は、実行トレースを取得している、解析対象のスクリプトエンジンの実行ファイル名である。「branch_index」は、１つの実行トレース内で何番目に記録された分岐かを示す序数である。「branch_type」は、分岐がどの命令によってなされたかを示す。
【００６３】
「branch_type」は、実行トレースで取得する分岐によって、jmp,  call,  retなどをとる。また、「branch_type」は、システムＡＰＩの呼び出しに際しては、呼び出されたシステムＡＰＩの種類も併せて格納する。「src_addr」は、分岐元を保持する。「dst_addr」は分岐先のアドレスを保持する。「image_name」内での分岐の場合は、オフセットを保持してもよい。「Args」には、システムＡＰＩが呼び出された際の引数を記録する。
【００６４】
［フックポイントＤＢの構成］
次に、フックポイントＤＢ２２が記憶するデータのデータ構成について説明する。図５は、フックポイントＤＢ２２が記憶するデータのデータ構成の一例を示す図である。
【００６５】
フックポイントＤＢ２２は、検出されたフックポイント候補を格納するＤＢである。図５に示すように、フックポイントＤＢ２２は、「id」、「trace_id」、「hookpoint_addr」のテーブルスキーマを持つ。
【００６６】
「id」と「trace_id」とは、実行トレースＤＢ２１の持つものと同様である。「hookpoint_addr」は、フックポイント候補のアドレスを保持する。前述の通り、フックポイントは関数の先頭アドレスとなっている。
【００６７】
［タップポイントＤＢの構成］
次に、タップポイントＤＢ２３が記憶するデータのデータ構成について説明する。図６は、タップポイントＤＢ２３が記憶するデータのデータ構成の一例を示す図である。
【００６８】
タップポイントＤＢ２３は、検出されたタップポイント候補を格納するＤＢである。図６に示すように、タップポイントＤＢ２３は、「id」、「trace_id」、「hookpoint_addr」、「tappoint_arg_number」、「variable_type」のテーブルスキーマを持つ。
【００６９】
「id」、「trace_id」及び「hookpoint_addr」は、実行トレースＤＢ２１の持つものと同様である。「tappoint_arg_number」は、フックポイントの指す関数の何番目の引数がタップポイントであるかを示す。また、「variable_type」は、変数の型である。
【００７０】
［バックトレース解析部の処理］
次に、図７を参照して、バックトレース解析部１２２１の処理について説明する。図７は、バックトレース解析部１２２１の処理の一例を説明するための図である。
【００７１】
バックトレースに基づく検出手法は、取得した実行トレースのログを解析することで実現される。このバックトレースに基づく検出手法は、システムとのインタラクションを要する言語要素のフックポイントの検出に用いる。すなわち、システムＡＰＩの呼び出しを伴う言語要素に対して有効である。
【００７２】
この手法は、システムとのインタラクションが必要な言語要素は、スクリプトエンジン内のその言語要素に関わるコード領域から、必要なシステムＡＰＩを呼び出すであろう、という仮定に基づいている。したがって、この検出手法においては、図５の黒塗りの×印にあたるシステムＡＰＩの呼び出しから、白抜きの×印にあたるスクリプトエンジンのコード領域まで矢印Ｙ１〜Ｙ３のように遡って辿っていくことによって、言語要素に関わるコード部分を特定し、そこに存在する言語要素に関わるフックポイントを検出する。
【００７３】
このため、まず、バックトレース解析部１２２１は、スクリプト内で実行している言語要素の引数が、システムＡＰＩの引数として現れている呼び出しを発見する。そして、バックトレース解析部１２２１は、そこからブランチトレースに基づいて呼び出し元を辿り、遡っていく。バックトレース解析部１２２１は、スクリプトエンジンまで遡ったら、そのスクリプトエンジン内の呼び出し箇所からＮ回分の分岐を、フックポイント候補として検出する。ここで、遡りがスクリプトエンジンに辿り着いた点をフックポイントとするのではなく、そこからＮ回遡っている理由は、システムＡＰＩがスタブ等を経由して呼び出される場合を考慮しているためである。このＮには、たとえば、Ｎ＝１０などを用いる。
【００７４】
［差分実行解析部の処理］
次に、もう一つのフックポイント検出手法を用いた、差分実行解析部１２２２の処理を説明する。差分実行解析とは、条件を変更しつつ複数の実行トレースを取得し、その差分を分析することで動的解析する方法である。この検出手法は、システムＡＰＩの呼び出しを伴わない言語要素に対して有効である。
【００７５】
例えば、VBScriptの持つEval関数などはスクリプトエンジンの中で閉じた言語要素であり、システムＡＰＩを呼び出す必要がない。ただし、手動解析の際には、解析者に有用な情報を持つため、興味の対象となる。こうした言語要素に対しては、システムＡＰＩに依存するバックトレースによる検出手法では効果をなさないが、この差分実行解析による手法では、検出が可能となる。要素のみを１回呼び出した場合の実行トレースと、複数回実行した場合の実行トレースとでは、その言語要素に関わるコードの実行トレースのみが差分として現れるであろう、という仮定に基づいている。
【００７６】
差分実行解析部１２２２は、複数のテストスクリプトとその実行トレースを入力として受け付ける。テストスクリプトには、解析対象の言語要素を１回のみ呼び出すスクリプト（たとえば、図２−２の差分実行解析用Ａ）と、複数回呼び出すスクリプト（たとえば、図２−３の差分実行解析用Ｂ）を用意する。そして、差分実行解析部１２２２は、各々の実行トレースを比較することで、差分を検出する。これにより、差分実行解析部１２２２は、実行トレースを比較した際に差分に現れる、解析対象の言語要素に関わるトレース部分を捉える。
【００７７】
図８は、差分実行解析部１２２２の処理の一例を示す図である。図８では、図２−２のテストスクリプト（差分実行解析用Ａ）に対する実行トレース（実行トレースＡとする）と、図２−３のテストスクリプト（差分実行解析用Ｂ）に対する実行トレース（実行トレースＢとする）を比較している。
【００７８】
テストスクリプト（差分実行解析用Ａ）では、解析対象の言語要素であるEval関数が１回のみ呼び出されており、テストスクリプト（差分実行解析用Ｂ）では、複数回（３回）呼び出されている。したがって、実行トレースＡと実行トレースＢとを比較すると、ブランチトレース部分に、図８の部分Ｒ１１，Ｒ２１，Ｒ２３，Ｒ２５のように、実行トレースＡには１回のみ、実行トレースＢには３回現れるブランチトレースの部分集合が見られる。この部分が、解析対象の言語要素のEval関数に対応した分岐の集合であり、フックポイント候補となる。
【００７９】
この抽出は、２つ以上の系列から相同性の高い部分系列を抽出するローカルアラインメントの検出手法である、Smith-Watermanアルゴリズムによって実現できる。ただし、Smith-Watermanアルゴリズムには、先ほど述べた一方に１回、もう一方に３回出現するというような回数の制約は考慮されないため、以下のように改変を施した。
【００８０】
［改変Smith-Watermanアルゴリズムの処理］
次に、図９を用いて改変を施したSmith-Watermanアルゴリズムの処理を説明する。図９は、改変を施したSmith-Watermanアルゴリズムの処理の一例を示す図である。
【００８１】
Smith-Watermanアルゴリズムは、動的計画法（ＤＰ（Dynamic  Programming））に基づく系列アライメントアルゴリズムであり、２つ以上の系列から、相同性の高い部分系列を抽出できる。
【００８２】
このアルゴリズムでは、図９に示すＤＰ表と呼ばれる表を用いる。ＤＰ表では、１つの系列を表頭に、もう１つの系列を表側に配置し、各セルにマッチスコアを記入する。ｘ軸方向の添字をｉ、ｙ軸方向の添字をｊとして、（１）式に基づいてセル（ｉ，ｊ）のスコアＦ（ｉ，ｊ）を算出していく。このＤＰ表の作成までは、通常のSmith-Watermanアルゴリズムと同一である。なお、（１）式におけるｓ（ｉ，ｊ）及びｄは、（２），（３）式のように示される。
【００８３】
【数１】
2020075335.tif 000003
【数２】
2020075335.tif 000004
【００８４】
図９中のＡ，Ｂ，Ｃは合わさって、図８の部分Ｒ１１，Ｒ２１，Ｒ２３，Ｒ２５のそれぞれ１つ分を構成する。Ｓは、図８の実行トレースの最初に現れる部分Ｒ１０，Ｒ２０である。Ｅは、図８の最後に現れる部分Ｒ１２，Ｒ２６である。Ｍは、部分Ｒ２１，Ｒ２３，Ｒ２５の間に現れる部分Ｒ２２，Ｒ２４である。本来、これらの各要素は複数の分岐トレースのログで構成されるが、ここでは簡略化のためアルファベットを利用し、かつ、圧縮している。
【００８５】
ここから、スコアが最大のセル（図７のセルＣ１)からバックトラックしていくことで、最も相同性の高い部分系列(図７内のセルＣ１を含む破線部分Ｗ１、ＳＡＢＣ)を発見して終了するが、改変した手法では、ここからさらに探索を行う。
【００８６】
差分実行解析部１２２２は、アルゴリズムで抽出された部分系列を除いたＤＰ表のうち、同じ行（図７の部分Ｗ１１）に対して、改めて相同性の高い部分系列を抽出する。差分実行解析部１２２２は、この処理をテストスクリプトでの呼び出し回数分繰り返し、抽出された部分系列（図７の部分Ｗ１，Ｗ２，Ｗ３）同士のうち、各々の部分文字列の類似度がいずれも閾値以上である場合には、その部分を構成する分岐トレースのログがフックポイント候補であるとして検出する。一方、各々の部分文字列の類似度がいずれも閾値未満である場合には、差分実行解析部１２２２は、次にスコアの高いセルについて調べていく。
【００８７】
［タップポイント検出部の処理］
次に、図１０を用いてタップポイント検出部１２３の処理を説明する。図１０は、タップポイント検出部１２３の処理の一例を示す図である。
【００８８】
タップポイントの検出は、以下の２点の役割を担う。１点目は、フックポイント検出で得られたフックポイント候補の中から、最終的なフックポイントを確定することである。２点目は、フック時にログ出力するメモリ位置を特定することである。タップポイントは、フックポイントとなっている関数の引数を探索していくことで検出する。
【００８９】
そのために、タップポイント検出部１２３は、ここまでで得られたフックポイント候補にフックを施して、実行トレースを再度取得する。引数は、呼出規約に沿って参照していくことで取得できる。このとき、各引数の型情報は得られないため、さらなる探索にはヒューリスティクスが必要となる。
【００９０】
このヒューリスティクスには、図１０のような探索を用いる。まず、引数がポインタとして参照できない場合は、それが値であるとみる。引数がポインタとして参照できる場合は、ポインタとして参照する。値としてみる場合もポインタとして参照する場合も、様々な型としてみていく。
【００９１】
たとえば、図１０では、int型の値としてみるとともに、LPCSTR型及びLPBSTR型として参照している。この結果、タップポイント検出部１２３は、テストスクリプトで用いている引数がフックポイント候補で観測されれば、そのフックポイントを確定し、引数が得られた点をタップポイントとする。図８の場合、テストスクリプト中の引数にWScript.Shellという引数があったとしたとき、LPBSTR型としてみた際にこの引数が観測されているため、タップポイント検出部１２３は、この引数をタップポイントとして検出する。
【００９２】
もちろん、タップポイント検出部１２３の処理は上述に限るものではなく、その他の探索方式を用いてもよい。たとえば、ヒューリスティクスを用いずに、型情報をリバースエンジニアリングによって獲得する手法（詳細は、例えば、J.  Lee,  T.  Avgerinos,  and  D.  Brumley,  “TIE:  Principled  Reverse  Engineering  of  Types  in  Binary  Programs”,  Network  and  Distributed  System  Security  Symposium,  Internet  Society,  2011.参照）を用いてもよい。
【００９３】
［解析機能付与部の処理］
次に、解析機能付与部１２４の処理を説明する。解析機能付与部１２４は、スクリプトエンジンバイナリと、ここまでの処理で検出されたフックポイント及びタップポイントを入力として受け付ける。解析機能付与部１２４は、スクリプトエンジンに対して、フックポイントでのフックを施す。ここで、フック時に実現される機能として、フックに対応した言語要素が実行されたことと、その引数としてのタップポイントのメモリがログ出力されるように、解析用のコードを挿入する。この解析用のコードは、フックポイントとタップポイントが判明していれば、容易に生成できる。これによって、スクリプトが実行された際に、その挙動がログ出力されるようになり、解析機能の付与が実現される。
【００９４】
このフックによる解析機能の付与は、スクリプトエンジンバイナリに対するバイナリを直接書き換えて実現してもよく、バイナリが実行されてプロセスメモリ上に展開された際にメモリイメージを書き換えて実現してもよい。
【００９５】
［解析機能付与装置の処理手順］
図１１は、実施の形態に係る解析機能付与方法の処理手順を示すフローチャートである。
【００９６】
まず、図１１に示すように、入力部１１は、テストスクリプト及びスクリプトエンジンバイナリを入力として受け取る（ステップＳ１）。次に、実行トレース取得部１２１は、実行トレース取得処理を実施する（ステップＳ２）。そして、バックトレース解析部１２２１は、バックトレース解析処理によって、フックポイント候補を検出する（ステップＳ３）。このとき、解析機能付与装置１０は、フックポイント候補が検出された場合（ステップＳ４：Ｙｅｓ）、ステップＳ７に進む。一方、フックポイント候補が検出されなかった場合（ステップＳ４：Ｎｏ）、差分実行解析部１２２２は、差分実行解析処理を実施する（ステップＳ５）。
【００９７】
そして、解析機能付与装置１０は、フックポイント候補が検出されなかった場合（ステップＳ６：Ｎｏ）、フックポイント候補の検出がないため、処理を終了する。一方、解析機能付与装置１０は、フックポイント候補が検出された場合（ステップＳ６：Ｙｅｓ）、ステップＳ７に進む。
【００９８】
タップポイント検出部１２３は、タップポイント検出処理を実施する（ステップＳ７）。解析機能付与装置１０は、フックポイント及びタップポイントが検出されなかった場合には（ステップＳ８：Ｎｏ）、処理を終了する。
【００９９】
一方、フックポイント及びタップポイントが検出された場合には（ステップＳ８：Ｙｅｓ）、解析機能付与部１２４は、解析機能付与処理を実施する（ステップＳ９）。解析機能付与装置１０は、出力部１３において、解析機能が付与されたスクリプトエンジンバイナリを出力し（ステップＳ１０）、処理を終了する。
【０１００】
［実行トレース取得処理の処理手順］
次に、図１１に示す実行トレース取得処理（ステップＳ２）について説明する。図１２は、図１１に示す実行トレース取得処理の処理手順を示すフローチャートである。
【０１０１】
まず、実行トレース取得部１２１は、テストスクリプト及びスクリプトエンジンバイナリを入力として受け取る（ステップＳ１１）。そして、実行トレース取得部１２１は、受け取ったスクリプトエンジンに対して、ＡＰＩトレースを取得するためのフックを施す（ステップＳ１２）。また、実行トレース取得部１２１は、同じく分岐命令のトレースを取得するためのフックも施す（ステップＳ１３）。そして、実行トレース取得部１２１は、その状態で受け取ったテストスクリプトをスクリプトエンジンに入力して実行させ（ステップＳ１４）、それによって取得される実行トレースを実行トレースＤＢ２１に格納する（ステップＳ１５）。実行トレース取得部１２１は、入力されたテストスクリプトを全て実行し終えている場合（ステップＳ１６：Ｙｅｓ）、処理を終了する。一方、実行トレース取得部１２１は、入力されたテストスクリプトの全てを実行し切っていない場合（ステップＳ１６：Ｎｏ）、テストスクリプトの実行（ステップＳ１４）に戻って処理を続ける。
【０１０２】
［バックトレース解析処理の処理手順］
次に、図１１に示すバックトレース解析処理（ステップＳ３）の流れについて説明する。図１３は、図１１に示すバックトレース解析処理の処理手順を示すフローチャートである。
【０１０３】
まず、バックトレース解析部１２２１は、実行トレースＤＢ２１から実行トレースを取り出す（ステップＳ２１）。また、バックトレース解析部１２２１は、テストスクリプトを入力として受け取る（ステップＳ２２）。そして、バックトレース解析部１２２１は、実行トレース中に存在するシステムＡＰＩの呼び出し時の引数を走査する（ステップＳ２３）。
【０１０４】
このとき、テストスクリプト中の引数とシステムＡＰＩの引数とで一致がない場合（ステップＳ２４：Ｎｏ）、バックトレース解析部１２２１は、バックトレース解析で検出できるフックポイントはないとして、処理を終了する。
【０１０５】
一方、バックトレース解析部１２２１は、テストスクリプト中の引数とシステムＡＰＩの引数とで一致がある場合（ステップＳ２４：Ｙｅｓ）、一致したシステムＡＰＩを始点として、実行トレース中の分岐を遡って辿っていく（ステップＳ２５）。そして、バックトレース解析部１２２１は、遡りがスクリプトエンジンに到達した点から、Ｎ回遡って得られるＮ個の分岐を、フックポイント候補とする（ステップＳ２６）。そして、バックトレース解析部１２２１は、このフックポイント候補を出力して処理を終了する（ステップＳ２７）。
【０１０６】
［差分実行解析処理の処理手順］
次に、図１１に示す差分実行解析処理（ステップＳ５）の流れについて説明する。図１４は、図１１に示す差分実行解析処理の処理手順を示すフローチャートである。
【０１０７】
まず、差分実行解析部１２２２は、実行トレースＤＢ２１から実行トレースを取り出す（ステップＳ３１）。そして、差分実行解析部１２２２は、Smith-Watermanアルゴリズム適用処理を実施する（ステップＳ３２）。差分実行解析部１２２２は、この処理を実施することによって、取得条件の異なる複数の実行トレースの差分を抽出し、特定の条件を満たす部分を発見する。
【０１０８】
差分実行解析部１２２２は、フックポイント候補が検出された場合には（ステップＳ３３：Ｙｅｓ）、フックポイント候補を出力する（ステップＳ３４）。一方、差分実行解析部１２２２は、フックポイント候補が検出されなかった場合には（ステップＳ３３：Ｎｏ）、処理を終了する。
【０１０９】
［改変Smith-Watermanアルゴリズム適用処理の処理手順］
次に、図１４に示す改変Smith-Watermanアルゴリズム適用処理（ステップＳ３２）の流れについて説明する。図１５は、図１４に示す改変Smith-Watermanアルゴリズム適用の処理手順を示すフローチャートである。
【０１１０】
まず、差分実行解析部１２２２は、実行トレースＤＢ２１から実行トレースを取り出す（ステップＳ４１）。この場合、差分実行解析用の実行トレースであるため、解析対象の言語要素を１回呼び出す実行トレースと、複数回呼び出す実行トレースとの２つが取り出される。
【０１１１】
差分実行解析部１２２２は、解析対象の言語要素を１回呼び出した実行トレースを、ＤＰ表の表側に据える（ステップＳ４２）。また、差分実行解析部１２２２は、同じく複数回呼び出した実行トレースをＤＰ表の表頭に据える（ステップＳ４３）。そして、差分実行解析部１２２２は、ｉ＝０，ｊ＝０とし（ステップＳ４４）、マッチスコアＦ（ｉ，ｊ）を（１）式に基づいて算出する（ステップＳ４５）。
【０１１２】
ここで、差分実行解析部１２２２は、ｉが行数よりも大きいか否かを判定する（ステップＳ４６）。差分実行解析部１２２２は、ｉが行数よりも大きくないと判定した場合は（ステップＳ４６：Ｎｏ）、ｉに１を加算した上で（ステップＳ４７）、マッチスコアの算出（ステップＳ４５）に戻って処理を続ける。
【０１１３】
一方、差分実行解析部１２２２は、ｉが行数よりも大きいと判定した場合は（ステップＳ４６：Ｙｅｓ）、ｊが列数よりも大きいか否かを判定する（ステップＳ４８）。差分実行解析部１２２２は、ｊが列数よりも大きくないと判定した場合（ステップＳ４８：Ｎｏ）、ｉ＝０とし、ｊに１を加算した上で（ステップＳ４９）、マッチスコアの算出（ステップＳ４５）に戻って処理を続ける。
【０１１４】
これに対し、差分実行解析部１２２２は、ｊが列数よりも大きいと判定した場合には（ステップＳ４８：Ｙｅｓ）、マッチスコアが最大となるセルを抽出し（ステップＳ５０）、そこからバックトラックして、最も相同性の高い系列を抽出する（ステップＳ５１）。
【０１１５】
そして、差分実行解析部１２２２は、抽出した系列と同じ行について上位（Ｎ−１）個の系列を新たに抽出する（ステップＳ５２）。差分実行解析部１２２２は、先ほどのＮ個全部でＮ個の抽出した系列について、各々の類似度を算出する（ステップＳ５３）。差分実行解析部１２２２は、算出した各類似度がそれぞれ所定の閾値を超えたか否かを判定する（ステップＳ５４）。
【０１１６】
差分実行解析部１２２２は、算出した各類似度がそれぞれ所定の閾値を超えているとは判定した場合（ステップＳ５４：Ｙｅｓ）、抽出した系列に含まれている分岐をフックポイント候補とし（ステップＳ５５）、このフックポイント候補を出力して（ステップＳ５６）、処理を終了する。これに対し、差分実行解析部１２２２は、算出した各類似度がそれぞれ所定の閾値を超えていないと判定した場合（ステップＳ５４：Ｎｏ）、マッチスコアが次に大きなセルを抽出し（ステップＳ５７）、バックトラックして系列を抽出して（ステップＳ５８）、ステップＳ５２に戻って処理を続ける。
【０１１７】
［タップポイント検出処理の処理手順］
次に、図１１に示すタップポイント検出処理（ステップＳ７）の流れについて説明する。図１６は、図１１に示すタップポイント検出処理の処理手順を示すフローチャートである。
【０１１８】
まず、タップポイント検出部１２３は、テストスクリプト及びフックポイント候補を入力として受け取る（ステップＳ６１，Ｓ６２）。そして、タップポイント検出部１２３は、フックポイント候補の箇所の全てにフックを施し（ステップＳ６３）、テストスクリプトを実行する（ステップＳ６４）。タップポイント検出部１２３は、フックポイント候補に到達したら、フックしている関数の引数を探索する（ステップＳ６５）。この探索時において、タップポイント検出部１２３は、テストスクリプトで指定した引数と同じものが見られたか否かを判定する（ステップＳ６６）。
【０１１９】
タップポイント検出部１２３は、テストスクリプトで指定した引数と同じものが見られなかったと判定した場合（ステップＳ６６：Ｎｏ）、フックポイント及びタップポイントはなかったとして（ステップＳ６７）、処理を終了する。
【０１２０】
一方、タップポイント検出部１２３は、テストスクリプトで指定した引数と同じものが見られたと判定した場合（ステップＳ６６：Ｙｅｓ）、一致した引数が見られたフックポイント候補をフックポイントとして確定し（ステップＳ６８）、一致した引数の箇所をタップポイントとする（ステップＳ６９）。そして、タップポイント検出部１２３は、フックポイント及びタップポイントを出力し（ステップＳ７０）、処理を終了する。
【０１２１】
［解析機能付与処理の処理手順］
次に、図１１に示す解析機能付与処理（ステップＳ９）の流れについて説明する。図１７は、図１１に示す解析機能付与処理の処理手順を示すフローチャートである。
【０１２２】
まず、解析機能付与部１２４は、スクリプトエンジンバイナリ、検出されたフックポイント及びタップポイントを入力として受け取る（ステップＳ７１〜ステップＳ７３）。そして、解析機能付与部１２４は、スクリプトエンジンのフックポイントにフックを施し（ステップＳ７４）、このフック時にタップポイントのメモリを出力するコードが実行されるよう、コードを生成して挿入する（ステップＳ７５）。解析機能付与部１２４は、こうして得られたフックの施されたスクリプトエンジンを、解析機能付きのスクリスクリプトエンジンとして出力し（ステップＳ７６）、処理を終了する。
【０１２３】
［実施の形態の効果］
このように、本実施の形態に係る解析機能付与装置１０は、解析機能を付与したいスクリプトエンジンに対し、テストスクリプトを用いて実行トレースを取得する。そして、解析機能付与装置１０は、その実行トレースをバックトレース解析と差分実行解析によって解析し、フックポイント候補を検出する。さらに、解析機能付与装置１０は、フックポイント候補にフックを施して実行し、メモリを探索することによって、フックポイントの確定とタップポイントの検出を実現する。続いて、解析機能付与装置１０は、得られたフックポイントとタップポイントに基づいて、スクリプトエンジンにフックを施し、解析機能を付与する。
【０１２４】
これによって、解析機能付与装置１０は、バイナリのみしか手に入らないプロプライエタリなスクリプトエンジンに対しても、フックポイントとタップポイントを検出し、人手でのリバースエンジニアリングを要することなく、解析機能の付与を実現できる。
【０１２５】
また、解析機能付与装置１０では、スクリプトエンジンレベルフックを実現するため、スクリプトの近傍でその挙動を監視することが可能であり、セマンティックギャップの生じない解析を実現可能である。
【０１２６】
さらに、解析機能付与装置１０は、スクリプトレベルフックと異なり、スクリプト言語の言語仕様に依存しない方法でフックを施すため、多種多様なスクリプト言語のスクリプトエンジンに対して、解析機能の付与できる。
【０１２７】
以上のように、解析機能付与装置１０によれば、スクリプトエンジンを解析し、解析機能を後付けで付与することにより、多種多様なスクリプト言語のスクリプトエンジンに対して、セマンティックギャップのない解析機能の自動的な付与を実現できる。
【０１２８】
言い換えると、解析機能付与装置１０は、多種多様なスクリプト言語で記述される悪性スクリプトの挙動の解析に有用であり、悪性スクリプトに対して、セマンティックギャップに影響されずに、また、解析を実施することに適している。このため、本実施の形態によれば、解析機能付与装置１０を用いて、様々なスクリプトエンジンに解析機能を付与することで、悪性スクリプトを解析して検知などの対策に生かすことが可能である。
【０１２９】
［他の実施の形態］
［システム構成等］
図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部又は一部を、各種の負荷や使用状況等に応じて、任意の単位で機能的又は物理的に分散・統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部又は任意の一部が、ＣＰＵ及び当該ＣＰＵにて解析実行されるプログラムにて実現され、或いは、ワイヤードロジックによるハードウェアとして実現され得る。
【０１３０】
また、本実施の形態において説明した各処理のうち、自動的に行われるものとして説明した処理の全部又は一部を手動的におこなうこともでき、或いは、手動的におこなわれるものとして説明した処理の全部又は一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【０１３１】
［プログラム］
図１８は、プログラムが実行されることにより、解析機能付与装置１０が実現されるコンピュータの一例を示す図である。コンピュータ１０００は、例えば、メモリ１０１０、ＣＰＵ１０２０を有する。また、コンピュータ１０００は、ハードディスクドライブインタフェース１０３０、ディスクドライブインタフェース１０４０、シリアルポートインタフェース１０５０、ビデオアダプタ１０６０、ネットワークインタフェース１０７０を有する。これらの各部は、バス１０８０によって接続される。
【０１３２】
メモリ１０１０は、ＲＯＭ（Read  Only  Memory）１０１１及びＲＡＭ１０１２を含む。ＲＯＭ１０１１は、例えば、ＢＩＯＳ（Basic  Input  Output  System）等のブートプログラムを記憶する。ハードディスクドライブインタフェース１０３０は、ハードディスクドライブ１０９０に接続される。ディスクドライブインタフェース１０４０は、ディスクドライブ１１００に接続される。例えば磁気ディスクや光ディスク等の着脱可能な記憶媒体が、ディスクドライブ１１００に挿入される。シリアルポートインタフェース１０５０は、例えばマウス１１１０、キーボード１１２０に接続される。ビデオアダプタ１０６０は、例えばディスプレイ１１３０に接続される。
【０１３３】
ハードディスクドライブ１０９０は、例えば、ＯＳ１０９１、アプリケーションプログラム１０９２、プログラムモジュール１０９３、プログラムデータ１０９４を記憶する。すなわち、解析機能付与装置１０の各処理を規定するプログラムは、コンピュータ１０００により実行可能なコードが記述されたプログラムモジュール１０９３として実装される。プログラムモジュール１０９３は、例えばハードディスクドライブ１０９０に記憶される。例えば、解析機能付与装置１０における機能構成と同様の処理を実行するためのプログラムモジュール１０９３が、ハードディスクドライブ１０９０に記憶される。なお、ハードディスクドライブ１０９０は、ＳＳＤ（Solid  State  Drive）により代替されてもよい。
【０１３４】
また、上述した実施の形態の処理で用いられるデータは、プログラムデータ１０９４として、例えばメモリ１０１０やハードディスクドライブ１０９０に記憶される。そして、ＣＰＵ１０２０が、メモリ１０１０やハードディスクドライブ１０９０に記憶されたプログラムモジュール１０９３やプログラムデータ１０９４を必要に応じてＲＡＭ１０１２に読み出して実行する。
【０１３５】
なお、プログラムモジュール１０９３やプログラムデータ１０９４は、ハードディスクドライブ１０９０に記憶される場合に限らず、例えば着脱可能な記憶媒体に記憶され、ディスクドライブ１１００等を介してＣＰＵ１０２０によって読み出されてもよい。或いは、プログラムモジュール１０９３及びプログラムデータ１０９４は、ネットワーク（ＬＡＮ、ＷＡＮ等）を介して接続された他のコンピュータに記憶されてもよい。そして、プログラムモジュール１０９３及びプログラムデータ１０９４は、他のコンピュータから、ネットワークインタフェース１０７０を介してＣＰＵ１０２０によって読み出されてもよい。
【０１３６】
以上、本発明者によってなされた発明を適用した実施形態について説明したが、本実施形態による本発明の開示の一部をなす記述及び図面により本発明は限定されることはない。すなわち、本実施形態に基づいて当業者等によりなされる他の実施形態、実施例及び運用技術等は全て本発明の範疇に含まれる。
【符号の説明】
【０１３７】
１０  解析機能付与装置
１１  入力部
１２  制御部
１３  出力部
１４  記憶部
２１  実行トレースＤＢ
２２  フックポイントＤＢ
２３  タップポイントＤＢ
１２１  実行トレース取得部
１２２  フックポイント検出部
１２３  タップポイント検出部
１２４  解析機能付与部
１２２１  バックトレース解析部
１２２２  差分実行解析部
【図１】
2020075335.tif 000005
【図２−１】
2020075335.tif 000006
【図２−２】
2020075335.tif 000007
【図２−３】
2020075335.tif 000008
【図３】
2020075335.tif 000009
【図４】
2020075335.tif 000010
【図５】
2020075335.tif 000011
【図６】
2020075335.tif 000012
【図７】
2020075335.tif 000013
【図８】
2020075335.tif 000014
【図９】
2020075335.tif 000015
【図１０】
2020075335.tif 000016
【図１１】
2020075335.tif 000017
【図１２】
2020075335.tif 000018
【図１３】
2020075335.tif 000019
【図１４】
2020075335.tif 000020
【図１５】
2020075335.tif 000021
【図１６】
2020075335.tif 000022
【図１７】
2020075335.tif 000023
【図１８】
2020075335.tif 000024
【国際調査報告】
2020075335.tif 000025
2020075335.tif 000026
2020075335.tif 000027
2020075335.tif 000028