(57)【特許請求の範囲】
【請求項１】
利用者情報を取得する第１の関数を実行する第２の関数の名称である第１の関数名と、前記第２の関数が定義された第１のクラスの名称である第１のクラス名とを、アプリケーションのプログラムを解析して取得する静的解析部と、
前記プログラムを実行する実行部と、
前記プログラムが実行されたときに呼び出された第３の関数の名称である第２の関数名と、前記第３の関数が定義された第２のクラスの名称である第２のクラス名とを含む、前記プログラムの実行結果に、前記第１のクラス名と前記第１の関数名との組み合わせが含まれるか否かを解析することにより、前記第２の関数が実行されたか否かを判定する動的解析部と、
前記動的解析部による判定の結果を示す情報を出力する出力部と、
を有することを特徴とするアプリケーション解析装置。
【請求項２】
前記第１のクラス名と前記第１の関数名との組み合わせの総数に対する、実行された前記第２の関数に関する前記第１のクラス名と前記第１の関数名との組み合わせの数の割合を算出する評価部をさらに有し、
前記出力部は、前記割合を出力する
ことを特徴とする請求項１に記載のアプリケーション解析装置。
【請求項３】
前記プログラムは、ライブラリを含み、
前記静的解析部はさらに、前記第１のクラスが定義された第１のライブラリの名称である第１のパッケージ名を、前記プログラムを解析して取得し、
前記動的解析部は、前記第２の関数名と、前記第２のクラス名と、前記第２のクラスが定義された第２のライブラリの名称である第２のパッケージ名とを含む、前記プログラムの実行結果に、前記第１のクラス名と前記第１の関数名と前記第１のパッケージ名との組み合わせが含まれるか否かを解析することにより、前記第２の関数が実行されたか否かを判定する
ことを特徴とする請求項１または請求項２に記載のアプリケーション解析装置。
【請求項４】
前記静的解析部はさらに、前記第１のクラスが定義された前記アプリケーションの名称である第３のパッケージ名を、前記プログラムを解析して取得し、
前記動的解析部は、前記第２の関数名と、前記第２のクラス名と、前記第２のクラスが定義された前記アプリケーションの前記第３のパッケージ名とを含む、前記プログラムの実行結果に、前記第１のクラス名と前記第１の関数名と前記第３のパッケージ名との組み合わせが含まれるか否かを解析することにより、前記第２の関数が実行されたか否かを判定する
ことを特徴とする請求項３に記載のアプリケーション解析装置。
【請求項５】
静的解析部と、実行部と、動的解析部と、出力部とを有するアプリケーション解析装置におけるアプリケーション解析方法であって、
前記静的解析部が、利用者情報を取得する第１の関数を実行する第２の関数の名称である第１の関数名と、前記第２の関数が定義された第１のクラスの名称である第１のクラス名とを、アプリケーションのプログラムを解析して取得する第１のステップと、
前記実行部が前記プログラムを実行する第２のステップと、
前記動的解析部が、前記プログラムが実行されたときに呼び出された第３の関数の名称である第２の関数名と、前記第３の関数が定義された第２のクラスの名称である第２のクラス名とを含む、前記プログラムの実行結果に、前記第１のクラス名と前記第１の関数名との組み合わせが含まれるか否かを解析することにより、前記第２の関数が実行されたか否かを判定する第３のステップと、
前記出力部が、前記第３のステップによる判定の結果を示す情報を出力する第４のステップと、
を有することを特徴とするアプリケーション解析方法。
【請求項６】
利用者情報を取得する第１の関数を実行する第２の関数の名称である第１の関数名と、前記第２の関数が定義された第１のクラスの名称である第１のクラス名とを、アプリケーションのプログラムを解析して取得する第１のステップと、
前記プログラムを実行する第２のステップと、
前記プログラムが実行されたときに呼び出された第３の関数の名称である第２の関数名と、前記第３の関数が定義された第２のクラスの名称である第２のクラス名とを含む、前記プログラムの実行結果に、前記第１のクラス名と前記第１の関数名との組み合わせが含まれるか否かを解析することにより、前記第２の関数が実行されたか否かを判定する第３のステップと、
前記第３のステップによる判定の結果を示す情報を出力する第４のステップと、
をコンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、アプリケーションを解析する技術に関する。
【背景技術】
【０００２】
アプリケーションの安全性を解析する技術として、アプリケーションの挙動に基づいてアプリケーションの安全性を判定する動的解析技術がある（例えば、特許文献１参照）。プライバシーの観点でアプリケーションの安全性を評価するプライバシー評価では、アプリケーションが提示するプライバシーポリシーの内容とアプリケーションの実際の挙動とが一致しているか否かを判断することが重要である。プライバシーポリシーでは、アプリケーションが取り扱う情報と、情報を取り扱う目的と、情報の送信先とが規定されている。動的解析では、アプリケーションが個人情報（利用者情報）を含むデータを送信した場合、その挙動がプライバシーポリシーに規定された挙動と一致しているか否かが解析される。
【０００３】
動的解析技術では、アプリケーションに対する操作に関する課題がある。利用者がアプリケーション対する操作を行わない限り、完全な動的解析を行うことはできない。人が手動による操作を行う場合、人件コストが発生する。このため、コンピュータがアプリケーションに対する操作を行う自動操作技術が提案されている。この自動操作技術と動的解析技術とを利用する自動安全性解析装置がある。また、自動操作技術に関しては、テストケースに従ってアプリケーションのプログラムを実行し、プログラムのエラーを検知する技術もある。
【０００４】
自動操作技術において、アプリケーションの実行時に現れる可能性がある挙動のうちどの程度の挙動が実現されたかという点を評価する技術がある。例えば、呼び出されたクラスとメソッドとの数を確認する方法（コードカバレッジ）、および表示されたアプリケーション画面の数を確認する方法などがある。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】国際公開第２０１０／１３４３２５号
【発明の概要】
【発明が解決しようとする課題】
【０００６】
従来の自動操作技術では、アプリケーションの挙動のうちどの程度の挙動が実現されたかという点が評価される。しかし、プライバシー評価では、利用者情報の取得に関する処理がアプリケーションに対する操作により確実に実行されたかどうかが重要である。例えば、アプリケーションの挙動の全体に対して９０％の挙動が実現された場合でも、利用者情報の取得に関する処理が実行されていなければ、プライバシー評価が不十分である。あるいは、アプリケーションの挙動の全体に対して１０％の挙動が実現された場合でも、利用者情報の取得に関する処理が実行されていれば、十分なプライバシー評価が可能である。プライバシー評価が十分であれば、実現されていない挙動の実現を待たずにアプリケーションの操作を終了することができる。
【０００７】
本発明は、上記に鑑み、アプリケーションのプライバシー評価に有益な情報を取得することができる技術を提供することを目的とする。
【課題を解決するための手段】
【０００８】
本発明は、利用者情報を取得する第１の関数を実行する第２の関数の名称である第１の関数名と、前記第２の関数が定義された第１のクラスの名称である第１のクラス名とを、アプリケーションのプログラムを解析して取得する静的解析部と、前記プログラムを実行する実行部と、前記プログラムが実行されたときに呼び出された第３の関数の名称である第２の関数名と、前記第３の関数が定義された第２のクラスの名称である第２のクラス名とを含む、前記プログラムの実行結果に、前記第１のクラス名と前記第１の関数名との組み合わせが含まれるか否かを解析することにより、前記第２の関数が実行されたか否かを判定する動的解析部と、前記動的解析部による判定の結果を示す情報を出力する出力部と、を有することを特徴とするアプリケーション解析装置である。
【０００９】
また、本発明のアプリケーション解析装置は、前記第１のクラス名と前記第１の関数名との組み合わせの総数に対する、実行された前記第２の関数に関する前記第１のクラス名と前記第１の関数名との組み合わせの数の割合を算出する評価部をさらに有し、前記出力部は、前記割合を出力することを特徴とする。
【００１０】
また、本発明のアプリケーション解析装置において、前記プログラムは、ライブラリを含み、前記静的解析部はさらに、前記第１のクラスが定義された第１のライブラリの名称である第１のパッケージ名を、前記プログラムを解析して取得し、前記動的解析部は、前記第２の関数名と、前記第２のクラス名と、前記第２のクラスが定義された第２のライブラリの名称である第２のパッケージ名とを含む、前記プログラムの実行結果に、前記第１のクラス名と前記第１の関数名と前記第１のパッケージ名との組み合わせが含まれるか否かを解析することにより、前記第２の関数が実行されたか否かを判定することを特徴とする。
【００１１】
また、本発明のアプリケーション解析装置において、前記静的解析部はさらに、前記第１のクラスが定義された前記アプリケーションの名称である第３のパッケージ名を、前記プログラムを解析して取得し、前記動的解析部は、前記第２の関数名と、前記第２のクラス名と、前記第２のクラスが定義された前記アプリケーションの前記第３のパッケージ名とを含む、前記プログラムの実行結果に、前記第１のクラス名と前記第１の関数名と前記第３のパッケージ名との組み合わせが含まれるか否かを解析することにより、前記第２の関数が実行されたか否かを判定することを特徴とする。
【００１２】
また、本発明は、静的解析部と、実行部と、動的解析部と、出力部とを有するアプリケーション解析装置におけるアプリケーション解析方法であって、前記静的解析部が、利用者情報を取得する第１の関数を実行する第２の関数の名称である第１の関数名と、前記第２の関数が定義された第１のクラスの名称である第１のクラス名とを、アプリケーションのプログラムを解析して取得する第１のステップと、前記実行部が前記プログラムを実行する第２のステップと、前記動的解析部が、前記プログラムが実行されたときに呼び出された第３の関数の名称である第２の関数名と、前記第３の関数が定義された第２のクラスの名称である第２のクラス名とを含む、前記プログラムの実行結果に、前記第１のクラス名と前記第１の関数名との組み合わせが含まれるか否かを解析することにより、前記第２の関数が実行されたか否かを判定する第３のステップと、前記出力部が、前記第３のステップによる判定の結果を示す情報を出力する第４のステップと、を有することを特徴とするアプリケーション解析方法である。
【００１３】
また、本発明は、利用者情報を取得する第１の関数を実行する第２の関数の名称である第１の関数名と、前記第２の関数が定義された第１のクラスの名称である第１のクラス名とを、アプリケーションのプログラムを解析して取得する第１のステップと、前記プログラムを実行する第２のステップと、前記プログラムが実行されたときに呼び出された第３の関数の名称である第２の関数名と、前記第３の関数が定義された第２のクラスの名称である第２のクラス名とを含む、前記プログラムの実行結果に、前記第１のクラス名と前記第１の関数名との組み合わせが含まれるか否かを解析することにより、前記第２の関数が実行されたか否かを判定する第３のステップと、前記第３のステップによる判定の結果を示す情報を出力する第４のステップと、をコンピュータに実行させるためのプログラムである。
【発明の効果】
【００１４】
本発明によれば、アプリケーションのプログラムが実行されたときに、利用者情報を取得する第１の関数を実行する第２の関数が実行されたか否かを判定することが可能となる。このため、アプリケーションのプライバシー評価に有益な情報を取得することができる。
【図面の簡単な説明】
【００１５】
【図１】本発明の一実施形態によるアプリケーション解析装置の構成を示すブロック図である。
【図２】本発明の一実施形態によるアプリケーション解析装置の動作の手順を示すフローチャートである。
【図３】本発明の一実施形態におけるアプリケーションのプログラムの構成を示す参考図である。
【図４】本発明の一実施形態において、利用者情報を取得する関数を示す参考図である。
【図５】本発明の一実施形態において、アプリケーションのプログラムの逆コンパイルにより取得されるファイルの内容を示す参考図である。
【図６】本発明の一実施形態において、利用者情報を取得する関数のコードを示す参考図である。
【図７】本発明の一実施形態において、アプリケーションのプログラムの実行時に出力されるログを示す参考図である。
【図８】本発明の一実施形態において、静的解析によって取得されたクラス名と関数名とを示す参考図である。
【図９】本発明の一実施形態において、動的解析によって取得されたクラス名と関数名とを示す参考図である。
【図１０】本発明の一実施形態において、ライブラリリストを示す参考図である。
【発明を実施するための形態】
【００１６】
以下、図面を参照し、本発明の実施形態を説明する。図１は、本発明の一実施形態によるアプリケーション解析装置１の構成を示している。図１に示すように、アプリケーション解析装置１は、静的解析部１０と、実行部２０と、動的解析部３０と、評価部４０と、出力部５０と、記憶部６０とを有する。
【００１７】
静的解析部１０は、利用者情報を取得する第１の関数を実行する第２の関数の名称である第１の関数名と、第２の関数が定義された第１のクラスの名称である第１のクラス名とを、アプリケーションのプログラムを解析して取得する。実行部２０は、アプリケーションのプログラムを実行する。動的解析部３０は、アプリケーションのプログラムが実行されたときに呼び出された第３の関数の名称である第２の関数名と、第３の関数が定義された第２のクラスの名称である第２のクラス名とを含む、アプリケーションのプログラムの実行結果に、第１のクラス名と第１の関数名との組み合わせが含まれるか否かを解析することにより、第２の関数が実行されたか否かを判定する。評価部４０は、第１のクラス名と第１の関数名との組み合わせの総数に対する、実行された第２の関数に関する第１のクラス名と第１の関数名との組み合わせの数の割合を算出する。出力部５０は、動的解析部３０による判定の結果を示す情報を出力する。例えば、出力部５０は、評価部４０によって算出された割合を出力する。
【００１８】
例えば、出力部５０は、情報を表示する表示部である。あるいは、出力部５０は、表示部等を有する外部装置に情報を送信する送信部である。あるいは、出力部５０は、情報を外部記憶媒体または記憶部６０に記録する記録部である。
【００１９】
記憶部６０は、アプリケーションのプログラム等を記憶する。記憶部６０は、静的解析部１０と、動的解析部３０と、評価部４０との処理結果を適宜記憶してもよい。記憶部６０は、アプリケーション解析装置１に対して着脱が可能な外部記憶媒体であってもよい。
【００２０】
アプリケーション解析装置１のコンピュータが、静的解析部１０と、実行部２０と、動的解析部３０と、評価部４０と、出力部５０との動作を規定する命令を含むプログラムを読み込み、読み込まれたプログラムを実行してもよい。つまり、静的解析部１０と、実行部２０と、動的解析部３０と、評価部４０と、出力部５０との機能はソフトウェアにより実現されてもよい。このプログラムは、例えばフラッシュメモリのような「コンピュータ読み取り可能な記録媒体」により提供されてもよい。また、上述したプログラムは、このプログラムが保存された記憶装置等を有するコンピュータから、伝送媒体を介して、あるいは伝送媒体中の伝送波によりアプリケーション解析装置１に伝送されてもよい。プログラムを伝送する「伝送媒体」は、インターネット等のネットワーク（通信網）や電話回線等の通信回線（通信線）のように、情報を伝送する機能を有する媒体である。また、上述したプログラムは、前述した機能の一部を実現してもよい。さらに、上述したプログラムは、前述した機能をコンピュータに既に記録されているプログラムとの組合せで実現できる差分ファイル（差分プログラム）であってもよい。
【００２１】
以下では、一例として、Ａｎｄｒｏｉｄ（登録商標）がＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍｓ）に用いられている端末で動作するアプリケーションの解析について主に説明する。本明細書および図面では、便宜上、必要に応じてａｎｄｒｏｉｄ（登録商標）という文字列を＊ａｎｄｒｄ＊という文字列で代用し、ｊａｖａ（登録商標）という文字列を＊ｊｖ＊という文字列で代用している。すなわち、＊ａｎｄｒｄ＊という文字列はａｎｄｒｏｉｄ（登録商標）という文字列と等価であり、＊ｊｖ＊という文字列はｊａｖａ（登録商標）という文字列と等価である。
【００２２】
図２は、アプリケーション解析装置１の動作の手順を示している。図２を参照し、アプリケーション解析装置１の動作を説明する。
【００２３】
静的解析部１０は、アプリケーションのプログラムを逆コンパイルして得られるプログラムコードを解析する静的解析を行う（ステップＳ１００）。ステップＳ１００では、以下の処理が行われる。
【００２４】
静的解析部１０は、記憶部６０からアプリケーションのプログラムを読み出す。静的解析部１０は、アプリケーションのプログラムを逆コンパイルし、解析可能なコードを取得する。
【００２５】
図３は、アプリケーションのプログラムの構成を示している。図３に示すように、アプリケーションのプログラム３００は、実行コード３０１と、マニフェストファイル３０２と、ライブラリ３０３と、パラメータ３０４とを含む。実行コード３０１は、アプリケーション本体の動作を規定する命令列を含む。マニフェストファイル３０２は、アプリケーションのパッケージ名およびアプリケーションが利用するコンポーネント等の情報を含む。ライブラリ３０３は、実行コード３０１の実行時に参照される実行コードを含む。パラメータ３０４は、実行コード３０１の実行時に参照されるパラメータである。
【００２６】
アプリケーションのプログラム３００を逆コンパイルするためのツールとして、ａｐｋ−ｔｏｏｌ、ｓｏｏｔ、およびｄｅｘ−２−ｊａｒ等がある。本実施形態の説明では、ａｐｋ−ｔｏｏｌを利用する。
【００２７】
Ａｎｄｒｏｉｄ（登録商標）アプリケーションはＤａｌｖｉｋ仮想マシンで実行される。実行コード３０１は、ｃｌａｓｓｅｓ．ｄｅｘと呼ばれるバイナリファイルである。ａｐｋ−ｔｏｏｌを利用してアプリケーションのプログラム３００を逆コンパイルすることにより、実行コード３０１がＤａｌｖｉｋ仮想マシンの中間コードに変換される。ａｐｋ−ｔｏｏｌを利用すると、パッケージ毎にフォルダが作成され、クラス毎にｓｍａｌｉファイルが作成される。静的解析部１０は、中間コードであるｓｍａｌｉファイルを解析する。
【００２８】
静的解析部１０は、ｓｍａｌｉファイルに含まれるコードから、利用者情報を取得する関数の情報を取得する。図４は、利用者情報を取得する関数（第１の関数）の例を示している。図４に示す関数は、ＯＳが基本的な機能の実現のために提供しているＡＰＩ（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｉｎｔｅｒｆａｃｅ）である。それぞれの関数はクラスに定義されている。図４では、関数として、ｇｅｔＤｅｖｉｃｅＩｄ関数と、ｇｅｔＳｕｂｓｃｒｉｂｅｒＩｄ関数と、ｒｅｑｕｅｓｔＬｏｃａｔｉｏｎＵｐｄａｔｅｓ関数と、ｇｅｔＬａｔｉｔｕｄｅ関数と、ｇｅｔＬｏｎｇｉｔｕｄｅ関数とが示されている。
【００２９】
ｇｅｔＤｅｖｉｃｅＩｄ関数は、端末識別子であるＩＭＥＩ（Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ｍｏｂｉｌｅ  Ｅｑｕｉｐｍｅｎｔ  Ｉｄｅｎｔｉｔｙ）を取得する関数である。ｇｅｔＳｕｂｓｃｒｉｂｅｒＩｄ関数は、加入者識別子であるＩＭＳＩ（Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ｍｏｂｉｌｅ  Ｓｕｂｓｃｒｉｂｅｒ  Ｉｄｅｎｔｉｔｙ）を取得する関数である。ｒｅｑｕｅｓｔＬｏｃａｔｉｏｎＵｐｄａｔｅｓ関数は、端末の位置情報を定期的に取得する関数である。ｇｅｔＬａｔｉｔｕｄｅ関数は、端末の位置における緯度情報を取得する関数である。ｇｅｔＬｏｎｇｉｔｕｄｅ関数は、端末の位置における経度情報を取得する関数である。ｇｅｔＤｅｖｉｃｅＩｄ関数とｇｅｔＳｕｂｓｃｒｉｂｅｒＩｄ関数とは、＊ａｎｄｒｄ＊．ｔｅｌｅｐｈｏｎｙ．ＴｅｌｅｐｈｏｎｙＭａｎａｇｅｒクラスに定義されている。ｒｅｑｕｅｓｔＬｏｃａｔｉｏｎＵｐｄａｔｅｓ関数と、ｇｅｔＬａｔｉｔｕｄｅ関数と、ｇｅｔＬｏｎｇｉｔｕｄｅ関数とは、＊ａｎｄｒｄ＊．ｌｏｃａｔｉｏｎ．ＬｏｃａｔｉｏｎＭａｎａｇｅｒクラスに定義されている。図４に示すｇｅｔＤｅｖｉｃｅＩｄ等が関数の名称（関数名）である。図４に示す＊ａｎｄｒｄ＊．ｔｅｌｅｐｈｏｎｙ．ＴｅｌｅｐｈｏｎｙＭａｎａｇｅｒ等がクラスの名称（クラス名）である。
【００３０】
図４に示す関数を実行することにより、アプリケーションが、アプリケーション解析装置１を含む端末に格納されている利用者情報を取得することが可能である。アプリケーションの開発者は、図４に示す関数を利用する独自の関数をアプリケーションのプログラムに定義することが可能である。
【００３１】
図４に示すクラス名と関数名とを含む関数リストが記憶部６０に予め記憶されている。静的解析部１０は、関数リストに含まれるクラス名と関数名とに基づいてｓｍａｌｉファイルを解析する。
【００３２】
図５は、ｓｍａｌｉファイルの内容の例を示している。図５において、ｓｍａｌｉファイルに含まれる一部のコードのみが示されている。図５において、「・・・」は、コードが省略されている部分を示している。
【００３３】
静的解析部１０は、関数リストに含まれるクラス名を構成する文字列のうち「．」を「／」に変換した文字列と、「；−＞」という文字列と、関数名を構成する文字列とを組み合わせた文字列をコードから検索する。例えば、ｇｅｔＤｅｖｉｃｅＩｄ関数に関する情報を取得する場合、静的解析部１０は、検索の文字列として「＊ａｎｄｒｄ＊／ｔｅｌｅｐｈｏｎｙ／ＴｅｌｅｐｈｏｎｙＭａｎａｇｅｒ；−＞ｇｅｔＤｅｖｉｃｅＩｄ」を使用する。図５において、文字列５００が検索の文字列と一致する。このため、静的解析部１０は文字列５００を検出する。利用者情報を取得する第１の関数を実行する第２の関数であって、アプリケーションの開発者によって定義された第２の関数がｓｍａｌｉファイルに含まれる。
【００３４】
静的解析部１０は、利用者情報を取得する第１の関数を実行する第２の関数の第１の関数名を取得する。具体的には、静的解析部１０は、文字列５００の位置よりも上にある文字列から文字列「．ｍｅｔｈｏｄ」を検索する。静的解析部１０は、文字列５００の位置から上に向かって１行ずつ文字列を辿り、最初に出現する文字列「．ｍｅｔｈｏｄ」を検出する。図５において、文字列５１０の先頭の文字列が検索の文字列と一致するため、静的解析部１０は文字列５１０を検出する。文字列５１０において、検索の文字列と、プログラムで定義された文字列とを除いて最初に登場する文字列が第１の関数名である。プログラムで定義された文字列は、「ｐｕｂｌｉｃ」、「ｐｒｉｖａｔｅ」、および「ａｂｓｔｒａｃｔ」等である。文字列５１０では、「ｐｒｉｖａｔｅ」が、プログラムで定義された文字列である。文字列５１０から、文字列「．ｍｅｔｈｏｄ」と文字列「ｐｒｉｖａｔｅ」とを除いて最初に登場する文字列「ｇｅｔＩｍｅｉ」が第１の関数名である。アプリケーションの開発者によって定義されたｇｅｔＩｍｅｉは、ｇｅｔＤｅｖｉｃｅＩｄ関数を実行する。静的解析部１０は、文字列５１０から第１の関数名「ｇｅｔＩｍｅｉ」を取得する。
【００３５】
静的解析部１０は、利用者情報を取得する第１の関数を実行する第２の関数が定義された第１のクラスの第１のクラス名を取得する。具体的には、静的解析部１０は、文字列５００を含むｓｍａｌｉファイルの先頭の行の文字列５２０から第１のクラス名を取得する。文字列５２０において、文字「Ｌ」と文字「；」との間の文字列の文字「／」を文字「．」に変換した文字列「ｃｏｍ．ｅｘａｍｐｌｅ．ｓａｍｐｌｅ．Ｍａｉｎａｃｔｉｖｉｔｙ」が第１のクラス名である。静的解析部１０は、文字列５２０から第１のクラス名「ｃｏｍ．ｅｘａｍｐｌｅ．ｓａｍｐｌｅ．Ｍａｉｎａｃｔｉｖｉｔｙ」を取得する。異なるクラスにおいて同一の関数名で関数を定義することが可能であるため、クラス名と関数名との組み合わせで関数が識別される。
【００３６】
静的解析部１０は、図４に示す全ての関数に対して、上記と同様の処理を行う。ステップＳ１００では、上記の処理が行われる。
【００３７】
ステップＳ１００の処理が行われた後、実行部２０は、アプリケーションのプログラムを記憶部６０から読み出す。実行部２０は、読み出されたアプリケーションのプログラムを実行する（ステップＳ１１０）。アプリケーションのプログラムの実行中、アプリケーションに対する操作が適宜行われる。アプリケーションに対する操作は、自動操作と手動操作とのどちらであってもよい。
【００３８】
ステップＳ１１０の処理が行われた後、動的解析部３０は、アプリケーションの挙動を解析する動的解析を行う（ステップＳ１２０）。ステップＳ１２０では、以下の処理が行われる。
【００３９】
動的解析部３０は、アプリケーションのプログラムの実行結果を解析する。具体的には、動的解析部３０は、アプリケーションのプログラムが実行されているときに出力されるログを解析する。アプリケーションのプログラムの実行結果であるログには、プログラムが実行されたときに呼び出された第３の関数の第２の関数名と、第３の関数が定義された第２のクラスの第２のクラス名とが含まれる。動的解析部３０は、ログに、第１のクラス名と第１の関数名との組み合わせが含まれるか否かを解析することにより、第２の関数が実行されたか否かを判定する。
【００４０】
動的解析部３０によるログの解析を可能とするため、ＯＳで定義された、利用者情報を取得する関数のコードが予め変更される。例えば、端末識別子を取得するｇｅｔＤｅｖｉｃｅＩｄ関数は、／ｆｒａｍｅｗｏｒｋ／ｂａｓｅ／ｔｅｌｅｐｈｏｎｙ／＊ｊｖ＊／＊ａｎｄｒｄ＊／ｔｅｌｅｐｈｏｎｙ／ＴｅｌｅｐｈｏｎｙＭａｎａｇｅｒ．＊ｊｖ＊クラスに定義されている。例えば、このクラスのソースコードを、ｈｔｔｐｓ：／／ａｎｄｒｏｉｄ．ｇｏｏｇｌｅｓｏｕｒｃｅ．ｃｏｍ／ｐｌａｔｆｏｒｍ／ｆｒａｍｅｗｏｒｋｓ／ｂａｓｅ／＋／ａｎｄｒｏｉｄ−４．４．４＿ｒ２．０．１／ｔｅｌｅｐｈｏｎｙ／ｊａｖａ／ａｎｄｒｏｉｄ／ｔｅｌｅｐｈｏｎｙ／ＴｅｌｅｐｈｏｎｙＭａｎａｇｅｒ．ｊａｖａから取得することが可能である。
【００４１】
アプリケーションからｇｅｔＤｅｖｉｃｅＩｄ関数が呼び出されたときに、ＳｔａｃｋＴｒａｃｅを利用して、スタックフレーム情報がログに出力されるように関数が変更される。スタックフレーム情報とは、プログラムの実行過程を記録した情報である。この情報には、実行された関数とクラスとの情報が含まれる。
【００４２】
図６は、ｇｅｔＤｅｖｉｃｅＩｄ関数について、変更されたコードの例を示している。図６において、２８５から２９３の数字は行番号を示している。２８７行目の文字列６００が、追加された文字列である。標準的なログ出力関数であるｇｅｔＳｔａｃｋＴｒａｃｅＳｔｒｉｎｇを利用してスタックフレーム情報をログに出力するようにコードが変更されている。利用者情報を取得する他の関数のコードも、文字列６００と同様の文字列が追加されることにより変更される。変更されたコードを含むＯＳのプログラムがビルドされる。上記のように変更されたＯＳ上でアプリケーションのプログラムが実行される。
【００４３】
図７は、ログの例を示している。図７において、１から１６の数字は行番号を示している。２行目以降の各行において、文字列「ａｔ」の後ろに、クラス名と関数名とを含む文字列が記録されている。２行目に、＊ａｎｄｒｄ＊．ｔｅｌｅｐｈｏｎｙ．ＴｅｌｅｐｈｏｎｙＭａｎａｇｅｒクラスのｇｅｔＤｅｖｉｃｅＩｄ関数が実行されたことが記録されている。２行目の次の３行目に、ｇｅｔＤｅｖｉｃｅＩｄ関数を実行した第３の関数の情報が記録されている。具体的には、ｃｏｍ．ｅｘａｍｐｌｅ．ｓａｍｐｌｅ．ＭａｉｎＡｃｔｉｖｉｔｙクラスのｇｅｔＩｍｅｉ関数が実行されたことが記録されている。
【００４４】
動的解析部３０は、静的解析（ステップＳ１００）で取得された第１のクラス名と第１の関数名とを文字「．」で繋いだ文字列をログから検索する。例えば、動的解析部３０は、文字列「ｃｏｍ．ｅｘａｍｐｌｅ．ｓａｍｐｌｅ．Ｍａｉｎａｃｔｉｖｉｔｙ．ｇｅｔＩｍｅｉ」をログから検索する。これによって、文字列７００が検出される。文字列７００は、アプリケーションのプログラムが実行されたときに呼び出された第３の関数の第２の関数名を示す文字列「ｇｅｔＩｍｅｉ」と、第３の関数が定義された第２のクラスの第２のクラス名を示す文字列「ｃｏｍ．ｅｘａｍｐｌｅ．ｓａｍｐｌｅ．Ｍａｉｎａｃｔｉｖｉｔｙ」とを含む。したがって、動的解析部３０は、ｇｅｔＩｍｅｉ関数が実行されたと判定する。
【００４５】
つまり、動的解析部３０は、検索の文字列と一致する文字列がログから検出された場合、第２の関数が実行されたと判定する。また、動的解析部３０は、検索の文字列と一致する文字列がログから検出されなかった場合、第２の関数が実行されていないと判定する。検索の文字列は、静的解析（ステップＳ１００）で取得された第１のクラス名と第１の関数名とを文字「．」で繋いだ文字列である。ステップＳ１２０では、上記の処理が行われる。
【００４６】
第２の関数が実行されたときに、第２の関数のコードにおいて定義された条件分岐により、利用者情報を取得する第１の関数が実行されない場合がある。このため、動的解析部３０は、ログにおいて、第１の関数の関数名およびクラス名が記録された行の次の行に、第２の関数の関数名およびクラス名が記録されているか否かを確認してもよい。第１の関数の情報と第２の関数の情報とがセットでログに記録されているか否かを確認することによって、第１の関数が実行される条件で第２の関数が実行されたか否かを判定することができる。
【００４７】
ステップＳ１２０の処理が行われた後、評価部４０は、第１のクラス名と第１の関数名との組み合わせの総数に対する、実行された第２の関数に関する第１のクラス名と第１の関数名との組み合わせの数の割合を算出する（ステップＳ１３０）。実行された第２の関数は、動的解析部３０によって、実行されたと判定された第２の関数である。実行率は、（１）式により算出される。
【００４８】
【数１】
0006466234.tif 000002
【００４９】
図８は、静的解析により取得された第１のクラス名と第１の関数名との組み合わせの例を示している。図８では、利用者情報を取得する関数（利用者情報取得関数）と、利用者情報取得関数を含んで定義された関数（定義関数）が定義されたクラス（定義クラス）と、定義関数とが示されている。
【００５０】
図９は、動的解析で検出された第１のクラス名と第１の関数名との組み合わせの例を示している。図９では、利用者情報取得関数と、利用者情報取得関数を実行した関数（実行関数）が定義されたクラス（実行クラス）と、実行関数とが示されている。
【００５１】
図８に示す例では、静的解析において５つの組み合わせが取得される。また、図９に示す例では、動的解析において、アプリケーションのプログラムが実行されたときに実行された第２の関数に関する４つの組み合わせが取得される。このため、実行率は８０％である。
【００５２】
ステップＳ１３０の処理が行われた後、出力部５０は、ステップＳ１３０で算出された実行率を出力する（ステップＳ１４０）。例えば、出力部５０が表示部である場合、出力部５０は実行率を表示する。あるいは、出力部５０が通信部である場合、出力部５０は実行率を外部装置に送信する。あるいは、出力部５０が記録部である場合、出力部５０は実行率を外部記憶媒体または記憶部６０に記録する。
【００５３】
出力部５０は、ステップＳ１２０の処理結果を出力してもよい。例えば、出力部５０は、利用者情報を取得する第１の関数を実行する第２の関数の第１の関数名と、第２の関数が定義された第１のクラスの第１のクラス名と、アプリケーションのプログラムの実行時に第２の関数が実行されたか否かを示す情報とを出力してもよい。したがって、アプリケーション解析装置１は、評価部４０を有していなくてもよい。
【００５４】
本実施形態によれば、アプリケーションのプログラムが実行されたときに、利用者情報を取得する第１の関数を実行する第２の関数が実行されたか否かを判定することが可能となる。このため、アプリケーションのプライバシー評価に有益な情報を取得することができる。したがって、アプリケーションに対して、プライバシー評価に必要な操作が行われたか否かを判断することができる。
【００５５】
次に、本実施形態の変形例を説明する。図３に示すように、アプリケーションのプログラム３００は、ライブラリ３０３を含む。上記のように、静的解析部１０は、利用者情報を取得する第１の関数を実行する第２の関数の第１の関数名と、第２の関数が定義された第１のクラスの第１のクラス名とを取得する。静的解析部１０はさらに、第１のクラスが定義された第１のライブラリの名称である第１のパッケージ名を、アプリケーションのプログラムを解析して取得する。プログラムの実行結果は、アプリケーションのプログラムが実行されたときに呼び出された第３の関数の第２の関数名と、第３の関数が定義された第２のクラスの第２のクラス名と、第２のクラスが定義された第２のライブラリの名称である第２のパッケージ名とを含む。動的解析部３０は、アプリケーションのプログラムの実行結果に、第１のクラス名と第１の関数名と第１のパッケージ名との組み合わせが含まれるか否かを解析することにより、第２の関数が実行されたか否かを判定する。
【００５６】
静的解析部１０はさらに、第１のクラスが定義されたアプリケーションの名称である第３のパッケージ名を、アプリケーションのプログラムを解析して取得する。プログラムの実行結果は、第３の関数の第２の関数名と、第２のクラスの第２のクラス名と、第２のクラスが定義されたアプリケーションの第３のパッケージ名とを含む。動的解析部３０は、アプリケーションのプログラムの実行結果に、第１のクラス名と第１の関数名と第３のパッケージ名との組み合わせが含まれるか否かを解析することにより、第２の関数が実行されたか否かを判定する。
【００５７】
一般的に、Ａｎｄｒｏｉｄ（登録商標）アプリケーションには２個または３個のライブラリが搭載されている。例えば、広告表示用のライブラリおよびゲームエンジン用のライブラリ等がある。ライブラリ会社は、自身のライブラリのプログラムを公開している。アプリケーションの開発者は、自身の好みでライブラリをアプリケーションに組み込むことができる。ライブラリのパッケージ名は、基本的にアプリケーションのパッケージ名と異なる。動的解析部３０は、上記のクラス名と関数名とパッケージ名との組み合わせに含まれるパッケージ名が第１のパッケージ名または第３のパッケージ名であるか否かを判定することによって、ライブラリとアプリケーション本体とのどちらのクラスで定義された第２の関数が実行されたかを識別することができる。
【００５８】
アプリケーションに搭載されうるライブラリの第１のパッケージ名を含むライブラリリストが記憶部６０に予め記憶されている。図１０は、ライブラリリストの例を示している。図１０では、提供会社と、種別と、パッケージ名とが示されている。提供会社は、ライブラリを提供する会社の名称である。種別は、ライブラリリストが提供する機能の種類を示している。パッケージ名は、ライブラリの第１のパッケージ名である。
【００５９】
図３に示すマニフェストファイル３０２には、アプリケーションの第３のパッケージ名の情報が含まれる。具体的には、マニフェストファイル３０２には、文字列「＜ｍａｎｉｆｅｓｔ  ｐａｃｋａｇｅ＝ＸＸＸＸＸ＞」が含まれる。文字列「ＸＸＸＸＸ」は任意の文字列であり、アプリケーションの第３のパッケージ名を示している。
【００６０】
静的解析で取得される第１のクラス名は、アプリケーションまたはライブラリのパッケージ名を含む。例えば、第１のクラス名を示す文字列「ｃｏｍ．ｅｘａｍｐｌｅ．ｓａｍｐｌｅ．Ｍａｉｎａｃｔｉｖｉｔｙ」において、文字列「ｃｏｍ．ｅｘａｍｐｌｅ．ｓａｍｐｌｅ」はアプリケーションの第３のパッケージ名を示している。ライブラリで定義されたクラスのクラス名は、ライブラリの第１のパッケージ名を含む。例えば、図１０に示すＡ会社が提供するライブラリで定義されたクラスのクラス名は、第１のパッケージ名「ｃｏｍ．ｓａｍｐｌｅ．ａｄ」を含む。
【００６１】
したがって、静的解析部１０は、静的解析により取得された第１のクラス名からパッケージ名を取得することが可能である。静的解析部１０は、静的解析により取得されたパッケージ名を、ライブラリリストに含まれる第１のパッケージ名と比較する。静的解析により取得されたパッケージ名が、ライブラリリストに含まれる第１のパッケージ名と一致する場合、静的解析により取得されたパッケージ名は、ライブラリの第１のパッケージ名である。また、静的解析部１０は、静的解析により取得されたパッケージ名をアプリケーションの第３のパッケージ名と比較する。静的解析により取得されたパッケージ名がアプリケーションの第３のパッケージ名と一致する場合、静的解析により取得されたパッケージ名はアプリケーションの第３のパッケージ名である。
【００６２】
アプリケーションのパッケージ名は存在するが、そのパッケージ名がマニフェストファイル３０２に記録されない場合がある。マニフェストファイル３０２からアプリケーションのパッケージ名が取得できない場合、静的解析により取得されたパッケージ名のうちライブラリリストに含まれる第１のパッケージ名と一致しないパッケージ名はアプリケーションの第３のパッケージ名であると判断してもよい。
【００６３】
ログに記録される第２のクラス名は、第２のクラスが定義されたライブラリまたはアプリケーションのパッケージ名を含む。例えば、図７の文字列７００に含まれる第２のクラス名「ｃｏｍ．ｅｘａｍｐｌｅ．ｓａｍｐｌｅ．Ｍａｉｎａｃｔｉｖｉｔｙ」は、アプリケーションの第３のパッケージ名「ｃｏｍ．ｅｘａｍｐｌｅ．ｓａｍｐｌｅ」を含む。
【００６４】
図８は、静的解析により取得された第１のクラス名と第１の関数名との組み合わせの例を示している。図８において、ｇｅｔＩｄ関数とｇｅｔＬｏｃ関数とのそれぞれが定義された第１のクラスの第１のクラス名「ｃｏｍ．ｓａｍｐｌｅ．ａｄ．ｍａｉｎ」は、ライブラリの第１のパッケージ名「ｃｏｍ．ｓａｍｐｌｅ．ａｄ」を含む。また、ＳｅｎｄＬｏｃａｔｉｏｎ関数が定義された第１のクラスの第１のクラス名「ｃｏ．ｊｐ．ａｄａｄ．ｓｅｎｄ」は、ライブラリの第１のパッケージ名「ｃｏ．ｊｐ．ａｄａｄ」を含む。また、ｇｅｔＩｍｅｉ関数とｇｅｔＬｏｃａｔｉｏｎ関数とのそれぞれが定義された第１のクラスの第１のクラス名「ｃｏｍ．ｅｘａｍｐｌｅ．ｓａｍｐｌｅ．Ｍａｉｎａｃｔｉｖｉｔｙ」は、アプリケーションの第３のパッケージ名「ｃｏｍ．ｅｘａｍｐｌｅ．ｓａｍｐｌｅ」を含む。
【００６５】
動的解析部３０は、静的解析で取得された第１のクラス名と第１の関数名とライブラリの第１のパッケージ名とを含む文字列をログから検索する。また、動的解析部３０は、静的解析で取得された第１のクラス名と第１の関数名とアプリケーションの第３のパッケージ名とを含む文字列をログから検索する。第１のクラス名が第１のパッケージ名または第３のパッケージ名を含むため、動的解析部３０は、第１のクラス名と第１の関数名とを含む文字列をログから検索すればよい。
【００６６】
動的解析部３０は、検索の文字列と一致する文字列がログから検出された場合、第２の関数が実行されたと判定する。また、動的解析部３０は、検索の文字列と一致する文字列がログから検出されなかった場合、第２の関数が実行されていないと判定する。検索の文字列がライブラリの第１のパッケージ名を含む場合、動的解析部３０は、ライブラリで定義された第２の関数が実行されたと判定する。検索の文字列がアプリケーションの第３のパッケージ名を含む場合、動的解析部３０は、アプリケーション本体で定義された第２の関数が実行されたと判定する。
【００６７】
評価部４０は、パッケージ名毎に実行率を算出する。具体的には、評価部４０は、ライブラリの第１のパッケージ名と対応する第１のクラス名を含む組み合わせに対して実行率を算出する。また、評価部４０は、アプリケーションの第３のパッケージ名と対応する第１のクラス名を含む組み合わせに対して実行率を算出する。
【００６８】
図８では、ライブラリの第１のパッケージ名「ｃｏｍ．ｓａｍｐｌｅ．ａｄ」と対応する第１のクラス名「ｃｏｍ．ｓａｍｐｌｅ．ａｄ．ｍａｉｎ」を含む組み合わせは、ｇｅｔＩｄ関数に関する組み合わせとｇｅｔＬｏｃ関数に関する組み合わせとの２個である。図９では、ライブラリの第１のパッケージ名「ｃｏｍ．ｓａｍｐｌｅ．ａｄ」と対応する第１のクラス名「ｃｏｍ．ｓａｍｐｌｅ．ａｄ．ｍａｉｎ」を含む組み合わせは、ｇｅｔＩｄ関数に関する組み合わせの１個である。このため、ライブラリの第１のパッケージ名「ｃｏｍ．ｓａｍｐｌｅ．ａｄ」に関する実行率は５０％である。
【００６９】
図８では、ライブラリの第１のパッケージ名「ｃｏ．ｊｐ．ａｄａｄ」と対応する第１のクラス名「ｃｏ．ｊｐ．ａｄａｄ．ｓｅｎｄ」を含む組み合わせは、ＳｅｎｄＬｏｃａｔｉｏｎ関数に関する組み合わせの１個である。図９では、ライブラリの第１のパッケージ名「ｃｏ．ｊｐ．ａｄａｄ」と対応する第１のクラス名「ｃｏ．ｊｐ．ａｄａｄ．ｓｅｎｄ」を含む組み合わせは、ＳｅｎｄＬｏｃａｔｉｏｎ関数に関する組み合わせの１個である。このため、ライブラリの第１のパッケージ名「ｃｏ．ｊｐ．ａｄａｄ」に関する実行率は１００％である。
【００７０】
図８では、アプリケーションの第３のパッケージ名「ｃｏｍ．ｅｘａｍｐｌｅ．ｓａｍｐｌｅ」と対応する第１のクラス名「ｃｏｍ．ｅｘａｍｐｌｅ．ｓａｍｐｌｅ．Ｍａｉｎａｃｔｉｖｉｔｙ」を含む組み合わせは、ｇｅｔＩｍｅｉ関数に関する組み合わせとｇｅｔＬｏｃａｔｉｏｎ関数に関する組み合わせとの２個である。図９では、アプリケーションの第３のパッケージ名「ｃｏｍ．ｅｘａｍｐｌｅ．ｓａｍｐｌｅ」と対応する第１のクラス名「ｃｏｍ．ｅｘａｍｐｌｅ．ｓａｍｐｌｅ．Ｍａｉｎａｃｔｉｖｉｔｙ」を含む組み合わせは、ｇｅｔＩｍｅｉ関数に関する組み合わせとｇｅｔＬｏｃａｔｉｏｎ関数に関する組み合わせとの２個である。このため、アプリケーションの第３のパッケージ名「ｃｏｍ．ｅｘａｍｐｌｅ．ｓａｍｐｌｅ」に関する実行率は１００％である。
【００７１】
したがって、パッケージ名が「ｃｏ．ｊｐ．ａｄａｄ」であるライブラリで定義された第２の関数と、アプリケーション本体で定義された第２の関数とによる全ての挙動が動的解析により検出されている。一方、パッケージ名が「ｃｏｍ．ｓａｍｐｌｅ．ａｄ」であるライブラリで定義された第２の関数による一部の挙動のみが動的解析により検出されている。つまり、パッケージ名が「ｃｏ．ｊｐ．ａｄａｄ」であるライブラリと、アプリケーション本体とによる挙動を実現させるためのアプリケーションに対する操作は十分であることが分かる。一方、パッケージ名が「ｃｏｍ．ｓａｍｐｌｅ．ａｄ」であるライブラリによる挙動を実現させるためのアプリケーションに対する操作は不十分であることが分かる。
【００７２】
出力部５０は、上記のパッケージ名毎の実行率を出力する。出力部５０は、利用者情報を取得する第１の関数を実行する第２の関数の第１の関数名と、第２の関数が定義された第１のクラスの第１のクラス名と、ライブラリの第１のパッケージ名またはアプリケーションの第３のパッケージ名と、アプリケーションのプログラムの実行時に第２の関数が実行されたか否かを示す情報とを出力してもよい。
【００７３】
本実施形態の変形例によれば、アプリケーションのプログラムが実行されたときに、ライブラリまたはアプリケーション本体で定義された第２の関数が実行されたか否かを判定することが可能となる。したがって、ライブラリによる挙動と、アプリケーション本体とによる挙動とを区別することが可能となる。このため、プライバシー評価に必要な操作が行われたか否かをより詳細に判断することができる。
【００７４】
以上、図面を参照して本発明の実施形態について詳述してきたが、具体的な構成は上記の実施形態に限られるものではなく、本発明の要旨を逸脱しない範囲の設計変更等も含まれる。
【符号の説明】
【００７５】
１  アプリケーション解析装置、１０  静的解析部、２０  実行部、３０  動的解析部、４０  評価部、５０  出力部、６０  記憶部
【図１】
0006466234.tif 000003
【図２】
0006466234.tif 000004
【図３】
0006466234.tif 000005
【図４】
0006466234.tif 000006
【図５】
0006466234.tif 000007
【図６】
0006466234.tif 000008
【図７】
0006466234.tif 000009
【図８】
0006466234.tif 000010
【図９】
0006466234.tif 000011
【図１０】
0006466234.tif 000012