(57)【特許請求の範囲】
【請求項１】
Ｊａｖａ（登録商標）アプリケーションのリスク評価を行う解析装置であって、
特定の情報を変数又はオブジェクトに格納する処理を行う第一のメソッドの名称と、変数又はオブジェクトに対して所定の処理を行う第二のメソッドの名称とを記憶する記憶手段と、
解析対象のクラスファイルに含まれるバイトコードを解析し、前記特定の情報が格納された変数又はオブジェクトに対して前記所定の処理が行われるのか否かを追跡することで、前記解析対象のクラスファイルで使用される変数又はオブジェクトに値を書き込むメソッドの名称、及び、前記変数又はオブジェクトに格納された値を読込むメソッドの名称が記録された履歴を生成する、解析手段と、
前記履歴に記録された前記変数又はオブジェクトに値を書き込むメソッドの名称のうち、前記第一のメソッドの名称と同一であるメソッドにより値が書き込まれた変数又はオブジェクトが抽出されるか否か、及び、抽出された変数又はオブジェクトが前記第二のメソッドの名称と同一の名称のメソッドで読込まれているか否かを検索することで、リスク評価を行う評価手段と、
を有し、
前記評価手段は、
前記履歴に記録された前記変数又はオブジェクトに値を書き込むメソッドの名称のうち、前記第一のメソッドの名称と同一であるメソッドにより値が書き込まれた変数又はオブジェクトが抽出されない場合、前記Ｊａｖａ（登録商標）アプリケーションはリスクが低であると評価し、
前記履歴に記録された前記変数又はオブジェクトに値を書き込むメソッドの名称のうち、前記第一のメソッドの名称と同一であるメソッドにより値が書き込まれた変数又はオブジェクトが抽出され、かつ、前記抽出された変数又はオブジェクトが前記第二のメソッドの名称と同一の名称のメソッドで読込まれていない場合、前記Ｊａｖａ（登録商標）アプリケーションはリスクが中であると評価し、
前記履歴に記録された前記変数又はオブジェクトに値を書き込むメソッドの名称のうち、前記第一のメソッドの名称と同一であるメソッドにより値が書き込まれた変数又はオブジェクトが抽出され、かつ、前記抽出された変数又はオブジェクトが前記第二のメソッドの名称と同一の名称のメソッドで読込まれている場合、前記Ｊａｖａ（登録商標）アプリケーションはリスクが高であると評価する、解析装置。
【請求項２】
前記特定の情報は、個人情報であり、
前記所定の処理は、変数又はオブジェクトに格納された値をネットワークに送信する処理である、
請求項１に記載の解析装置。
【請求項３】
コンピュータを、請求項１又は２に記載の解析装置の各手段として機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、解析装置及びプログラムに関する。
【背景技術】
【０００２】
近年、Ａｎｄｒｏｉｄ（登録商標）を搭載した携帯端末（スマートフォン）が登場し、開発者は、携帯端末用のアプリケーションを開発して第三者に配布することが可能になっている。特にＡｎｄｒｏｉｄ（登録商標）はＪａｖａ（登録商標）をベースとしていることから、Ｊａｖａ（登録商標）プログラミングの知識があれば、比較的容易に携帯端末用のアプリケーションの開発が可能である。
【０００３】
なお、携帯端末用のアプリケーションに関する従来技術として例えば特許文献１に開示された技術がある。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１４−０７１８４０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
携帯端末内には様々な個人情報が格納されていることから、携帯端末用のアプリケーションを作成する際は、これらの個人情報を外部に流出させるような動作を行うことがないように注意してアプリケーションの開発を行う必要がある。
【０００６】
ここで、作成されたアプリケーションの動作を分析する手法として、動的解析と静的解析の２つの手法が知られている。動的解析は、作成されたアプリケーションを実際に動作させることで精度の高い解析を実現する方法であるが、実際にアプリケーションを動作させるため、万が一、個人情報を外部に流出させるように動作するアプリケーションを作成してしまった場合、個人情報が外部に流出してしまう危険性がある。
【０００７】
一方、静的解析は、作成されたアプリケーションのソースコードを分析することで網羅性の高い解析を実現する方法であるが、複雑な処理を行うアプリケーションでは処理の見落としが発生する可能性があり、高精度な解析は難しいという問題がある。
【０００８】
開示の技術は上記に鑑みてなされたものであって、アプリケーションのリスク評価を、より安全かつ高精度に行うことが可能な技術を提供することを目的とする。
【課題を解決するための手段】
【０００９】
開示の技術の解析装置は、Ｊａｖａ（登録商標）アプリケーションのリスク評価を行う解析装置であって、特定の情報を変数又はオブジェクトに格納する処理を行う第一のメソッドの名称と、変数又はオブジェクトに対して所定の処理を行う第二のメソッドの名称とを記憶する記憶手段と、解析対象のクラスファイルに含まれるバイトコードを追跡することで、前記解析対象のクラスファイルで使用される変数又はオブジェクトに値を書き込むメソッドの名称、及び、前記変数又はオブジェクトに格納された値を読込むメソッドの名称が記録された履歴を生成する、解析手段と、前記履歴に記録された前記変数又はオブジェクトに値を書き込むメソッドの名称のうち、前記第一のメソッドの名称と同一であるメソッドにより値が書き込まれた変数又はオブジェクトが抽出されるか否か、及び、抽出された変数又はオブジェクトが前記第二のメソッドの名称と同一の名称のメソッドで読込まれているか否かを検索することで、リスク評価を行う評価手段と、を有する。
【発明の効果】
【００１０】
開示の技術によれば、アプリケーションのリスク評価を、より安全かつ高精度に行うことが可能な技術が提供される。
【図面の簡単な説明】
【００１１】
【図１】実施の形態に係る解析装置の機能構成の一例を示す図である。
【図２】実施の形態に係る解析装置が行う処理手順の一例を示すフローチャートである。
【図３】疑似メモリ領域及びメモリ操作履歴の一例を示す図である。
【図４】動作例を説明するための図である。
【図５】バイトコードを示す図である。
【図６】処理始点メソッド一覧の状態を示す図である。
【図７】疑似スタティック変数領域の状態を示す図である。
【図８】メモリ操作履歴及び疑似スタティック変数領域の状態を示す図である。
【図９】リスク評価処理の具体例を説明するための図である。
【図１０】変数の状態遷移を示す図である。
【発明を実施するための形態】
【００１２】
以下、図面を参照して本発明の実施の形態を説明する。なお、以下で説明する実施の形態は一例に過ぎず、本発明が適用される実施の形態は、以下の実施の形態に限られるわけではない。
【００１３】
以下の説明において、解析装置１０が解析対象とするＪａｖａ（登録商標）アプリケーションは、主にＡｎｄｒｏｉｄ（登録商標）端末用のアプリケーションであることを前提として説明するが、本実施の形態は、Ａｎｄｒｏｉｄ（登録商標）端末用のアプリケーションに限らず、Ｊａｖａ（登録商標）アプリケーション全般に適用することができる。
【００１４】
＜概要＞
本実施の形態に係る解析装置１０は、Ｊａｖａ（登録商標）アプリケーション（以下、単に「アプリケーション」と記載する）をコンパイルすることで生成されるクラスファイル（ｃｌａｓｓファイル）を用いてアプリケーションの動作を追跡することで、解析対象であるアプリケーションのリスク評価を行う。クラスファイルとは、ソースコード内に記述されているクラス毎に１つ生成されるファイルであり、クラスに関する情報が含まれるヘッダ部分と、クラス内で定義されるメソッドの実行内容が記述されたバイトコードから構成されているファイルである。
【００１５】
まず、解析装置１０は、解析対象とするアプリケーションのクラスファイルに含まれるバイトコードを追跡することで、クラスファイルで使用される変数及びオブジェクトに値を書き込むメソッドの名称、及び、当該変数及びオブジェクトに格納された値を読込むメソッドの名称が記録された履歴（以下、「メモリ操作履歴」と呼ぶ）を生成する。
【００１６】
続いて、解析装置１０は、メモリ操作履歴に記録された、変数又はオブジェクトに値を書き込むメソッドの名称のうち、特定の情報（例えば、リスクが高いと判断される個人情報など）を変数又はオブジェクトに格納する処理を行うメソッドにより値が書き込まれた変数又はオブジェクトが抽出されるか否か、及び、抽出された変数又はオブジェクトが、所定の処理（例えば、変数又はオブジェクトに格納された値をネットワークに送信する処理）を行うメソッドで読込まれているか否かを検索することで、アプリケーションのリスク評価を行う。
【００１７】
つまり、本実施の形態に係る解析装置１０は、解析対象とするアプリケーションのクラスファイルに含まれるバイトコードを解析し、特定の情報（例えば個人情報など）に対して所定の処理（例えば、変数又はオブジェクトに格納された値をネットワークに送信する処理）が行われるのか否かを追跡することで、実際にアプリケーションを実行することなくリスク評価を行うことを可能にする。また、ソースコードそのものを解析するのではなくバイトコードを解析するようにすることで、ソースコードが難読化されている場合であっても実際の変数の値及びオブジェクトの値の状態遷移を高精度に追跡することを可能にする。
【００１８】
＜機能構成＞
図１は、実施の形態に係る解析装置１０の機能構成の一例を示す図である。図１に示すように、解析装置１０は、記憶部１０１と、初期化部１０２と、解析部１０３と、評価部１０４とを有する。これら各部は、解析装置１０にインストールされた１以上のプログラムが、解析装置１０のＣＰＵに実行させる処理により実現される。なお、記憶部１０１、初期化部１０２、解析部１０３、及び評価部１０４ごとに、異なるコンピュータを用いて実現されてもよいし、更に細かい単位でコンピュータが分散されていてもよい。すなわち、解析装置１０は、１又は複数のコンピュータを用いて実現されてもよい。また、当該１又は複数のコンピュータは、仮想化技術を利用した仮想サーバであってもよいし、クラウド上に実装された仮想サーバであってもよい。
【００１９】
記憶部１０１は、メモリ、ＨＤＤ（Hard Disk）等を用いて実現され、「解析対象のクラスファイル」、「メモリ操作履歴ＤＢ」、「処理開始メソッド情報」、「疑似メモリ領域」、及び「リスク評価情報」が格納される。
【００２０】
「解析対象のクラスファイル」は、解析対象であるアプリケーションのソースコードをコンパイルすることで生成されるクラスファイルである。Ａｎｄｒｏｉｄ（登録商標）端末用のアプリケーションの場合、クラスファイルは、ＡＰＫ（application package）ファイルを所定のツールを用いて展開することで抽出することが可能である。
【００２１】
「処理始点メソッド一覧」には、解析対象のアプリケーションにおいて処理を開始する始点となるメソッドのメソッド名の一覧が格納される。ここで、処理を開始する始点となるメソッドとは、ユーザが何かしらのアクションを行った際に呼び出されるメソッドであり、例えば、ユーザ操作によりアプリケーションが起動されて画面表示される際に必ず呼び出されるメソッド（一例としてonCreateメソッド）、ユーザが画面上でボタンを押下した際に呼び出されるメソッド（一例としてonClickメソッド）などである。
【００２２】
「疑似メモリ領域」は、アプリケーションがＪａｖａ（登録商標）ＶＭ（Ａｎｄｒｏｉｄ（登録商標）の場合はＤａｌｖｉｋＶＭ）上で実行される際に用いられるメモリ領域を疑似的に実現するためのメモリ領域である。疑似メモリ領域には、クラス内でスタティック宣言（static）された変数が格納されるメモリ領域（スタティック領域（静的領域））を疑似的に実現する「疑似スタティック変数領域」、メソッド内に閉じたメモリ領域であり、自クラスのインスタンス（実行中の自クラスのオブジェクト）、ローカル変数及び引数が格納される領域（ローカル変数領域）を疑似的に実現する「疑似ローカル変数領域」、並びに、メソッド実行時に変数及びオブジェクトを一時的に格納するスタックを疑似的に実現する「疑似オペランドスタック領域」が含まれる。「疑似スタティック変数領域」、「疑似ローカル変数領域」、及び「疑似オペランドスタック領域」は、アプリケーションの解析が開始される際に、記憶部１０１内に動的に生成される。
【００２３】
「解析用情報」には、解析装置１０の利用者により予め登録された「処理始点メソッド情報」及び「リスク評価情報」が含まれる。「処理始点メソッド情報」には、アプリケーションにおいて処理を開始する始点となるメソッドとして予め規定されているメソッド名の一覧（例えば、Ａｎｄｒｏｉｄ（登録商標）アプリケーションの場合、前述のonCreateメソッド、onClickメソッドなど）が格納されている。「リスク評価情報」は、特定の情報（例えば、個人情報など）を変数又はオブジェクトに格納する処理を行うメソッドのメソッド名（一例として、携帯電話の電話番号を取得するメソッドであるTelephonyManagerクラスのgetDeviceIDメソッド）の一覧、及び、所定の処理（例えば、変数又はオブジェクトに格納された値をネットワークに送信する処理）を行うメソッドとして予め規定されているメソッド名（一例として、httpクラスのsendRequestメソッド、WebViewクラスのloadUrlメソッドなど）の一覧が格納される。
【００２４】
初期化部１０２は、解析装置１０がアプリケーションの解析を開始する際に、解析対象であるアプリケーションのＡＰＫファイルを読み込み、記憶部１０１の「解析対象のクラスファイル」にクラスファイルを展開する等の処理を行う。
【００２５】
解析部１０３は、クラスファイルに含まれるバイトコードを追跡することでアプリケーションの動作を解析し、メモリ操作履歴を生成する。具体的な処理手順については後述する。
【００２６】
評価部１０４は、メモリ操作履歴に記録された内容と、「リスク評価情報」に格納されているメソッド名とを比較することで、アプリケーションのリスク評価を行う。より具体的には、評価部１０４は、メモリ操作履歴に記録された、変数又はオブジェクトに値を書き込むメソッドの名称のうち、特定の情報（例えば、個人情報など）を変数又はオブジェクトに格納する処理を行うメソッドにより値が書き込まれた変数又はオブジェクトが抽出されるか否か、及び、抽出された変数又はオブジェクトが、所定の処理（例えば、変数又はオブジェクトに格納された値をネットワークに送信する処理）を行うメソッドで読込まれているか否かを検索することで、アプリケーションのリスク評価を行う。
【００２７】
＜処理手順＞
図２は、実施の形態に係る解析装置１０が行う処理手順の一例を示すフローチャートである。図２を用いて、解析装置１０が行う処理手順を具体的に説明する。
【００２８】
ステップＳ１０１で、初期化部１０２は、解析対象のアプリケーションのＡＰＫファイルを読込み、ＡＰＫファイルを所定のツールを用いて展開することで１以上のクラスファイルを抽出し、記憶部１０１の「解析対象のクラスファイル」に格納する。
【００２９】
ステップＳ１０２で、解析部１０３は、「解析対象のクラスファイル」に記憶されている１以上のクラスファイルの内容と「処理開始メソッド情報」とを比較することで、解析対象のアプリケーションにおいて処理を開始する起点となるメソッドの一覧を生成し、メソッドを一意に識別するためのＩＤ（以下、「始点ＩＤ」と呼ぶ）と対応づけて「処理始点メソッド一覧」に格納する。なお、解析部１０３は、「解析対象のクラスファイル」に記憶されている１以上のクラスファイルを全て検索するのではなく、画面表示に必要なスーパークラス（例えば、android.app.Activityクラス）を承継しているクラスを対象に検索するようにしてもよい。Ａｎｄｒｏｉｄ（登録商標）のアプリケーションでは、基本的に、起動時に画面表示が行われる（つまり、画面表示を行うクラスが呼び出される）ため、解析部１０３は、処理を開始する起点となるメソッドの検索を効率的に行うことができる。
【００３０】
ステップＳ１０３で、解析部１０３は、「処理始点メソッド一覧」にメソッドが格納されているクラスファイル（つまり、処理始点メソッドを含むクラスのクラスファイル）を「解析対象のクラスファイル」から読み出すと共に、「疑似スタティック変数領域」を記憶部１０１内に生成する。続いて、クラスファイル内でスタティック宣言されている変数を検索し、変数名及び変数に格納される値を「疑似スタティック変数領域」に記録する。例えば、Ａクラスのクラスファイル内で"ｔｅｌｌｎｕｍ"という名称の変数がスタティック宣言され、"ＸＸＸ"の値が格納される場合、解析部１０３は、図３（ａ）に示すように、「疑似スタティック変数領域」に、変数名"Ａ．ｔｅｌｌｎｕｍ"と値"ＸＸＸ"とを記録する。
【００３１】
続いて、解析部１０３は、「処理始点メソッド一覧」に格納されているメソッドを１つ選択し、当該メソッド内に閉じた疑似的なメモリ領域である「疑似ローカル変数領域」を記憶部１０１内に生成する。図３（ｂ）に「疑似ローカル変数領域」の一例を示す。「疑似ローカル変数領域」は、メソッド内で生成されるローカル変数（メソッド呼出し時に渡される引数を含む）、及び、メソッド内で生成されるオブジェクトごとに、特定のメモリ領域番号が対応づけられて格納される。メモリ領域番号は、バイトコード上でローカル変数又はオブジェクトを指定する際に用いられる番号であり、メモリ領域番号「１」には、自クラスのインスタンス（つまり、メソッドが実行される自クラスのオブジェクト）が格納される領域として予約されている。これは、Ｊａｖａ（登録商標）ＶＭ（ＤａｌｖｉｋＶＭ）上でのローカル変数領域の動作と同一である。
【００３２】
続いて、解析部１０３は、「疑似オペランドスタック領域」を記憶部１０１内に生成する。「疑似オペランドスタック領域」は、Ｊａｖａ（登録商標）ＶＭ（ＤａｌｖｉｋＶＭ）上で用意されるオペランドスタックと同様、後入れ先出し（ＬＩＦＯ：Last In First Out）で変数及びオブジェクトを一時的に格納するための領域であり、バイトコードの動作を追跡する際に用いられる。図３（ｃ）に「疑似オペランドスタック領域」の一例を示す。スタックＩＤは、バイトコードの動作を追跡する際にスタックの位置を特定するために用いられるＩＤである。
【００３３】
続いて、解析部１０３は、選択されたメソッドのバイトコードをアドレス順に追跡する。バイトコードは、Ｊａｖａ（登録商標）ＶＭ（ＤａｌｖｉｋＶＭ）で定義されたインストラクション（命令）の組み合わせで構成されている。Ｊａｖａ（登録商標）ＶＭ（ＤａｌｖｉｋＶＭ）では様々なインストラクションが定義されているが、基本的に、スタティック領域又はローカル変数領域から変数又はオブジェクトをオペランドスタックにＰＵＳＨしたり、オペランドスタックから変数又はオブジェクトをＰＯＰしてスタティック領域又はローカル変数領域に格納したりという動作が定義されている。
【００３４】
解析部１０３は、選択されたメソッドのバイトコードをアドレス順に追跡し、スタティック変数、ローカル変数、オブジェクト、及びオペランドスタックに対して、どのような操作が行われるのかをメモリ操作履歴に記録していく。より具体的には、解析部１０３は、バイトコードにアドレス順に記載されているインストラクションの動作を、疑似スタティック領域、疑似ローカル変数領域、疑似オペランドスタック領域を用いて疑似的に実行する（ＰＵＳＨ／ＰＯＰの動作を疑似的に行う）ことで、スタティック変数、ローカル変数、オブジェクト、及びオペランドスタックに対して、どのような操作が行われるのかを把握してメモリ操作履歴に記録しておく。
【００３５】
図３（ｄ）にメモリ操作履歴の例を示す。「始点ＩＤ」には、選択されたメソッド（追跡対象のメソッド）の始点ＩＤが記録される。「ノードＩＤ」には、メモリ操作履歴の履歴順に割当てられるＩＤが記録される。「親ノードＩＤ」には、その履歴に係る操作の前に実行された操作に対応するノードＩＤが記録される。「読込先」には、その履歴に係る操作で読み込まれたスタティック変数の変数名、疑似スタティック領域のメモリ領域番号、又は、疑似オペランドスタック領域のスタックＩＤが記録される。「書込先」には、その履歴に係る操作で値が書き込まれたスタティック変数の変数名、疑似スタティック領域のメモリ領域番号、又は、疑似オペランドスタック領域のスタックＩＤが記録される。「操作名」には、その履歴に係る操作を行ったメソッドのメソッド名が記録される。なお、解析部１０３は、インストラクションにより、ファイル、データベース又はSharedPreferences（アプリケーションの設定値を保存するxmlファイル）への書込み、若しくは、ファイル、データベース又はSharedPreferencesからの読込みが行われる場合、「読込先」及び「書込先」に、当該ファイルを特定する情報（ファイルを一意に識別するためのＩＤなど）、当該データベースを特定する情報（データベースを一意に識別するためのＩＤなど）、又は、SharedPreferencesを特定する情報（SharedPreferencesを一意に識別するためのＩＤなど）を記録するようにしてもよい。
【００３６】
ここで、解析部１０３は、バイトコードを追跡している際にメソッドの呼び出しを検出し、かつ、そのメソッドがＡＰＫファイル内で定義されている場合（つまり、Ａｎｄｒｏｉｄ（登録商標）の仕様で予め定義されたメソッドではない場合）、メソッド呼出しを検出した時点の疑似ローカル変数領域及び疑似オペランドスタック領域のスナップショットを作成しておき、呼び出されたメソッドに対して、新たにバイトコードの追跡を行う。この場合、当該呼び出されたメソッドに対して、新たな疑似ローカル領域及び疑似オペランドスタック領域が生成されることになる。解析部１０３は、当該呼び出されたメソッドの追跡が完了すると、上述のスナップショットを用いて疑似ローカル変数領域及び疑似オペランドスタック領域をスナップショット作成時の状態に戻し、元のメソッドのバイトコードの追跡を続ける。
【００３７】
また、解析部１０３は、バイトコードを追跡している際にｉｆ文などの条件分岐を検出した場合、分岐の直前で疑似ローカル変数領域及び疑似オペランドスタック領域のスナップショットを作成しておき、分岐後のバイトコードの追跡が完了した後、スナップショットを用いて疑似ローカル変数領域及び疑似オペランドスタック領域を分岐の直前の状態に戻し、次の分岐についてバイトコードの追跡を行う。解析部１０３は、これらの動作を全ての分岐に対して繰り返し行うことで、全ての分岐についてバイトコードの追跡を行う。なお、分岐数が多いと処理量が膨大になる可能性があるため、解析部１０３は、ｅｌｓｅ句が存在しない分岐の場合、又は、解析装置１０の利用者により指示された分岐については追跡を行わないようにしてもよい。
【００３８】
解析部１０３は、以上説明した追跡処理を、「処理始点メソッド一覧」に格納されている全てのメソッドについて行い、追跡結果をメモリ操作履歴に記録していく。
【００３９】
ステップＳ１０４で、評価部１０４は、メモリ操作履歴に記録された各履歴の「操作名」に記録されたメソッド名のうち、「リスク評価情報」に格納されている"特定の情報を変数又はオブジェクトに格納する処理を行うメソッドのメソッド名"と一致するメソッドが存在するか否かを検索する。一致するメソッドが存在する場合、評価部１０４は、解析対象のアプリケーションは特定の情報（例えば個人情報など）を取得していると判断する。
【００４０】
続いて、評価部１０４は、一致するメソッドが存在する場合、そのメソッドの履歴の「書込先」に記録されている情報（スタティック変数の変数名、疑似スタティック領域のメモリ領域番号、又は、疑似オペランドスタック領域のスタックＩＤ）と同一の情報（スタティック変数の変数名、疑似スタティック領域のメモリ領域番号、又は、疑似オペランドスタック領域のスタックＩＤ）が「読込先」に記録されている履歴を特定する。続いて、評価部１０４は、特定された履歴の「操作名」に記録されているメソッド名の中に、「リスク評価情報」に格納されている"所定の処理を行うメソッドとして予め規定されているメソッド名"と一致するメソッド名が存在するかを検索する。一致するメソッド名が存在する場合、評価部１０４は、解析対象のアプリケーションは特定の情報（例えば個人情報）を取得し、かつ、取得した特定の情報に対して所定の処理（例えば、ネットワークに送信する処理）を行っている判断する（「リスク大」と判断する）。一方、一致するメソッド名が存在しない場合、評価部１０４は、解析対象のアプリケーションは特定の情報を取得するが、所定の処理は行っていないと判断する（「リスク中」と判断する）。
【００４１】
＜動作例＞
続いて、解析装置１０がアプリケーションの解析を行う際の具体的な動作例を説明する。図４（ａ）に、動作例の説明に用いるアプリケーションのソースコードを示す。本アプリケーションは端末の電話番号を画面上に表示するアプリケーションであるが、画面表示前に行われる処理（onCreateメソッド）の中に、端末の電話番号をネットワークに送信する処理が埋め込まれている。図４（ｂ）は、図４（ａ）に示すソースコードが実行された際の画面表示例を示している。
【００４２】
図４（ａ）に示すソースコードの左側に付与されている番号（１０〜１５０）は、ソースコードの行を示すために便宜上付与した番号であり、実際のソースコード内には存在しないものである。図４（ａ）に示すソースコードによれば、アプリケーションの実行が開始された後、端末の画面表示が行われる前に実行される３０行目〜１００行目までの処理において、２０行目の処理で宣言されたスタティック変数「MainActivity.tellNum」に対して、７０行目の処理で端末の電話番号が書き込まれ、９０行目の処理で電話番号が書き込まれた変数「MainActivity.tellNum」を含むＵＲＬの送信が行われる。また、図４（ｂ）に示す「表示」ボタンが押下された際、１１０〜１４０行目までの処理が行われることで電話番号が書き込まれた変数「MainActivity.tellNum」が画面上に表示される。
【００４３】
図４（ａ）に示すソースコードに対応するバイトコードの例を図５に示す。図５（ａ）は、図４（ａ）の１０行目及び２０行目に対応するバイトコードであり、図５（ｂ）は、図４（ａ）のonClassメソッド（３０〜１００行目）に対応するバイトコードであり、図５（ｃ）は、図４（ａ）のonClickメソッド（１１０〜１４０行目）に対応するバイトコードである。
【００４４】
以下、図４及び図５を参照しつつ、解析装置１０がアプリケーションの解析を行う際の具体的な動作例を説明する。なお、以下の説明では、説明を簡略化するために、端末の電話番号が格納される「疑似スタティック変数領域」の状態のみを示し、「疑似ローカル変数領域」の状態「疑似オペランドスタック変数領域」の状態については省略する。また、バイトコードはアセンブリ言語に近いコードであり一見して内容の把握が難しいことから、動作例の説明に必要なバイトコードに絞りつつ、バイトコードの処理を適宜ソースコードの処理に置き換えて説明する。
【００４５】
まず、解析部１０３は、「解析対象のクラスファイル（ここでは、図５のバイトコードを含むMainActivityクラスのクラスファイル）」の内容と「処理開始メソッド情報」とを比較することで、解析対象のアプリケーションにおいて処理を開始する起点となるメソッドの一覧を生成し、始点ＩＤと対応づけて「処理始点メソッド一覧」に格納する。図６は、生成された「処理開始メソッド一覧」の具体例を示している。「始点ＩＤ」は、例えば１から順に付与され、図６の例では、「MainActivity.onCreate」メソッドの始点ＩＤには「１」が付与され、「MainActivity.onClick」メソッドの始点ＩＤには「２」が付与されている。
【００４６】
続いて、解析部１０３は、「解析対象のクラスファイル」内でスタティック宣言されている変数を検索し、変数名及び値を「疑似スタティック変数領域」に記録する。具体的には、解析部１０３は、図５（ａ）のバイトコードにおいて、アドレス０のインストラクション（ldc）でオペランドスタックにPUSHされた空の文字列""が、アドレス２のインストラクション（putstatic）により、オペランドスタックからスタティック変数「MainActivity.tellNum」にPUTされていることを発見し、変数名「MainActivity.tellNum」と値「""」を「疑似スタティック変数領域」に記録する。図７は、「疑似スタティック変数領域」の具体例を示している。
【００４７】
続いて、解析部１０３は、「処理始点メソッド一覧」に格納されているメソッドから、始点ＩＤ＝「１」である「MainActivity.onCreate」を選択し、当該メソッド内に閉じた疑似的なメモリ領域である「疑似ローカル変数領域」及び「疑似オペランドスタック領域」を記憶部１０１内に生成する。
【００４８】
続いて、解析部１０３は、「MainActivity.onCreate」メソッドのバイトコードをアドレス順に追跡する。バイトコードのアドレス０〜１１までの追跡結果については、本動作例におけるリスク評価には影響しない部分であるため説明は省略する。続いて、解析部１０３は、ソースコードの６０行目に対応するバイトコードのアドレス１２及び１４のインストラクションを解析する。アドレス１２のインストラクション（ldc）は、"phone"をオペランドスタックにPUSHする処理を示している。アドレス１４のインストラクション（invokevirtual）は、メソッド「getSystemService」に引数「Ljava/lang/String」（オペランドスタックからPOPされる"phone"）を与えて呼び出し、メソッド「getSystemService」の実行結果として返されるオブジェクト「Ljava/lang/Object」をオペランドスタックにPUSHする処理を示している。
【００４９】
解析部１０３は、バイトコードのアドレス１２及び１４のインストラクションの解析結果をメモリ操作履歴に格納する。具体的には、アドレス１２及びアドレス１４のインストラクションの解析結果として、メモリ操作履歴の「操作名」には、呼び出されたメソッドの名称「getSystemService」が記録され、「読込先」には、引数「Ljava/lang/String」としてオペランドスタックからPOPされる"phone"が記録され、「書込先」には、実行結果として返されるオブジェクト「Ljava/lang/Object」が書き込まれるオペランドスタックのスタックＩＤ（実際には疑似オペランドスタック領域のスタックＩＤ）が記録される。
【００５０】
この時点のメモリ操作履歴の状態を図８（ａ）に示す。なお、図８（ａ）は、説明を簡略化するためにソースコードの表現に置き換えてある（以下、図８（ｂ）、図８（ｃ）、図８（ｄ）も同様）。具体的には、「読込先」には、"phone"に相当するソースコード６０行目の「TELEPHONY_SERVICE」を記載し、「書込先」には、疑似オペランドスタック領域のスタックＩＤに代えて、「getSystemService」メソッドの実行結果として返されるオブジェクトに相当するソースコード６０行目の「telephonyManager」オブジェクトを記載している。また、図８（ａ）のメモリ操作履歴では、ノードＩＤとして便宜上「１」を記載しているが、実際のメモリ操作履歴では、バイトコードのアドレス０〜１１までの追跡結果により記録されているノードＩＤの値に１を加えた値が記録されることになる。
【００５１】
続いて、解析部１０３は、ソースコードの７０行目に対応するバイトコードのアドレス２０及び２３のインストラクションを解析する。アドレス２０のインストラクション（invokevirtual）は、TelephonyManagerクラスのメソッド「getLine1Number」に引数（オペランドスタックからPOPされるtelephonyManagerオブジェクト）を与えて呼出し、メソッド「getLineNumber」の実行結果として返されるオブジェクト「Ljava/lang/String」をオペランドスタックにPUSHする処理を示している。また、アドレス２３のインストラクション（putstatic）は、オペランドスタックから文字列をPOPしてスタティック変数「MainActivity.tellNum」にPUSHする処理を示している。
【００５２】
解析部１０３は、バイトコードのアドレス２０及び２３のインストラクションの解析結果をメモリ操作履歴に格納する。この時点でのメモリ操作履歴の状態を、説明を簡略化するためにソースコードの表現に置き換えた履歴を図８（ｂ）に示す。「操作名」には、呼び出されたメソッドの名称「telephonyManager.getLine1Number」が記録され、「書込先」には、「telephonyManager.getLine1Number」の実行結果が書き込まれたスタティック変数「MainActivity.tellNum」が記録される。また、「親ノードＩＤ」には１つ前の処理のノードＩＤ「１」が記録され、「ノードＩＤ」には、１つ前の処理のノードＩＤに１を加えた値「２」が記録される。また、疑似スタティック変数領域の「MainActivity.tellNum」に対応する値が、「""」から「telephonyManager.getLine1Number（）」に更新される。なお、疑似スタティック変数領域は、あくまで疑似的な領域であり実際にアプリケーションが実行された結果が格納されるのではないため、実際の端末の電話番号ではなく「telephonyManager.getLine1Number（）」が格納されることになる。
【００５３】
続いて、解析部１０３は、ソースコードの８０行目及び９０行目に対応するバイトコードのアドレス２６〜５２のインストラクションを解析する。アドレス２６〜５２のインストラクションごとの詳細な説明は省略するが、アドレス２６〜３１のインストラクションでWebViewクラスのオブジェクトを生成し、アドレス３４〜４９のインストラクションで、文字列"http://xxxx.co.jp/?tell="とスタティック変数「MainActivity.tellNum」の値とを結合し、アドレス５２のインストラクション（invokevirtual）で、webViewクラスのオブジェクトの「loadUrl」メソッドに結合した文字列を引数として与えて呼出す動作を示している。
【００５４】
解析部１０３は、バイトコードのアドレス２６〜５２のインストラクションの解析結果をメモリ操作履歴に格納する。この時点でのメモリ操作履歴の状態を、説明を簡略化するためにソースコードの表現に置き換えた履歴を図８（ｃ）に示す。「操作名」には、呼び出されたメソッドの名称「webView.loadUrl」が記録され、「読込先」には、メソッド「webView.loadUrl」に引数として与えられたスタティック変数「MainActivity.tellNum」が記録される。また、「親ノードＩＤ」には１つ前の処理のノードＩＤ「２」が記録され、「ノードＩＤ」には、１つ前の処理のノードＩＤに１を加えた値「３」が記録される。以上で、「MainActivity.onCreate」メソッドのバイトコードの追跡が完了する。
【００５５】
続いて、解析部１０３は、「処理始点メソッド一覧」に格納されているメソッドから、始点ＩＤ＝「２」である「MainActivity.onClick」を選択し、当該メソッド内に閉じた疑似的なメモリ領域である「疑似ローカル変数領域」及び「疑似オペランドスタック領域」を記憶部１０１内に生成する。
【００５６】
続いて、解析部１０３は、「MainActivity.onClick」メソッドのバイトコードをアドレス順に追跡する。解析部１０３は、ソースコードの１１０行目〜１３０行目に対応するバイトコードのアドレス０〜２５のインストラクションを解析する。アドレス０〜２５のインストラクションごとの詳細な説明は省略するが、アドレス０及び１のインストラクションでTextViewクラスのオブジェクト「textview」を生成し、アドレス４〜１９のインストラクションで、文字列"tel Number:"とスタティック変数「MainActivity.tellNum」の値とを結合し、アドレス２２のインストラクション（invokevirtual）で、TextViewクラスのオブジェクトの「setText」メソッドに結合した文字列を引数として与えて呼出す動作を示している。
【００５７】
解析部１０３は、バイトコードのアドレス０〜２５のインストラクションの解析結果をメモリ操作履歴に格納する。この時点でのメモリ操作履歴の状態を、説明を簡略化するためにソースコードの表現に置き換えた履歴を図８（ｄ）に示す。「操作名」には、呼び出されたメソッドの名称「textview.setText」が記録され、「読込先」には、メソッド「textview.setText」に引数として与えられたスタティック変数「MainActivity.tellNum」が記録される。また、「ノードＩＤ」には、１つ前の処理のノードＩＤに１を加えた値「４」が記録される。なお、始点ＩＤ＝「２」である「MainActivity.onClick」メソッドに関する最初の履歴であるため、「親ノードＩＤ」には何も記録されない。以上で、「MainActivity.onClick」メソッドのバイトコードの追跡が完了する。
【００５８】
解析部１０３によるクラスファイルの解析が完了すると、評価部１０４は、メモリ操作履歴を検索することでリスク評価を行う。本動作例では、「telephonyManager.getLine1Number」メソッドが"特定の情報を変数又はオブジェクトに格納する処理を行うメソッドのメソッド名"として「リスク評価情報」に格納されている前提とする。また、「webView.loadUrl」メソッドが"所定の処理（例えば、ネットワークに送信する処理）を行うメソッドとして予め規定されているメソッド名"として「リスク評価情報」に格納されている前提とする。
【００５９】
図９は、クラスファイルの解析が完了した時点のメモリ操作履歴の状態を示している。評価部１０４は、メモリ操作履歴に記録された各履歴の「操作名」に記録されたメソッド名のうち、「リスク評価情報」に格納されている"特定の情報を変数又はオブジェクトに格納する処理を行うメソッドのメソッド名"と一致するメソッドが存在するか否かを検索する。図９の例では、「ノードＩＤ」＝「２」の履歴の操作名に「telephonyManager.getLine1Number」メソッドが記録されていることから、評価部１０４は、解析対象のアプリケーションはリスクが高いと判断される情報を取得していると判断する。
【００６０】
続いて、評価部１０４は、「ノードＩＤ」＝「２」の履歴で「書込先」に記録されている「MainActivity.tellNum」が「読込先」に記録されている履歴を特定する。図９の例では、「ノードＩＤ」＝「３」及び「４」の履歴が該当する。続いて、評価部１０４は、特定された履歴の「操作名」に記録されているメソッド名の中に、「リスク評価情報」に格納されている"所定の処理（例えば、ネットワークに送信する処理）を行うメソッドとして予め規定されているメソッド名"と一致するメソッド名が存在するかを検索する。図９の例では、「ノードＩＤ」＝「３」の履歴の操作名に「webView.loadUrl」メソッドが記録されていることから、評価部１０４は、解析対象のアプリケーションは特定の情報（個人情報である電話番号）を取得し、かつ、取得した情報に対して所定の処理（例えば、ネットワークに送信する処理）を行っていると判断する（「リスク大」と判断する）。
【００６１】
以上の解析により判明したスタティック変数「MainActivity.tellNum」の状態遷移を図１０に示す。Ａ１は初期状態であり、図７及び図８（ａ）の状態に対応する。Ａ２は「telephonyManager.getLine1Number」メソッドにより値が書き込まれた状態であり、図８（ｂ）の状態に対応する。Ａ３は「webView.loadUrl」メソッドにより値が参照された状態であり、図８（ｃ）の状態に対応する。Ａ４は「textview.setText」メソッドにより値が参照された状態であり、図８（ｄ）の状態に対応する。
【００６２】
＜実施形態の補足＞
以上、実施の形態において、解析装置１０はクラウドサーバであってもよい。すなわち、図１に示す各機能部は、クラウドサーバ上に実装されるようにしてもよい。
【００６３】
以上、実施の形態に係る解析装置１０が有する各機能部は、解析装置１０が備えるＣＰＵ及びメモリなどのハードウェア資源を用いて、解析装置１０で実施される処理に対応するプログラムを実行することによって実現することが可能である。また、当該プログラムは、記憶媒体に格納することができる。また、実施の形態に係る解析装置１０は複数のコンピュータ等の組み合わせにより実現されてもよい。
【００６４】
記憶部１０５は、解析装置１０が備えるメモリ又は解析装置１０にネットワークを介して接続される記憶装置等を用いて実現可能である。
【００６５】
本発明は、上記の実施の形態に限定されることなく、特許請求の範囲内において、種々変更・応用が可能である。実施の形態で述べたシーケンスは、矛盾の無い限り順序を入れ替えてもよい。
【００６６】
実施の形態において、特定の情報を変数又はオブジェクトに格納する処理を行うメソッドのメソッド名は、「特定の情報を変数又はオブジェクトに格納する処理を行う第一のメソッドの名称」の一例である。所定の処理を行うメソッドとして予め規定されているメソッド名は、「変数又はオブジェクトに対して所定の処理を行う第二のメソッドの名称」の一例である。メモリ操作履歴は、履歴の一例である。
【符号の説明】
【００６７】
１０  解析装置
１０１  記憶部
１０２  初期化部
１０３  解析部
１０４  評価部
【図１】
0006770335.tif 000002
【図２】
0006770335.tif 000003
【図３】
0006770335.tif 000004
【図４】
0006770335.tif 000005
【図５】
0006770335.tif 000006
【図６】
0006770335.tif 000007
【図７】
0006770335.tif 000008
【図８】
0006770335.tif 000009
【図９】
0006770335.tif 000010
【図１０】
0006770335.tif 000011