(57)【特許請求の範囲】
【請求項１】
出力データを生成するために呼び出されたライブラリ関数を特定する情報処理装置であって、
監視対象のプログラムの解析ログを生成する際、前記監視対象のプログラムが呼び出すライブラリ関数を捕捉し、前記ライブラリ関数の呼び出しごとに、前記ライブラリ関数の呼び出しを一意に識別するためのタグを、前記ライブラリ関数からの出力データに設定するライブラリ関数実行監視部と、
前記ライブラリ関数からの出力データを含む前記解析ログを記憶するログ記憶部と、
前記ログ記憶部に記憶された解析ログに設定されたタグをキーとして、当該情報処理装置からの出力データを生成するために呼び出されたライブラリ関数を特定するログ探索部と、
前記特定したライブラリ関数の特性から、前記監視対象のプログラムへの入力データを推定する推定部とを備えることを特徴とする情報処理装置。
【請求項２】
前記監視対象のプログラムへの入力データは、前記入力データを一意に識別するためのタグが設定されており、
前記情報処理装置は、さらに、
前記プログラムによる実行結果のデータに、前記入力データに設定されたタグを伝播させるテイント情報伝搬部を備え、
前記ライブラリ関数実行監視部は、さらに、
前記ライブラリ関数からの出力データに前記タグが設定されている場合、前記監視対象のプログラムの解析ログを生成する際に、前記ライブラリ関数からの出力データに設定されるタグを、前記ライブラリ関数からの出力データのタグとして伝搬させ、
前記ライブラリ関数からの出力データに前記タグが設定されていない場合、前記監視対象のプログラムの解析ログを生成する際に、前記ライブラリ関数の呼び出しを一意に識別するためのタグを、前記ライブラリ関数からの出力データに設定することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記ログ探索部は、
前記ログ記憶部に記憶された解析ログに設定されたタグのうち、予め決定された引数のタグをキーとして、当該情報処理装置からの出力データを生成するために呼び出されたライブラリ関数を特定することを特徴とする請求項１または２に記載の情報処理装置。
【請求項４】
情報処理装置が、
監視対象のプログラムの解析ログを生成する際、前記監視対象のプログラムが呼び出すライブラリ関数を捕捉し、前記ライブラリ関数の呼び出しごとに、前記ライブラリ関数の呼び出しを一意に識別するためのタグを、前記ライブラリ関数からの出力データに設定するライブラリ関数実行監視ステップと、
前記ライブラリ関数からの出力データを含む前記解析ログに設定されたタグをキーとして、当該情報処理装置からの出力データを生成するために呼び出されたライブラリ関数を特定するログ探索ステップと、
特定したライブラリ関数の特性から、前記監視対象のプログラムへの入力データを推定する推定ステップとを実行することを特徴とする情報処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、および、情報処理方法に関する。
【背景技術】
【０００２】
マルウェア等の解析対象の実行ファイルの挙動を解析するために、その実行ファイルを解析環境において実際に動作させ、その挙動ログを取得する動的解析が利用される。動的解析には、マルウェアが外部へ送信するパケットを監視するネットワーク挙動解析型の動的解析がある（特許文献１参照）。【０００３】
これらネットワーク挙動解析型の動的解析では、マルウェアが行う通信先、ポート番号、プロトコル、ペイロードの情報等が取得できる。場合によっては、マルウェアの挙動を理解するための重要な情報がペイロード部分に観測されることもある。例えば、マシン名やユーザ情報、機密ファイルの中身の情報等がそのままペイロード部分に記載されていた場合、そのマルウェアが感染端末の機密情報を外部に送信する挙動を持っていると判断できる。【０００４】
しかしながら、近年のマルウェアの多くは、通信データに暗号化、圧縮等の難読化が施されている場合が多い。このような場合、ネットワーク挙動解析型の動的解析で観測できるパケットのペイロード部分からは、送信されているデータの内容を知ることができないので、マルウェアの挙動を理解できなくなってしまう。【０００５】
このような場合、マルウェアの実行ファイルを静的解析し、送信しているデータの内容を特定する方法がある。この方法は、解析者が手動でマルウェアの実行ファイルを逆アセンブルし、命令を読み解くことでマルウェアの挙動を把握する方法である。しかしながら、マルウェアの静的解析は非常にコストが高く、大量の実行ファイルを解析するのには向いていない。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特許第４７５５６５８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
上記のように、マルウェアの動的解析において、マルウェアがデータを難読化し、解析環境マシンの外部に出力している場合、その出力されたデータを見ても、そのデータの本来の意味を特定することができない。また、一方で解析者が手動で静的解析すれば、理論的には難読化されているデータの内容を把握することはできるが、静的解析には解析者に特別なスキルが必要なだけではなく、解析にかなりの時間を要する等、コストの高い作業になってしまう。【０００８】
そこで、本発明は、前記した問題を解決し、マルウェア等のプログラムによりデータが難読化されて外部に出力される場合でも、そのデータの元情報を、動的解析で特定することを課題とする。
【課題を解決するための手段】
【０００９】
前記した課題を解決するため、本発明の情報処理装置は、出力データを生成するために呼び出されたライブラリ関数を特定する情報処理装置であって、監視対象のプログラムの解析ログを生成する際、前記監視対象のプログラムが呼び出すライブラリ関数を捕捉し、前記ライブラリ関数の呼び出しごとに、前記ライブラリ関数の呼び出しを一意に識別するためのタグを、前記ライブラリ関数からの出力データに設定するライブラリ関数実行監視部と、前記ライブラリ関数からの出力データを含む解析ログを記憶するログ記憶部と、前記ログ記憶部に記憶された解析ログに設定されたタグをキーとして、当該情報処理装置からの出力データを生成するために呼び出されたライブラリ関数を特定するログ探索部とを備える。
【発明の効果】
【００１０】
本発明によれば、マルウェア等のプログラムによりデータが難読化されて外部に出力される場合でも、そのデータの元情報を、動的解析で特定することができる。
【図面の簡単な説明】
【００１１】
【図１】図１は、情報処理装置の全体構成を示す図である。
【図２】図２は、情報処理装置の処理の概要を示す図である。
【図３】図３は、仮想マシンの機能構成を示す図である。
【図４】図４は、シャドウメモリに記憶される情報の例を示す図である。
【図５】図５は、シャドウディスクに記憶される情報の例を示す図である。
【図６Ａ】図６Ａは、各ライブラリ関数間でテイントタグが伝搬される場合のログの例を示す図である。
【図６Ｂ】図６Ｂは、ライブラリ関数ごとに新しいテイントタグを設定する場合のログの例を示す図である。
【図７】図７は、仮想マシンがライブラリ関数への入力および出力に関するログを蓄積する手順を示すフローチャートである。
【図８】図８は、ホストＯＳのログ探索部が、難読化データを生成したライブラリ関数を特定する手順を示すフローチャートである。
【図９】図９は、監視プログラムを実行するコンピュータを示す図である。
【発明を実施するための形態】
【００１２】
［第１の実施形態］
［全体構成］
以下、本発明を実施するための形態（実施形態）について説明する。図１は、情報処理装置の全体構成を示す図である。図１に示すように、情報処理装置は、ハードウェア１、ホストＯＳ２、仮想マシンソフトウェア３、仮想マシン１０を有する。
【００１３】
ハードウェア１は、情報処理装置を構成する電子回路や周辺機器であり、例えば、メモリ、ＣＰＵ（Central  Processing  Unit）等である。ホストＯＳ２は、仮想マシンを動作させる基盤となるＯＳであり、ハードウェア１を用いて実行される。仮想マシンソフトウェア３は、ハードウェア１を用いて仮想マシンを提供するソフトウェアであり、ここでは、仮想マシン１０を動作させる。例えば、仮想マシンソフトウェア３は、仮想ディスク、仮想物理メモリ、仮想ＣＰＵ等をゲストＯＳに割当てて、仮想マシンを動作させる。
【００１４】
仮想マシン１０は、例えば、エミュレータ型の仮想マシンであり、仮想マシンソフトウェア３から提供された仮想ディスク、仮想物理メモリ、仮想ＣＰＵ等を用いてゲストＯＳを動作させて、各種処理を実行する仮想的な情報処理装置である。
【００１５】
この情報処理装置の処理の概要を、図２を用いて説明する。図２は、情報処理装置の処理の概要を示す図である。情報処理装置は、仮想マシン１０内で、挙動の解析対象となるプログラム（マルウェア）を監視する。そして、情報処理装置は、プログラムの挙動を監視し、このプログラムにより呼び出されるライブラリ関数の入力および出力に関するログを生成し、出力する。
【００１６】
ライブラリ関数は、プログラムの実行にあたり呼び出される関数であり、例えば、ＡＰＩ（Application  Programming  Interface）、システムコール、ローカル関数等である。このライブラリ関数は、ゲストＯＳ内に含まれる。また、以下の説明において、ライブラリ関数は、Win32APIである場合を例に説明するが、これに限定されない。
【００１７】
また、情報処理装置により生成されるログは、例えば、ライブラリ関数（例えば、ライブラリ関数Ａ，Ｂ，Ｃ，…，Ｎ）、そのライブラリ関数への入力データ、そのライブラリ関数からの出力データ等、を示す情報である。ここで、情報処理装置は、ログ生成時、ライブラリ関数からの出力データに、このライブラリ関数の呼び出しを一意に識別するためのテイントタグ（タグ）を設定する。
【００１８】
一方で、情報処理装置は、挙動の解析対象となるプログラムを動作させ、テイント解析を行う。すなわち、情報処理装置は、挙動の解析対象となるプログラムを動作させることにより、テイントタグが設定されたデータが仮想ＣＰＵで実行する命令にオペランドとして渡された場合、この命令の実行結果のデータにテイントタグを伝播させる。これにより、情報処理装置は、プログラムから呼び出されたライブラリ関数への入力データにも、情報処理装置により設定されたテイントタグが設定されることになる。
【００１９】
このような解析環境下で、情報処理装置は、所定期間、挙動の解析対象となるプログラムを動作させ、ライブラリ関数の入力および出力に関するログの生成および出力を行い、ログを蓄積していく。
【００２０】
その後、情報処理装置が、何らかの難読化されたデータ（難読化データ）を出力した場合、このデータに設定されたテイントタグと、前記したログに含まれるテイントタグとを参照することで、ライブラリ関数間で利用されているデータの依存関係を辿り、難読化データを生成したライブラリ関数（例えば、ライブラリ関数Ａ）を特定する。このようにライブラリ関数が特定できれば、情報処理装置のユーザは、そのライブラリ関数の特性等から、難読化データの生成にあたり、どのような種類の情報が元情報となっているかを特定することができる。
【００２１】
なお、本実施形態における、データの出力とは、例えば、解析対象のプログラムを動作させているマシン（仮想マシン１０）からネットワークを介して外部へ出力する場合や、ハードディスク、半導体メモリ、ＤＶＤ、ＣＤ−ＲＯＭ等の記録媒体への書き込みにより外部へ出力する場合も含む。
【００２２】
［仮想マシンの構成］
次に、図１に示した仮想マシンの構成を説明する。なお、ハードウェア１、ホストＯＳ２、仮想マシンソフトウェア３については、一般的な構成と同様の構成を有するので、詳細な説明は省略する。なお、以下の説明において監視対象のプログラムは、予め仮想ディスク１１ａに格納され、テイントタグが設定されているものとする。
【００２３】
図３は、仮想マシンの機能構成を示す図である。図３に示すように、仮想マシン１０は、仮想物理メモリ１０ａ、シャドウメモリ１０ｂ、仮想ディスク１１ａ、シャドウディスク１１ｂ、仮想ＣＰＵ１２、仮想ＨＷコントローラ１８を有する。
【００２４】
仮想物理メモリ１０ａは、情報処理装置が有する物理メモリにおける所定領域を仮想マシン１０で動作するゲストＯＳが使用するメモリとして割り当てることで実現された仮想的なメモリである。例えば、仮想物理メモリ１０ａは、仮想ＣＰＵ１２によって仮想ディスク１１ａから読み出されたプログラムやデータを記憶する。
【００２５】
シャドウメモリ１０ｂは、仮想物理メモリ１０ａ上の値に対して設定されたテイントタグの値を保持するデータ構造体である。
【００２６】
ここで、シャドウメモリ１０ｂの一例を説明する。図４は、シャドウメモリに記憶される情報の例を示す図である。図４に示すように、シャドウメモリ１０ｂは、「仮想物理メモリのアドレス」と「テイントタグ」とを対応付けて記憶する。「仮想物理メモリのアドレス」は、仮想物理メモリ１０ａ上の格納位置を示す位置情報であり、「テイントタグ」は、各ライブラリ関数の実行の結果出力されたデータに対して設定された識別子である。
【００２７】
図４の場合、仮想物理メモリ１０ａのアドレス「００００〜０２００」に格納されている監視対象のプログラムコードに対して、テイントタグ「１１」が付与されていることを示す。また、仮想物理メモリ１０ａのアドレス「０３１０〜０３５０」に格納されている監視対象のデータに対して、テイントタグ「０５」が付与されていることを示す。なお、図４に示した数値等は、あくまで例示であり、値等を限定するものではない。
【００２８】
仮想ディスク１１ａは、情報処理装置が有する物理ディスクにおける所定領域を仮想マシン１０で動作するゲストＯＳが使用する領域として割り当てることで実現された仮想的なディスクである。例えば、仮想ディスク１１ａは、仮想ＣＰＵ１２が実行対象とするプログラムや、プログラムの処理対象となるデータ等を記憶する。この仮想ディスク１１ａは、前記したライブラリ関数の入力および出力に関するログを記憶するログ記憶部１１０を所定領域に備える。
【００２９】
シャドウディスク１１ｂは、仮想ディスク１１ａ上の値に対して設定されたテイントタグの値を保持するデータ構造体である。
【００３０】
ここで、シャドウディスク１１ｂの一例を説明する。図５は、シャドウディスクに記憶される情報の例を示す図である。図５に示すように、シャドウディスク１１ｂは、「仮想ディスクのアドレス」と「テイントタグ」とを対応付けて記憶する。「仮想ディスクのアドレス」は、仮想ディスク１１ａ上の格納位置を示す位置情報であり、「テイントタグ」は、監視対象であることを識別する識別子である。また、ここでは、「テイントタグ」の２ビット情報が「１」である場合には、監視対象のデータがプログラムのコードであることを示す。
【００３１】
図３の仮想ＣＰＵ１２は、情報処理装置が有する物理ＣＰＵにおける所定処理能力を仮想マシン１０で動作するゲストＯＳが使用するＣＰＵとして割り当てることで実現された仮想的なＣＰＵである。この仮想ＣＰＵ１２は、この仮想ＣＰＵ１２が保持しているテイントタグを保持するシャドウレジスタを備える。この仮想ＣＰＵ１２は、プログラム実行部１３、判定部１４、ライブラリ関数実行監視部１５、および、テイント解析部１７を有し、これらによって各種処理を実行する。
【００３２】
プログラム実行部１３は、仮想ディスク１１ａに記憶されるプログラムを実行する。例えば、プログラム実行部１３は、仮想ディスク１１ａから、実行対象のプログラムを読み出して仮想物理メモリ１０ａに展開し、実行する。
【００３３】
判定部１４は、実行されたプログラムが監視対象か否かを判定する。実行されたプログラムが監視対象であるか否かを判定する手法は、公知の様々な手法を用いることができる。例えば、予め監視対象のプログラム名等を指定しておき、仮想物理メモリ１０ａに展開されたプログラムが予め指定したプログラムと一致するか否かによって、監視対象か否かを判定することもできる。また、プログラム内を走査し、監視対象として指定される命令を含んでいる場合に、監視対象と判定することもできる。
【００３４】
仮想ＨＷコントローラ１８は、仮想ディスク１１ａと仮想物理メモリ１０ａとの間、シャドウディスク１１ｂとシャドウメモリ１０ｂとの間のデータ送受信を制御する。例えば、仮想ＨＷコントローラ１８は、プログラム実行部１３が仮想ディスク１１ａから読み出したプログラムを仮想物理メモリ１０ａに格納する。また、仮想ＨＷコントローラ１８は、プログラム等によって仮想物理メモリ１０ａから読み出されたデータを仮想ディスク１１ａに格納する。このような仮想ＨＷコントローラ１８は、テイントタグの伝搬を実行するテイント情報伝搬部１８ａを有する。
【００３５】
テイント解析部１７は、テイントタグが設定されたデータが仮想ＣＰＵ１２（具体的にはプログラム実行部１３）で実行する命令に渡された際、テイントタグの伝搬ルールに基づいてテイントタグを命令の実行結果に伝搬させる。プログラム実行部１３で実行する命令にテイントタグが設定されたデータが渡されるとは、具体的には、命令のオペランドで渡された値がテイントタグを保持している場合である。
【００３６】
テイント情報伝搬部１８ａは、仮想ディスク１１ａと仮想物理メモリ１０ａとの間でのデータの読み書きに伴い、シャドウディスク１１ｂとシャドウメモリ１０ｂとの間でテイントタグを伝搬させる。例えば、仮想ＨＷコントローラ１８が、監視対象のプログラムによって仮想物理メモリ１０ａから読み出されたデータを仮想ディスク１１ａに格納するとき、これに伴い、シャドウメモリ１０ｂ上の当該読み出されたデータのテイントタグをシャドウディスク１１ｂ上に格納する。
【００３７】
なお、テイントタグを伝搬させるときのルールとしては、仮想ＣＰＵ１２において機械語命令が実行される際、１つ以上のオペランドを伴う算術演算命令、論理演算命令、データ移動命令、データコピー命令の実行の際に、オペランドの１つにテイントタグを持った値が渡された場合、その命令実行結果を保存する箇所にもテイントタグを設定する。このルールは実装により異なるが、命令実行の結果が、読み込まれた値に依存している場合、テイントタグを伝搬させるといった基本的なルールにより構成され、仮想ＣＰＵ１２の命令のうち何かしらの形でデータを扱うものに関してはテイントタグの伝搬を伴う動作が行われるものとする。
【００３８】
ライブラリ関数実行監視部１５は、監視対象のプログラムが呼び出すライブラリ関数の実行を捕捉し、このライブラリ関数への入力および出力に関するログ（以下、適宜「ログ」と略す）を生成し、出力する。また、ライブラリ関数実行監視部１５は、ログの生成にあたりライブラリ関数からの出力データには、このライブラリ関数の呼び出しを一意に識別するためのテイントタグを設定する。なお、このライブラリ関数の実行の捕捉は、解析対象のプログラムの命令からライブラリ関数が呼ばれた時と、ライブラリ関数が呼ばれた後、プログラムの命令へ復帰する時の２回行われる。
【００３９】
ここで、監視対象のプログラムにより実行されるライブラリ関数の実行を捕えるためには、次の点を考慮する必要がある。
（１）監視対象のプログラムをどのように判断するか。
（２）ライブラリ関数が実行されたということをどのように捕えるか。
（３）ライブラリ関数から監視対象のマルウェアのコードに復帰したということをどのように捕えるか。
【００４０】
（１）に関しては、プロセスＩＤ、スレッドＩＤ、メモリアドレスの範囲等を用いる方法等が考えられる。（２）に関してはバイナリを直接書き換えてフックやブレークポイントを配置する方法や、ハードウェアブレークポイントを利用する方法が考えられる。また、バイナリ変換を利用し、読み込んだ命令の仮想アドレスが予め把握しているライブラリ関数が配置されるべきアドレスと一致しているかを比較することで、ライブラリ関数の命令の実行を捕える方法等が考えられる。
【００４１】
（３）に関しては、（２）でライブラリ関数の実行を捕えたときに、スタックに積まれているリターンアドレス、特定のレジスタに格納されているリターンアドレス、を見ることで復帰するアドレスが把握できる。また、ライブラリ関数を呼び出した命令を見つけ出し、その命令の次の命令を復帰するアドレスだとすることも可能である。復帰するアドレスが把握できた場合、そのアドレスに対して、上記で述べた手法と同様の方法で、フックやブレークポイント、アドレス比較のための登録を行うことで、その復帰されるアドレスの命令が実行されたことを捕える。
【００４２】
ライブラリ関数実行監視部１５は、監視対象のプログラムからライブラリ関数の実行を捕捉した場合、そのライブラリ関数の引数情報に基づいて、ライブラリ関数に入力される引数を把握し、ライブラリ関数に引数として入力されるデータと、そのデータに設定されているテイントタグとを取得し、これらを対応付けた情報をログ（プログラムの解析ログ）として出力する。
【００４３】
なお、ライブラリ関数の引数情報は、例えば、そのライブラリ関数のプロトタイプ宣言が記載されているものから取得される。例えば、ライブラリ関数のソースコード、ＳＤＫ（ソフトウエア開発キット）で提供されているヘッダファイル、ライブラリ関数のドキュメント等から取得される。
【００４４】
また、ライブラリ関数実行監視部１５は、ライブラリ関数が呼び出された後、プログラムへの復帰を捕捉したとき、以下の処理を行う。まず、ライブラリ関数実行監視部１５は、呼び出されたライブラリ関数の引数情報に基づいて、ライブラリ関数から出力される引数を区別し、ライブラリ関数から出力されるデータに対し、テイントタグを設定する。そして、ライブラリ関数実行監視部１５は、出力されるデータと、そのデータに設定したテイントタグとを対応付けた情報をログとして出力する。
【００４５】
［ログの例］
ここで、図６Ａおよび図６Ｂを用いて、ライブラリ関数実行監視部１５が出力するログの例を説明する。図６Ａは、各ライブラリ関数間でテイントタグが伝搬される場合のログを例示した図である。図６Ｂは、ライブラリ関数ごとに新しいテイントタグを設定する場合のログを例示した図である。なお、図６Ａおよび図６Ｂにおいてログは、時系列順に並べられ、下に行くに従い新しいログとなっている。
【００４６】
ログは、図６Ａおよび図６Ｂに示すように、呼び出されたライブラリ関数への入力時に関するログ（[prev]）か出力時に関するログ（[post]）かを示す情報と、そのライブラリ関数の関数名と、そのライブラリ関数への引数が入力（ＩＮ）か出力（ＯＵＴ）かを示す情報と、その引数のデータと、そのデータに設定されたテイントタグの値とが示される。なお、図６Ａおよび図６Ｂにおいて図示を省略しているが、各ログはどのような順で呼び出されたかを示す時系列情報を持つ。
【００４７】
なお、このログには、そのライブラリ関数の呼び出しの付随情報として、ライブラリ関数名、そのライブラリ関数を含むモジュール名、ＰＩＤ、ＴＩＤ、呼び出し元アドレス、リターンアドレス、時間情報、命令ポインタが指しているアドレス（EIP）等を含めてもよい。
【００４８】
このログは、ログ探索部１６が、難読化データを生成したライブラリ関数を特定する際に参照される。ログ探索部１６が、図６Ａおよび図６Ｂに例示したログを用い、難読化データを生成したライブラリ関数を特定する手順の例については、後記する。
【００４９】
なお、図３に示すように、ホストＯＳ２は、仮想マシン１０外に、ログ探索部１６およびログ記憶部１１０を備える。このように、ホストＯＳ２が、ログ探索部１６およびログ記憶部１１０を、仮想マシン１０外に保持するのは、仮想マシン１０内で動く監視対象のプログラムから、ログや、ログの探索処理が見えてしまうことを防止するためである。ログ探索部１６は、仮想マシン１０からの出力データ（難読化データ）に設定されたテイントタグと、ログ記憶部１１０に蓄積されたログとを参照し、ライブラリ関数間で入出力されるデータの依存関係を辿り、仮想マシン１０からの出力データを生成したライブラリ関数を特定する。このログ探索部１６の詳細は、後記する。
【００５０】
ログ記憶部１１０は、ライブラリ関数実行監視部１５により出力されたログ（図６Ａおよび図６Ｂ参照）を記憶する。なお、ログ記憶部１１０における、ライブラリ関数の呼び出し時に出力したログと、ライブラリ関数からの復帰時に出力したログとの対応付けは、呼び出されたライブラリ関数の関数名、ログの時系列情報、各ライブラリ関数がどのような順で呼び出されたかを示す情報等により行われるものとする。また、ここでの対応付けは、ライブラリ関数を呼び出したアドレスと復帰したアドレスの関係性や、ＰＩＤ、ＴＩＤ等を用いてもよい。
【００５１】
［仮想マシンの処理手順］
［ログの蓄積手順］
次に、図７を用いて仮想マシン１０の処理手順を説明する。まず、仮想マシン１０がライブラリ関数への入力および出力に関するログを蓄積する手順を説明する。図７は、仮想マシンがライブラリ関数への入力および出力に関するログを蓄積する手順を示すフローチャートである。
【００５２】
仮想マシン１０のプログラム実行部１３は、実行対象のプログラムを仮想ディスク１１ａから仮想物理メモリ１０ａにロードする（Ｓ１１）。
【００５３】
そして、判定部１４は、ロードされたプログラムが監視対象のプログラムか否かを判定する（Ｓ１２）。なお、判定部１４は、ロードされたプログラムが監視対象のプログラムではないと判定した場合（Ｓ１２のＮｏ）、処理を終了する。
【００５４】
一方、判定部１４は、ロードされたプログラムが監視対象のプログラムであると判定した場合（Ｓ１２のＹｅｓ）、ライブラリ関数実行監視部１５は、そのプログラムによりライブラリ関数の呼び出しがあるか否かを判定する（Ｓ１３）。
【００５５】
そして、ライブラリ関数実行監視部１５が、当該プログラムによりライブラリ関数の呼び出しがあったと判定したとき（Ｓ１３のＹｅｓ）、呼び出されたライブラリ関数と、そのライブラリ関数に引数として入力されるデータと、そのデータに設定されているテイントタグとを取得し、これらを対応付けた情報をログとして、ログ記憶部１１０へ出力する（Ｓ１４）。一方、ライブラリ関数実行監視部１５がライブラリ関数の呼び出しがないと判定したときは（Ｓ１３のＮｏ）、Ｓ１３へ戻る。
【００５６】
Ｓ１４の後、ライブラリ関数実行監視部１５は、呼び出されたライブラリ関数から当該プログラムへ復帰したと判定すると（Ｓ１５のＹｅｓ）、そのライブラリ関数から出力されるデータにテイントタグを設定する（Ｓ１６）。つまり、ライブラリ関数実行監視部１５は、呼び出されたライブラリ関数の引数情報に基づいて、そのライブラリ関数から出力される引数を区別し、ライブラリ関数から出力されるデータに対してテイントタグを設定する。
【００５７】
Ｓ１６の後、ライブラリ関数実行監視部１５は、呼び出されたライブラリ関数と、そのライブラリ関数から出力されるデータと、そのデータに設定したテイントタグとを取得し、これらを対応付けた情報を、ログとして、ログ記憶部１１０へ出力する（Ｓ１７）。
【００５８】
そして、ライブラリ関数実行監視部１５は、プログラム実行部１３によるプログラムの実行が終了したと判定すると（Ｓ１８のＹｅｓ）、処理を終了する。一方、まだプログラムが終了していなければ（Ｓ１８のＮｏ）、Ｓ１３へ戻る。
【００５９】
このようにして、仮想マシン１０は、監視対象のプログラムによりライブラリ関数の呼び出しを捕捉し、そのライブラリ関数へのデータ入力およびそのライブラリ関数からのデータ出力に関するログを蓄積する。
【００６０】
［ライブラリ関数の特定手順］
次に、図８を用いて、ホストＯＳ２のログ探索部１６が、ログ記憶部１１０に蓄積されたログを探索し、難読化データを生成したライブラリ関数を特定する手順を説明する。図８は、ホストＯＳのログ探索部が、難読化データを生成したライブラリ関数を特定する手順を示すフローチャートである。
【００６１】
まず、ログ探索部１６は、ログ記憶部１１０に蓄積されたログを参照して、仮想マシン１０の外部へ出力されたデータ（難読化データ）について、当該データを外部へ出力したライブラリ関数を見つける（Ｓ２１）。例えば、ログ探索部１６は、出力された難読化データを設定されたテイントタグを元に、ログ記憶部１１０に蓄積されたログを時系列の逆向きに辿って、当該データを出力したライブラリ関数を見つける。
【００６２】
Ｓ２１の後、ログ探索部１６は、ログ記憶部１１０に蓄積されたログを参照して、Ｓ２１で見つけたライブラリ関数に渡された（入力された）データが存在し（Ｓ２２のＹｅｓ）、かつ、渡されたデータにテイントタグが設定されていれば（Ｓ２３のＹｅｓ）、当該データのテイントタグを取得する（Ｓ２４）。
【００６３】
Ｓ２４の後、ログ探索部１６は、ログ記憶部１１０に蓄積されたログを探索し、Ｓ２４で取得したテイントタグが設定されたデータを生成したライブラリ関数を特定する（Ｓ２５）。例えば、ログ探索部１６は、ログ記憶部１１０に蓄積されたログのうち、Ｓ２１で見つけたライブラリ関数より時系的に前にあるライブラリ関数のログの中から、Ｓ２４で取得したテイントタグが設定されたデータを生成したライブラリ関数を特定する。そして、ログ探索部１６は、Ｓ２５で特定したライブラリ関数に対し、Ｓ２２以降の処理を実行する。
【００６４】
一方、ログ探索部１６は、ログ記憶部１１０に蓄積されたログを参照して、Ｓ２１で見つけたライブラリ関数に渡された（入力された）データが存在しない場合（Ｓ２２のＮｏ）、または、渡されたデータにテイントタグが設定されていない場合（Ｓ２３のＮｏ）、Ｓ２６へ進む。そして、ログ探索部１６は、当該ライブラリ関数を、難読化データを生成した関数として特定する（Ｓ２６）。
【００６５】
このようにして、情報処理装置は、難読化データを生成したライブラリ関数を特定する。そして、ライブラリ関数が特定できれば、情報処理装置のユーザは、そのライブラリ関数の特性から、難読化データの元情報のデータを推定することができる。
【００６６】
例えば、難読化データを生成したライブラリ関数が、あるファイルの中身を読み取るライブラリ関数であると特定できた場合、そのファイルのファイル名、ファイルパス、所有者情報、そのファイルにつけられた属性情報等から、そのライブラリ関数で読み取られたデータ（元情報）がどのような種類のデータかを推定することができる。他にも、例えば、ライブラリ関数が、レジストリの内容を読み取る関数であると特定できた場合、そのレジストリのレジストリキーやサブキーの情報、そのレジストリのファイルやレジストリキーを作成した、または登録したプロセスを特定することで、元情報の種類を推定することができる。このように元情報の種類を推定することで、情報処理装置のユーザは、マルウェアによりどのような情報が外部に漏洩したかを推定しやすくなる。
【００６７】
また、このような情報処理装置によれば、難読化データを生成したライブラリ関数の特定を行う際、プログラムの動的解析にて得られるログを元に特定を行うので、静的解析のようなコストはかからない。つまり、情報処理装置のユーザは、大きなコストをかけることなく、外部に出力された難読化データの元情報がどのような種類のデータかを推定することができる。なお、前記した元情報のデータの推定は、情報処理装置の備える推定部により行ってもよい。
【００６８】
なお、情報処理装置は、難読化データが外部に出力された際、その出力先（通信先）に関する情報を取得しておいてもよい。例えば、難読化データがシステム内の機密情報に関する情報であると推定される場合、情報処理装置において、そのデータの送信先を情報漏洩データの送信先としてラベル付けし、監視するようにしてもよい。
【００６９】
［ライブラリ関数の特定の例］
ここで、ログ探索部１６が、ログ記憶部１１０に蓄積されたログを用い、難読化データを生成したライブラリ関数を特定する手順の例について説明する。ここでは、図６Ａに示したログを用いる場合を例に説明する。
【００７０】
例えば、ログ探索部１６は、図６Ａに示すログのうち、send(…,引数2:IN:’yamada’:tag=0x１,…)を起点として、tag=0x1を生成したライブラリ関数を探すと、[post]GetComputerNameが見つかる。これにより、ログ探索部１６は、sendで送られたデータを生成したライブラリ関数は、GetComputerNameであると特定でき、仮想マシン１０のユーザは、sendで送られたデータは、コンピュータ名であると推測することができる。
【００７１】
一方、ログ探索部１６が、図６Ｂに示したような、ライブラリ関数ごとにテイントタグの値が異なるログを用いてライブラリ関数を特定する場合は以下のようにして行う。
【００７２】
例えば、ログ探索部１６は、図６Ｂに示すログのうち、send(…,引数2:IN:’yamada’:tag=0x2,…)を起点として、tag=0x2を生成したライブラリ関数を探すと、[post]memcpyが見つかる。次にログ探索部１６は、[post]memcpy  の入力時のログを見ると、[prev]  memcpy,引数1:OUT,  引数2:IN:’yamada’:tag=0x1であるので、tag=0x1を生成したライブラリ関数を探すと、[post]GetComputerNameが見つかる。これにより、ログ探索部１６は、sendで送られたデータを生成したライブラリ関数はGetComputerNameであると特定する。
【００７３】
なお、ログ探索部１６が特定するライブラリ関数は、難読化データの元情報を処理したライブラリ関数（例えば、図６Ａおよび図６ＢにおけるGetComputerName）であってもよいし、その難読化データを出力するまでに呼び出されたライブラリ関数すべて（例えば、図６Ａおよび図６ＢにおけるGetComputerName，memcpy，send）であってもよい。また、ログ探索部１６は、その難読化データを出力するまでに呼び出されたライブラリ関数同士の依存関係を示す情報（例えば、send←memcpy←GetComputerName）や、各ライブラリ関数で用いられたデータ等を併せて出力するようにしてもよい。このようにすることで、仮想マシン１０のユーザは、難読化データの元情報がどのようなデータであるかを推定しやすくなる。
【００７４】
［第２の実施形態］
また、前記した実施形態においてライブラリ関数実行監視部１５は、プログラムにおいてライブラリ関数からの復帰時に、このライブラリ関数が出力したデータにテイントタグが設定されていなかった場合、当該データにテイントタグを設定してもよい。そして、ライブラリ関数実行監視部１５は、このライブラリ関数からの出力データと、テイントタグとをログとして、ログ記憶部１１０に出力するようにしてもよい。
【００７５】
つまり、ライブラリ関数実行監視部１５は、呼び出されたライブラリ関数からの出力データにテイントタグが設定されている場合、ログ生成にあたり、このライブラリ関数からの出力データに設定されるタグをログに出力する。一方、ライブラリ関数実行監視部１５は、ライブラリ関数からの出力データにテイントタグが設定されていない場合、ログ生成にあたり、このライブラリ関数の呼び出しを一意に識別するためのタグを設定し、ログに出力する。
【００７６】
このようにすることで、例えば、ライブラリ関数が、暗号化や難読化の処理を行う関数であった場合、このようなライブラリ関数による処理により、このライブラリ関数へ入力されたデータに設定されていたテイントタグが消滅してしまったときでも、次に処理を行うライブラリ関数への入力データにテイントタグを伝播させることができる。これにより、ログ探索部１６は、ログのテイントタグを辿ることで、難読化データの元情報を生成したライブラリ関数を特定することができる。
【００７７】
［その他の実施形態］
また、ライブラリ関数実行監視部１５は、ライブラリ関数から解析対象のプログラムへ復帰する際にその実行を捉え、このライブラリ関数からの出力データにテイントタグを設定する場合について説明したがこれに限定されない。例えば、ライブラリ関数実行監視部１５がライブラリ関数内の命令の仮想物理メモリ１０ａへの書き込みの動作を見張り、書き込みが発生するごとにテイントタグを設定してもよい。つまり、ライブラリ関数実行監視部１５は、ライブラリ関数からの復帰時に一括して、ライブラリ関数からの出力データに対してテイントタグを設定してもよいし、ライブラリ関数内で仮想物理メモリ１０ａに対する書き込みが発生するごとにテイントタグを設定してもよい。
【００７８】
なお、仮想マシン１０は、Binary  Instrumentationを利用し特定のプロセスのみを仮想化するプロセス型の仮想マシンを利用してもよいし、アプリケーションとして動作する仮想マシンモニタではなく、XenやKVM（Kernel-based  Virtual  Machine）のようにホストＯＳと仮想マシンモニタを同じ層に実装するような仮想化を利用してもよい。また、仮想化実装のため、Intel（登録商標）-VT（Virtualization  Technology）のようなHW（ハードウェア）サポートを利用してもよい。
【００７９】
また、ログ探索部１６が、図８のＳ２５におけるログの探索において、ライブラリ関数の宣言やプロトタイプ情報を元に、どの引数のテイントタグを用いて探索するかを予め決めておいてもよい。このようにすることで、ログ探索部１６は、例えば、ライブラリ関数に複数の引数が入力値（入力データ）として与えられた場合でも、ログの探索を効率的に行うことができ、また、ライブラリ関数を特定する際の特定の精度を向上させることができる。なお、この探索対象の引数は、ライブラリ関数ごとに指定してもよいし、ライブラリ関数の出力引数に応じて、どの入力引数を辿るかを指定しておいてもよい。
【００８０】
また、本実施形態において説明した各処理のうち、自動的に行われるものとして説明した処理の全部または一部を手動的に行うこともできる。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、ＣＰＵおよび当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【００８１】
［プログラム］
また、情報処理装置が実行する処理をコンピュータが実行可能な言語で記述した監視プログラムを作成することもできる。この場合、コンピュータが監視プログラムを実行することにより、上記実施形態と同様の効果を得ることができる。さらに、かかる監視プログラムをコンピュータ読み取り可能な記録媒体に記録して、この記録媒体に記録された監視プログラムをコンピュータに読み込ませて実行することにより上記実施形態と同様の処理を実現してもよい。以下に、図１等に示した情報処理装置と同様の機能を実現する監視プログラムを実行するコンピュータの一例を説明する。
【００８２】
図９は、監視プログラムを実行するコンピュータを示す図である。図９に示すように、コンピュータ１０００は、例えば、メモリ１０１０と、ＣＰＵ１０２０と、ハードディスクドライブインタフェース１０３０と、ディスクドライブインタフェース１０４０と、シリアルポートインタフェース１０５０と、ビデオアダプタ１０６０と、ネットワークインタフェース１０７０とを有する。これらの各部は、バス１０８０によって接続される。
【００８３】
メモリ１０１０は、ＲＯＭ（Read  Only  Memory）１０１１およびＲＡＭ１０１２を含む。ＲＯＭ１０１１は、例えば、ＢＩＯＳ（Basic  Input  Output  System）等のブートプログラムを記憶する。ハードディスクドライブインタフェース１０３０は、ハードディスクドライブ１０９０に接続される。ディスクドライブインタフェース１０４０は、ディスクドライブ１１００に接続される。ディスクドライブ１１００には、例えば、磁気ディスクや光ディスク等の着脱可能な記憶媒体が挿入される。シリアルポートインタフェース１０５０には、例えば、マウス１１１０およびキーボード１１２０が接続される。ビデオアダプタ１０６０には、例えば、ディスプレイ１１３０が接続される。
【００８４】
ここで、図９に示すように、ハードディスクドライブ１０９０は、例えば、ＯＳ１０９１、アプリケーションプログラム１０９２、プログラムモジュール１０９３およびプログラムデータ１０９４を記憶する。上記実施形態で説明した監視対象のプログラムは、例えばハードディスクドライブ１０９０やメモリ１０１０に記憶される。
【００８５】
また、監視プログラムは、例えば、コンピュータ１０００によって実行される指令が記述されたプログラムモジュールとして、例えば、ハードディスクドライブ１０９０に記憶される。具体的には、プログラム実行部１３、判定部１４、ライブラリ関数実行監視部１５およびログ探索部１６によって実行される指令が記述されたプログラムモジュールが、ハードディスクドライブ１０９０に記憶される。
【００８６】
また、監視プログラムによる情報処理に用いられるデータは、プログラムデータとして、例えば、ハードディスクドライブ１０９０に記憶される。そして、ＣＰＵ１０２０が、ハードディスクドライブ１０９０に記憶されたプログラムモジュールやプログラムデータを必要に応じてＲＡＭ１０１２に読み出して、上述した各手順を実行する。
【００８７】
なお、監視プログラムに係るプログラムモジュールやプログラムデータは、ハードディスクドライブ１０９０に記憶される場合に限られず、例えば、着脱可能な記憶媒体に記憶されて、ディスクドライブ１１００等を介してＣＰＵ１０２０によって読み出されてもよい。あるいは、監視プログラムに係るプログラムモジュールやプログラムデータは、ＬＡＮ（Local  Area  Network）やＷＡＮ（Wide  Area  Network）等のネットワークを介して接続された他のコンピュータに記憶され、ネットワークインタフェース１０７０を介してＣＰＵ１０２０によって読み出されてもよい。
【符号の説明】
【００８８】
１      ハードウェア
３      仮想マシンソフトウェア
１０    仮想マシン
１０ａ  仮想物理メモリ
１０ｂ  シャドウメモリ
１１ａ  仮想ディスク
１１ｂ  シャドウディスク
１２    仮想ＣＰＵ
１３    プログラム実行部
１４    判定部
１５    ライブラリ関数実行監視部
１６    ログ探索部
１８    仮想ＨＷコントローラ
１８ａ  テイント情報伝搬部
１１０  ログ記憶部
【図１】
0006023317.tif 000002
【図２】
0006023317.tif 000003
【図３】
0006023317.tif 000004
【図４】
0006023317.tif 000005
【図５】
0006023317.tif 000006
【図６Ａ】
0006023317.tif 000007
【図６Ｂ】
0006023317.tif 000008
【図７】
0006023317.tif 000009
【図８】
0006023317.tif 000010
【図９】
0006023317.tif 000011