以下、図面を参照し、本発明の実施形態を説明する。本明細書および図面では、便宜上、必要に応じてandroid(登録商標)という文字列を*andrd*という文字列で代用し、Android(登録商標)という文字列を*Andrd*という文字列で代用し、java(登録商標)という文字列を*jv*という文字列で代用し、google(登録商標)という文字列を*ggl*という文字列で代用している。すなわち、*andrd*という文字列はandroid(登録商標)という文字列と等価であり、*Andrd*という文字列はAndroid(登録商標)という文字列と等価であり、*jv*という文字列はjava(登録商標)という文字列と等価であり、*ggl*という文字列はgoogle(登録商標)という文字列と等価である。
図1は、本発明の一実施形態による端末装置の構成を示している。本実施形態の端末装置は、OS にAndroid(登録商標)を実装したスマートフォン等の装置として構成されている。図1に示すように端末装置は、アプリケーション10、API実行部11、情報取得部12、実行解析部13、セキュリティポリシー判定部14、実行制御部15、記憶部16、入力部17、表示部18、通信部19を有する。API実行部11、情報取得部12、実行解析部13、セキュリティポリシー判定部14、実行制御部15は、本発明のAPI実行制御装置の一例であるAPI実行制御部20を構成する。
アプリケーション10は、SMSクライアントアプリケーション等であり、アプリケーションの処理として規定された各種の処理を行う。API実行部11は、アプリケーション10からの要求に応じてAPI11aを実行する。API11aは、OSであるAndroid(登録商標)で用意されているAPI(メソッド)のうち、特に悪性アプリケーション(マルウェア)や広告・統計ライブラリで利用される機能を実現する特定のAPIである。API実行部11は、アプリケーション10からAPI11aの実行要求を受けたときにAPI11aを実行し、実行結果をアプリケーション10に返す。
図2に示すAPI11aは、複数の異なる時点において同一のAPIである必要はない。例えば、第1のAPIが実行された後、第1のAPIとは異なる第2のAPIが実行される場合についても、図2では第1のAPIと第2のAPIがAPI11aとして示されている。
情報取得部12は、アプリケーション10がAPI11aを呼び出して実行しようとするときに、API11aを実行するメソッドの情報を含む各種情報を取得し、取得した情報をコンテキストデータCDとして、記憶部16内のセキュリティデータSDの記憶領域に格納する。セキュリティデータSDは、セキュリティポリシーSPとコンテキストデータCDで構成される。セキュリティポリシーSPは、API11aの実行を制御するための、API11aの実行の可否等を示す情報を含むデータである。コンテキストデータCDは、情報取得部12が取得した情報を含むデータである。セキュリティデータSDは記憶部16に格納されており、実行解析部13、セキュリティポリシー判定部14、実行制御部15によって記憶部16から適宜読み出されて参照される。
実行解析部13は、コンテキストデータCDに基づいて、API11aが実行される状況を解析する。また、実行解析部13は、解析の結果に基づいて、API11aの実行が、ユーザが認識していない情報送信に繋がるか否か(API11aの実行により、ユーザが認識していない情報送信が発生する可能性があるか否か)、あるいはAPI11aの実行が不正な動作に繋がるか否か(API11aの実行により不正な動作が発生する可能性があるか否か)を判定する。
セキュリティポリシー判定部14は、API11aの実行が、ユーザが認識していない情報送信あるいは不正な動作に繋がる場合に、実行されるAPI11aに関する情報がセキュリティポリシーSPに登録されているか否かを判定する。セキュリティポリシーSPに情報が登録されている場合、セキュリティポリシー判定部14は、セキュリティポリシーSPに登録されている情報に基づいた情報をAPI実行部11に与える。また、セキュリティポリシーSPに情報が登録されていない場合、セキュリティポリシー判定部14は、実行制御部15に処理を引き渡す。
実行制御部15は、セキュリティポリシーSPに情報が登録されていない場合に、ユーザが認識していない情報送信あるいは不正な動作が発生する可能性があることをユーザに通知する処理を行う。また、実行制御部15は、入力部17を介してユーザによって入力される情報に基づいて、API11aの実行を制御する。
記憶部16は、メモリで構成されており、OSのプログラムや、アプリケーションプログラム、端末装置が使用する各種データ等を記憶する。入力部17は、ユーザが操作するキーやボタン等を有し、ユーザによって入力された情報を実行制御部15に通知する。表示部18は、実行制御部15による処理の結果等を表示する。通信部19は外部の通信装置と通信を行う。アプリケーション10は、必要に応じて通信部19を介して通信を行う。
API実行部11、情報取得部12、実行解析部13、セキュリティポリシー判定部14は、Android(登録商標)で提供されているアプリケーションフレームワーク(AplicationFramework)層で動作し、実行制御部15はアプリケーション層で動作する。本実施形態のOSのプログラムでは、既存のクラス(TelephonyManagerクラス等)を定義しているコードに対して、API実行部11が実行する処理を規定するコードが追加されている。また、本実施形態のOSのプログラムのコードに対して、情報取得部12、実行解析部13、セキュリティポリシー判定部14の各部が実行する処理を規定するコードが追加されている。実行制御部15はアプリケーションとして構成されており、実行制御部15が実行する処理を規定するコードがアプリケーションプログラムに含まれる。
本実施形態のOSのプログラムと、実行制御部15を構成するアプリケーションのプログラムとをコンピュータ読み取り可能な記録媒体に記録して、この記録媒体に記録されたプログラムをコンピュータ(本実施形態の端末装置)に読み込ませ、実行させることにより、API実行部11、情報取得部12、実行解析部13、セキュリティポリシー判定部14、実行制御部15は、各部に対して規定された処理を実行する。
ここで、「コンピュータ」は、WWWシステムを利用している場合であれば、ホームページ提供環境(あるいは表示環境)も含むものとする。また、「コンピュータ読み取り可能な記録媒体」とは、フレキシブルディスク、光磁気ディスク、ROM、CD−ROM等の可搬媒体、コンピュータに内蔵されるハードディスク等の記憶装置のことをいう。さらに「コンピュータ読み取り可能な記録媒体」とは、インターネット等のネットワークや電話回線等の通信回線を介してプログラムが送信された場合のサーバやクライアントとなるコンピュータシステム内部の揮発性メモリ(RAM)のように、一定時間プログラムを保持しているものも含むものとする。
また、上述したプログラムは、このプログラムを記憶装置等に格納したコンピュータから、伝送媒体を介して、あるいは伝送媒体中の伝送波により他のコンピュータに伝送されてもよい。ここで、プログラムを伝送する「伝送媒体」は、インターネット等のネットワーク(通信網)や電話回線等の通信回線(通信線)のように、情報を伝送する機能を有する媒体のことをいう。また、上述したプログラムは、前述した機能の一部を実現するためのものであってもよい。さらに、前述した機能を、コンピュータに既に記録されているプログラムとの組合せで実現できるもの、いわゆる差分ファイル(差分プログラム)であってもよい。
本実施形態では、アプリケーションフレームワーク層に実装されるAPI実行部11と連携する処理を高速化するために、情報取得部12、実行解析部13、セキュリティポリシー判定部14がアプリケーションフレームワーク層に実装されているが、情報取得部12、実行解析部13、セキュリティポリシー判定部14をアプリケーションとして構成することも可能である。
次に、本実施形態の端末装置の動作を説明する。アプリケーション10がAPI11aを呼び出すと、API実行部11は、API11aが呼び出されたことを検出してAPI11aの実行に介入し(API11aをフックし)、API11aを実行する前に情報取得部12を呼び出す。また、API実行部11は、実行解析部13、セキュリティポリシー判定部14、実行制御部15のいずれかの処理結果を受け取り、その処理結果に応じた処理を実行する。
図2は、フックの対象となるAPIの一覧を示している。本実施形態では、TelephonyManagerクラス、LocationManagerクラス、SmsManagerクラス、Cameraクラス、ContentResolverクラスのAPIがフックの対象となる。なお、図2に示すAPIは一例であり、これに限らない。APIはメソッドであるが、本実施形態で注目するメソッドを他のメソッドと区別するため、図2に示すメソッドをAPIと記載している。
TelephonyManagerクラスのAPIでフックの対象となるのは、端末を識別するIDであるIMEI(International Mobile Equipment Identity)を取得するgetDeviceIdや、端末のアプリケーションのバージョンを取得するgetDeviceSoftwareVersion、端末の電話番号を取得するgetLine1Number、SIM (Subscriber Identity Module)の固有番号であるIMSI(International Mobile Subscriber Identity)を取得するgetSimSerialNumber等である。LocationManagerクラスのAPIでフックの対象となるのは、端末装置で最後に判明した位置情報を取得するgetLastKnownLocation等である。
SmsManagerクラスのAPIでフックの対象となるのは、SMSによりメッセージを送信するsendTextMessageである。CameraクラスのAPIでフックの対象となるのは、カメラで撮影を行う前にプレビュー画像を表示するsetPreviewDisplay、カメラで撮影のシャッターを切るtakePictureである。ContentResolverクラスのAPIでフックの対象となるのは、メモリ内のデータベースにアクセスして情報を取得するCursorである。
本実施形態では、TelephonyManagerクラスおよびLocationManagerクラスの各APIを情報取得APIと記載し、SmsManagerクラスのsendTextMessageを外部送信APIと記載する。また、本実施形態では、CameraクラスのsetPreviewDisplayをプレビュー表示APIと記載し、CameraクラスのtakePictureをシャッターAPIと記載し、ContentResolverクラスのCursorをデータベース参照APIと記載する。以下の説明では、情報取得APIとしてgetDeviceIdを用いる。
以下では、API実行制御部20の5種類の動作例を説明する。
<第1の動作例>
第1の動作例では、API実行制御部20は、API11aの実行によりユーザに気づかれずに情報の送信が行われることを防止する。端末装置に格納されている情報を端末装置の内部から取得する情報取得APIが実行され、さらに、端末装置の外部に情報を送信する外部送信APIが実行される場合、不正な送信先に個人情報等が送信されて情報漏洩が発生する可能性がある。また、アプリケーション10が広告・統計ライブラリを含む場合に、他者とコミュニケーションを行う以外の目的による情報の送信をユーザが承認していないにもかかわらず、ユーザに気づかれずに個人情報等が送信される可能性がある。これらのような情報の送信を防止するため、API実行制御部20は、情報取得APIが実行されるとき、および外部送信APIが実行されるときに呼び出されて、以下で説明する処理を実行する。
アプリケーション10がAPI11aを呼び出したとき、API実行部11から呼び出された情報取得部12は、図3に示す処理を実行する。まず、情報取得部12は、API11aを呼び出したアプリケーション10のパッケージの名称(パッケージ名)を特定するため、ContextクラスのgetPackageNameメソッドを実行し、パッケージ名を取得する(ステップSA100)。Android(登録商標)では、パッケージファイルの形式でアプリケーションが公開されている。パッケージファイルは、例えば拡張子が.apkのファイルであり、命令列を含む実行コード(例えば拡張子が.dex)、アプリケーションが利用する権限が定義されたマニフェストファイル(例えば拡張子が.xml)、アプリケーションが利用する画像ファイル(例えば拡張子が.jpg)等を含む。
続いて、情報取得部12は、API11aがどのような状況で実行されるのかを解析するため、SystemクラスのcurrentMillisメソッドを実行し、API11aが呼び出された時刻を取得すると共に、Throwable クラスのgetStacktraceメソッドを実行し、クラス名、メソッド名、ファイル名、行番号が格納されたStackTraceElementクラスの配列を取得する(ステップSA105)。
ステップSA105で取得される配列に格納されているクラス名は、APIを呼び出したメソッドを定義するクラスの名称である。クラス名は、StackTraceElementクラスのgetClassNameメソッドを実行することで取得される。ステップSA105で取得される配列に格納されているメソッド名は、APIを呼び出したメソッドの名称である。メソッド名は、StackTraceElementクラスのgetMethodNameメソッドを実行することで取得される。ステップSA105で取得される配列に格納されているファイル名は、APIを呼び出したメソッドを実行するコードが記述されたソースファイルの名称である。ファイル名は、StackTraceElementクラスのgetFileNameメソッドを実行することで取得される。ステップSA105で取得される配列に格納されている行番号は、APIを呼び出したメソッドを実行するコードが記述されたソースファイル内の行番号である。行番号は、StackTraceElementクラスのgetLineNumberメソッドを実行することで取得される。
メソッドが呼び出される毎に、そのメソッドの情報はメモリ内のスタック領域(スタックフレーム)にスタックトレースとして保存される。上記のgetClassNameメソッド等の各メソッドによって、スタックトレースからクラス名等の情報が取得される。
続いて、情報取得部12は、ステップSA100,SA105で取得した情報をコンテキストデータCDとして、記憶部16内のセキュリティデータSDの記憶領域に格納する(ステップSA110)。
図4は、ステップSA105で取得した情報のうち、API11aが呼び出された時刻を除く情報の一例を示している。図4では、便宜上、1つのメソッド(API)の情報が4行に分かれて記載されており、各行の先頭には行番号が付与されている。図4の4行単位の情報によって1つの情報群が構成される。1〜4行目の情報で構成される情報群st[0]は、呼び出されたAPI11aの情報を含む。4行目の「getMethodName()=」に続く文字列「getDeviceId」はAPI11aのメソッド名を示している。
5〜8行目の情報で構成される情報群st[1]は、API11a(getDeviceId)を呼び出したメソッドの情報を含む。5行目の「getClassName()=」に続く文字列「jp.sample.app.Sample」は、API11aを呼び出したメソッドが定義されているクラスの名称(クラス名)を示している。クラス名は、パッケージ名とクラス単体の名称との組合せとして示されている。例えば、5行目に記載されている「jp.sample.app.Sample」の「jp.sample.app」がパッケージ名であり、「Sample」がクラス単体の名称である。6行目の「getFileName()=」に続く文字列「Sample.*jv*」は、API11aを呼び出したメソッドを実行するコードが記述されたソースファイルの名称(ファイル名)である。7行目の「getLineNumber()=」に続く数字27は、API11aを呼び出したメソッドを実行するコードが記述されたソースファイル内の行番号を示している。8行目の「getMethodName()=」に続く文字列「onCreate」は、API11aを呼び出したメソッドの名称(メソッド名)を示している。
情報群st[1]が示すファイル名に対応するソースファイルは、API11aを呼び出したアプリケーション10のソースファイルである。つまり、情報群st[1]に含まれる情報は、API11aを呼び出したアプリケーション10のソースファイルで記述されているメソッドの情報である。
図5は、API11aを呼び出したメソッドが記述されたソースコードの一例を示している。このソースコードは、情報群st[1]に含まれる「Sample.*jv*」がファイル名であるソースファイルに記載されているコードである。このソースコードにおいて、Sampleクラス(情報群st[1]に含まれる「jp.sample.app.Sample」に対応)で定義されているonCreateメソッド(情報群st[1]に含まれる「onCreate」に対応)内で、情報群st[0]が示すgetDeviceIdメソッド(API11a)が呼び出されている。また、getDeviceIdメソッドを呼び出すコードは、情報群st[1]に含まれる行番号に対応する27行目に記載されている。
図4の9〜12行目の情報で構成される情報群st[2]は、情報群st[1]が示すonCreateメソッドを呼び出したメソッドの情報を含む。9行目の「getClassName()=」に続く文字列「*andrd*.app.ActivityThread」は、onCreateメソッドを呼び出したメソッドが定義されているクラスの名称(クラス名)を示している。9行目に記載されている「*andrd*.app.ActivityThread」の「*andrd*.app」がパッケージ名であり、「ActivityThread」がクラス単体の名称である。10行目の「getFileName()=」に続く文字列「ActivityThread.*jv*」は、onCreateメソッドを呼び出したメソッドを実行するコードが記述されたソースファイルの名称(ファイル名)である。11行目の「getLineNumber()=」に続く数字1945は、onCreateメソッドを呼び出したメソッドを実行するコードが記述されたソースファイル内の行番号を示している。12行目の「getMethodName()=」に続く文字列「handleCreateService」は、onCreateメソッドを呼び出したメソッドの名称(メソッド名)を示している。
図6は、onCreateメソッドを呼び出したメソッドが記述されたソースコードの一例を示している。このソースコードは、情報群st[2]に含まれる「ActivityThread.*jv*」がファイル名であるソースファイルに記載されているコードである。このソースコードにおいて、ActivityThreadクラス(情報群st[2]に含まれる「*andrd*.app.ActivityThread」に対応)で定義されているhandleCreateServiceメソッド(情報群st[2]に含まれる「handleCreateService」に対応)内で、情報群st[1]が示すonCreateメソッドが呼び出されている。また、onCreateメソッドを呼び出すコードは、情報群st[2]に含まれる行番号に対応する1945行目に記載されている。
上記のように、情報群st[n+1]の情報は、情報群st[n](nは0以上の整数)が示すメソッド(API)を呼び出したメソッドの情報を含む。図4の情報群st[3]〜st[7]も同様である。なお、図4では、情報群st[7]が示すメソッドを呼び出したメソッド等の情報は省略されている。図4に示す情報と、API11aが呼び出された時刻と、ステップSA100で取得したパッケージ名との組合せがコンテキストデータCDとして保存される。
本実施形態では、アプリケーション10からAPI11aが呼び出される毎に1つのコンテキストデータCDが生成され、保存される。例えば、第1のAPIが呼び出された後、第2のAPIが呼び出される場合、第1のAPIが呼び出されたときに第1のAPIに関するコンテキストデータCDが生成されて保存され、その後、第2のAPIが呼び出されたときに第2のAPIに関するコンテキストデータCDが生成されて保存される。
それぞれのコンテキストデータCDは、コンテキストデータCDに含まれる時刻によって区別される。あるいは、それぞれのコンテキストデータCDにシーケンス番号等のIDを付与し、そのIDによってそれぞれのコンテキストデータCDを区別してもよい。それぞれのコンテキストデータCDは、上記の情報群のうち複数の情報群(例えば情報群st[0],st[1],st[2])の情報を含む。コンテキストデータCDには、それぞれの情報群を識別する識別情報(例えば、st[0]等の文字列)が含まれており、この識別情報によって各情報群が区別される。
ステップSA110に続いて、情報取得部12は実行解析部13を呼び出す(ステップSA115)。
情報取得部12から呼び出された実行解析部13は、以下で説明する処理を実行する。情報漏洩を発生させる悪性アプリケーションの多くは、正規のアプリケーションのコードに対して悪意のコードを追加することにより作成されている。図7はアプリケーションのソースコードの構造を示している。拡張子が「.*jv*」であるファイル(Sample.*jv*、Sample2.*jv*、Ad.*jv*、Main_Service.*jv*)は、ソースコードが記述されたソースファイルである。「src」、「jp」、「com」等はフォルダ名である。
図7では、各フォルダの階層関係が示されている。例えば、「app」フォルダは「sample」フォルダの下の階層にあり、「sample」フォルダは「jp」フォルダの下の階層にあり、「jp」フォルダは「src」フォルダの下の階層にある。Sample.*jv*およびSample2.*jv*というソースファイルは「app」フォルダに格納される。同様に、「ads」フォルダは「*ggl*」フォルダの下の階層にあり、「*ggl*」フォルダは「com」フォルダの下の階層にあり、「com」フォルダは「src」フォルダの下の階層にある。Ad.*jv*およびMain_Service.*jv*というソースファイルは「ads」フォルダに格納される。
ソースファイルは、特定の機能を実現するライブラリ(モジュール)のソースファイルである。このソースファイルからライブラリの実行ファイルが生成される。「jp」フォルダ以下の階層のフォルダは、アプリケーションの開発者によって開発されたライブラリのソースファイルを格納するフォルダである。図7では、Sample.*jv*、Sample2.*jv*が、アプリケーションの開発者によって開発されたライブラリのソースファイルである。「com」フォルダ以下の階層のフォルダは、主にアプリケーションの開発者以外の他の開発者によって開発されたライブラリのソースファイルを格納するフォルダである。図7では、Ad.*jv*、Main_Service.*jv*が、他の開発者によって開発されたライブラリのソースファイルである。
「jp」フォルダから、Sample.*jv*、Sample2.*jv*が格納されている「app」フォルダまでのパスを示す文字列「jp.sample.app」はSample.*jv*、Sample2.*jv*の格納場所を示している。また、このパスを示す文字列「jp.sample.app」はアプリケーションのパッケージ名を構成する。「com」フォルダから、Ad.*jv*、Main_Service.*jv*が格納されている「ads」フォルダまでのパスを示す文字列「com.*ggl*.ads」はAd.*jv*、Main_Service.*jv*の格納場所を示している。上記のように、アプリケーションを構成するライブラリのソースファイルは、アプリケーションのパッケージ名に相当するパスが示す格納場所とそれ以外の格納場所のどちらかに格納される。
多くの悪性アプリケーションでは、アプリケーションのパッケージ名に相当するパスが示す格納場所以外の格納場所に、悪意のコードを含むソースファイルが追加される。悪性アプリケーションの開発者は、正規のアプリケーションの実行ファイルをディスアセンブル(逆アセンブル)してソースファイルを取得し、悪意のコードを含むソースファイルを追加した後、ソースコードをアセンブルして悪性アプリケーションの実行ファイルを生成する。
上記のように、多くの悪性アプリケーションでは、アプリケーションのパッケージ名に相当するパスが示す格納場所以外の格納場所にソースファイルが追加されるという特徴がある。また、情報漏洩を発生させる悪性アプリケーションでは、情報取得APIが実行された後、情報送信APIが実行されるという特徴がある。さらに、広告・統計ライブラリの中には、アプリケーションのパッケージ名に相当するパスが示す格納場所以外の格納場所にライブラリのソースファイルが格納されるものがある。上記に鑑み、実行解析部13は、アプリケーションのパッケージ名に相当するパスが示す格納場所以外の格納場所に格納されたソースファイルから生成されたライブラリによって情報取得APIおよび情報送信APIがこの順で実行されることを検知する。
情報取得部12から呼び出された実行解析部13は、図8に示す処理を実行する。まず、実行解析部13は記憶部16のセキュリティデータSDの記憶領域からコンテキストデータCDを読み出す(ステップSA200)。このとき読み出されるコンテキストデータCDは、例えば現時点までの一定期間内に呼び出された全てのAPI11aに関するコンテキストデータCDである。例えば、現在時刻を基準にした一定期間内にある時刻の情報が含まれるコンテキストデータCDが読み出される。
続いて、実行解析部13は、直近(最後)に呼び出されたAPI11aに関するコンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列と、情報取得APIの文字列である「getDeviceId」とを比較し、呼び出されたAPI11aが情報取得APIであるか否かを判定する(ステップSA205)。コンテキストデータCDに含まれる時刻が最も新しいコンテキストデータCDが、直近に呼び出されたAPI11aに関するコンテキストデータCDである。あるいは、コンテキストデータCD毎にシーケンス番号が付与される場合、そのシーケンス番号から、直近に呼び出されたAPI11aに関するコンテキストデータCDを識別してもよい。
コンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列が「getDeviceId」であった場合、呼び出されたAPI11aは情報取得APIである。この場合、実行解析部13は、API11aの実行を許可することを示す情報をAPI実行部11に与える(ステップSA210)。API実行部11は、実行解析部13から与えられた情報に基づいてAPI11aに処理を実行させ、実行結果をアプリケーション10に返す。
また、コンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列が「getDeviceId」でなかった場合、呼び出されたAPI11aは情報取得APIではない。この場合、実行解析部13は、直近に呼び出されたAPI11aに関するコンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列と、外部送信APIの文字列である「sendTextMessage」とを比較し、呼び出されたAPI11aが外部送信APIであるかを判定する(ステップSA215)。
コンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列が「sendTextMessage」でなかった場合、呼び出されたAPI11aは外部送信APIではない。この場合、実行解析部13は、API11aの実行を許可することを示す情報をAPI実行部11に与える(ステップSA210)。API実行部11は、実行解析部13から与えられた情報に基づいてAPI11aに処理を実行させ、実行結果をアプリケーション10に返す。
また、コンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列が「sendTextMessage」であった場合、呼び出されたAPI11aは外部送信APIである。この場合、実行解析部13は、ステップSA200で読み出されたコンテキストデータCDのうち直近に呼び出されたAPI11aに関するコンテキストデータCD以外のそれぞれのコンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列と、情報取得APIの文字列である「getDeviceId」とを比較し、以前に情報取得APIが呼び出されたか否かを判定する(ステップSA220)。
どのコンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列も「getDeviceId」でなかった場合、以前に情報取得APIは呼び出されていない。この場合、実行解析部13は、API11aの実行を許可することを示す情報をAPI実行部11に与える(ステップSA210)。API実行部11は、実行解析部13から与えられた情報に基づいてAPI11aに処理を実行させ、実行結果をアプリケーション10に返す。
また、いずれかのコンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列が「getDeviceId」であった場合、以前に情報取得APIが呼び出されている。ステップSA215での判定により、外部送信APIが直近に呼び出されており、ステップSA220での判定により、外部送信APIが呼び出されるよりも前に情報取得APIが呼び出されていることが分かる。
この場合、実行解析部13は、情報群st[0]のメソッド名の文字列が「getDeviceId」であるコンテキストデータCDと、情報群st[0]のメソッド名の文字列が「sendTextMessage」であるコンテキストデータCDとを用いて、以下の判定を行う。実行解析部13は、情報取得APIを呼び出したライブラリのソースファイルが格納されるフォルダのパス(以下、情報取得APIに係るパスと記載)の文字列と、アプリケーションのパッケージ名の文字列とが一致するか否かを判定する(ステップSA225)。
図4の情報群st[1]には、API11aを呼び出したメソッドが定義されているクラスの名称(クラス名)が含まれる。このクラス名の文字列には、API11aを呼び出したメソッドを実行するコードが記述されたライブラリのソースファイルが格納されるフォルダのパスを示す文字列が含まれる。例えば、クラス名が「jp.sample.app.Sample」である場合、「jp.sample.app」は、ライブラリのソースファイルが格納されるフォルダのパスを示している。ステップSA225において実行解析部13は、このパスの文字列と、情報取得APIに係るコンテキストデータCDに含まれるパッケージ名の文字列とを比較する。
情報取得APIに係るパスの文字列とアプリケーションのパッケージ名の文字列とが一致する場合、実行解析部13は、外部送信APIを呼び出したライブラリのソースファイルが格納されるフォルダのパス(以下、外部送信APIに係るパスと記載)の文字列と、アプリケーションのパッケージ名の文字列とが一致するか否かを判定する(ステップSA230)。上記のように、図4の情報群st[1]にはクラス名が含まれ、このクラス名の文字列には、API11aを呼び出したメソッドを実行するコードが記述されたライブラリのソースファイルが格納されるフォルダのパスを示す文字列が含まれる。ステップSA230において実行解析部13は、このパスの文字列と、外部送信APIに係るコンテキストデータCDに含まれるパッケージ名の文字列とを比較する。
外部送信APIに係るパスの文字列とパッケージ名の文字列とが一致する場合、実行解析部13は、API11aの実行を許可することを示す情報をAPI実行部11に与える(ステップSA210)。API実行部11は、実行解析部13から与えられた情報に基づいてAPI11aに処理を実行させ、実行結果をアプリケーション10に返す。
ステップSA225において情報取得APIに係るパスの文字列とアプリケーションのパッケージ名の文字列とが一致しない場合、およびステップSA230において外部送信APIに係るパスの文字列とアプリケーションのパッケージ名の文字列とが一致しない場合、実行解析部13はセキュリティポリシー判定部14を呼び出す(ステップSA235)。この場合、ユーザが承認していない目的でユーザに気づかれずに情報が送信される可能性があるため、以下で説明するようにAPI11aの実行が制御される。
実行解析部13から呼び出されたセキュリティポリシー判定部14は、図9に示す処理を実行する。まず、セキュリティポリシー判定部14は記憶部16内のセキュリティデータSDの記憶領域からセキュリティポリシーSPを読み出し(ステップSA300)、記憶部16内のセキュリティデータSDの記憶領域からコンテキストデータCDを読み出す(ステップSA305)。このとき読み出されるコンテキストデータCDは、直近に呼び出されたAPI11aに関するコンテキストデータCDである。
続いて、セキュリティポリシー判定部14は、呼び出されたAPI11aに関する情報がセキュリティポリシーSPに登録されているか否かを判定する(ステップSA310)。セキュリティポリシーSPには、API11aの実行制御情報と、パッケージ名と、コンテキストデータCDに含まれる情報群st[1]のクラス名、メソッド名、行番号とを一組とした情報が登録される。セキュリティポリシーSPには、この一組の情報を登録の単位として複数組登録することが可能である。後述するように、実行制御部15によって、セキュリティポリシーSPに対する情報の登録が行われる。
API11aの実行制御情報は、APIの実行の許可、APIの実行の拒否、ダミー情報の利用のいずれかを示す情報である。ダミー情報とは、API11aとして情報取得APIがアプリケーション10によって呼び出された場合に、アプリケーション10に対して返答する虚偽の情報である。例えば、位置情報を取得するAPI11aが呼び出された場合、端末装置の現在の位置と異なる位置の情報がダミー情報としてアプリケーション10に対して返答される。
コンテキストデータCDに含まれる情報(パッケージ名、コンテキストデータCDに含まれる情報群St[1]のクラス名、メソッド名、行番号)が、セキュリティポリシーSPに登録されている一組の情報(パッケージ名、クラス名、メソッド名、行番号)のいずれかと完全に一致した場合、呼び出されたAPI11aに関する情報がセキュリティポリシーSPに登録されている。また、コンテキストデータCDに含まれる情報(パッケージ名、コンテキストデータCDに含まれる情報群St[1]のクラス名、メソッド名、行番号)が、セキュリティポリシーSPに登録されている一組の情報(パッケージ名、クラス名、メソッド名、行番号)のいずれとも一致しなかった場合、呼び出されたAPI11aに関する情報はセキュリティポリシーSPに登録されていない。
呼び出されたAPI11aに関する情報がセキュリティポリシーSPに登録されている場合、セキュリティポリシー判定部14は、呼び出されたAPI11aに関してセキュリティポリシーSPに登録されている実行制御情報がAPIの実行の許可を示しているか否かを判定する(ステップSA315)。実行制御情報がAPIの実行の許可を示している場合、セキュリティポリシー判定部14は、API11aの実行を許可することを示す情報をAPI実行部11に与える(ステップSA320)。API実行部11は、セキュリティポリシー判定部14から与えられた情報に基づいてAPI11aに処理を実行させ、実行結果をアプリケーション10に返す。
また、実行制御情報がAPIの実行の許可を示していない場合、実行制御情報はAPIの実行の拒否とダミー情報の利用のいずれかを示している。第1の動作例では、API11aとして外部送信APIが呼び出されたときにセキュリティポリシー判定部14が呼び出されるので、実行制御情報には情報取得APIに関するダミー情報の利用を示す情報は登録されていない。このため、実行制御情報はAPIの実行の拒否を示している。この場合、セキュリティポリシー判定部14は、API11aの実行を拒否することを示す情報をAPI実行部11に与える(ステップSA330)。API実行部11はセキュリティポリシー判定部13から与えられた情報に基づいてAPI11aの処理を中止し、実行結果をアプリケーション10に返す。このとき、情報の送信は行われない。
ステップSA310において、呼び出されたAPI11aに関する情報がセキュリティポリシーSPに登録されていない場合、セキュリティポリシー判定部14は、実行制御部15を呼び出す(ステップSA325)。
本実施形態のセキュリティポリシーSPでは、メソッド名だけでなく、パッケージ名、クラス名、行番号が実行制御情報と関連付けられている。これによって、どのアプリケーションからAPI11aが呼び出されたのか、どのクラスで定義されているメソッドからAPI11aが呼び出されたのか、ソースファイル中のどの位置で記述されたメソッドからAPI11aが呼び出されたのかといった、API11aが実行される際の詳細な状況に応じて、API11aの実行を制御することができる。
セキュリティポリシー判定部14から呼び出された実行制御部15は、図10に示す処理を実行する。まず、実行制御部15は、情報が送信されようとしていることを示すメッセージを表示部18に表示する(ステップSA400)。このとき、例えばポップアップウィンドウが表示され、そのポップアップウィンドウにメッセージが表示される。メッセージを確認したユーザによって入力部17が操作され、APIの実行の許可、APIの実行の拒否のいずれかを示す情報が入力される。実行制御部15は、入力部17から出力される情報を監視し、これらの情報を受け付ける(ステップSA405)。
ユーザによって情報が入力された場合、実行制御部15は、入力された情報がAPIの実行の許可を示しているか否かを判定する(ステップSA410)。入力された情報がAPIの実行の許可を示している場合、実行制御部15は、API11aの実行を許可することを示す情報をAPI実行部11に与える(ステップSA415)。API実行部11は、実行制御部15から与えられた情報に基づいてAPI11aに処理を実行させ、実行結果をアプリケーション10に返す。
続いて、実行制御部15は記憶部16のセキュリティデータSDの記憶領域からコンテキストデータCDを読み出す(ステップSA420)。このとき読み出されるコンテキストデータCDは、直近に呼び出されたAPI11aに関するコンテキストデータCDである。
続いて、実行制御部15は、コンテキストデータCDに含まれる情報のうち、パッケージ名と、情報群st[1]のクラス名、メソッド名、行番号と、ユーザによって入力された、APIの実行の許可、APIの実行の拒否のいずれかを示す実行制御情報とを、セキュリティポリシーSPとして、記憶部16内のセキュリティデータSDの記憶領域に格納する(ステップSA425)。
また、入力された情報がAPIの実行の許可を示していない場合、入力された情報はAPIの実行の拒否を示している。この場合、実行制御部15は、API11aの実行を拒否することを示す情報をAPI実行部11に与える(ステップSA430)。API実行部11は、実行制御部15から与えられた情報に基づいてAPI11aの処理を中止し、実行結果をアプリケーション10に返す。このとき、情報の送信は行われない。続いて、実行制御部15は、上述したステップS420,S425の処理を行う。
上記のように、API実行制御部20は、API11aの実行が情報の送信に繋がる可能性がある場合にユーザに確認を促し、ユーザによる確認の結果に基づいて、API11aの実行を制御する。これによって、ユーザに気づかれずに情報の送信が行われることを防止することができる。
<第2の動作例>
第2の動作例では、API実行制御部20は、広告・統計ライブラリによるAPI11aの実行により、アプリケーションの主要な目的とは異なる目的で、ユーザに気づかれずに情報の送信が行われることを防止する。広告・統計ライブラリが端末装置内の情報を取得した場合、SMSクライアントアプリケーション等の主要な目的(他者とコミュニケーションを行う等)とは異なる目的による情報の送信をユーザが承認していないにもかかわらず、ユーザに気づかれずに個人情報等が送信される可能性がある。このような情報の送信を防止するため、API実行制御部20は、情報取得APIが実行されるときに呼び出されて、以下で説明する処理を実行する。
第2の動作例では、広告・統計ライブラリのソースファイルが格納されるフォルダのパス(ライブラリ情報)の一覧であるパスリストが使用される。図11はパスリストを示している。パスリストは記憶部16内のセキュリティデータSDの記憶領域に格納される。
アプリケーション10がAPI11aを呼び出したとき、API実行部11から呼び出された情報取得部12は、図3に示す処理を実行する。図3に示す処理の内容については第1の動作例で説明したので、説明を省略する。
情報取得部12から呼び出された実行解析部13は、図12に示す処理を実行する。まず、実行解析部13は記憶部16のセキュリティデータSDの記憶領域からコンテキストデータCDを読み出す(ステップSB200)。このとき読み出されるコンテキストデータCDは、直近に呼び出されたAPI11aに関するコンテキストデータCDである。続いて、実行解析部13は、コンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列と、情報取得APIの文字列である「getDeviceId」とを比較し、呼び出されたAPI11aが情報取得APIである否かを判定する(ステップSB205)。
コンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列が「getDeviceId」でなかった場合、呼び出されたAPI11aは情報取得APIではない。この場合、実行解析部13は、API11aの実行を許可することを示す情報をAPI実行部11に与える(ステップSB225)。API実行部11は、実行解析部13から与えられた情報に基づいてAPI11aに処理を実行させ、実行結果をアプリケーション10に返す。
また、コンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列が「getDeviceId」であった場合、呼び出されたAPI11aは情報取得APIである。この場合、実行解析部13は記憶部16のセキュリティデータSDの記憶領域からパスリストを読み出す(ステップSB210)。続いて、実行解析部13は、情報取得APIを呼び出したライブラリのソースファイルが格納されるフォルダのパス(情報取得APIに係るパス)の文字列と、パスリストの各パスの文字列とが一致するか否かを判定する(ステップSB215)。
前述したように、図4の情報群st[1]には、API11aを呼び出したメソッドが定義されているクラスの名称(クラス名)が含まれる。このクラス名の文字列には、API11aを呼び出したメソッドを実行するコードが記述されたライブラリのソースファイルが格納されるフォルダのパスを示す文字列が含まれる。例えば、クラス名が「jp.sample.app.Sample」である場合、「jp.sample.app」は、ライブラリのソースファイルが格納されるフォルダのパスを示している。ステップSB215において実行解析部13は、このパスの文字列と、パスリストの各パスの文字列とを比較する。
情報取得APIに係るパスがパスリストのどのパスとも一致しない場合、広告・統計ライブラリから情報取得APIが呼び出されていない。この場合、実行解析部13は、API11aの実行を許可することを示す情報をAPI実行部11に与える(ステップSB225)。API実行部11は、実行解析部13から与えられた情報に基づいてAPI11aに処理を実行させ、実行結果をアプリケーション10に返す。
また、情報取得APIに係るパスがパスリストのいずれかのパスと一致する場合、広告・統計ライブラリから情報取得APIが呼び出されているので、実行解析部13はセキュリティポリシー判定部14を呼び出す(ステップSB220)。この場合、ユーザが承認していない目的でユーザに気づかれずに情報が送信される可能性があるため、以下で説明するようにAPI11aの実行が制御される。
広告・統計ライブラリが情報取得APIを呼び出した場合、図4の情報群st[1]のクラス名は、例えば「jp.Adlantis.*Andrd*.AdManager」となる。このクラス名を示す文字列のうち「jp.Adlantis.*Andrd*」がパスを示している。このパスは図11のパスリストに含まれているため、この例ではセキュリティポリシー判定部14が呼び出される。
実行解析部13から呼び出されたセキュリティポリシー判定部14は、図13に示す処理を実行する。まず、セキュリティポリシー判定部14は記憶部16内のセキュリティデータSDの記憶領域からセキュリティポリシーSPを読み出し(ステップSB300)、記憶部16内のセキュリティデータSDの記憶領域からコンテキストデータCDを読み出す(ステップSB305)。このとき読み出されるコンテキストデータCDは、直近に呼び出されたAPI11aに関するコンテキストデータCDである。
続いて、セキュリティポリシー判定部14は、呼び出されたAPI11aに関する情報がセキュリティポリシーSPに登録されているか否かを判定する(ステップSB310)。コンテキストデータCDに含まれる情報(パッケージ名、コンテキストデータCDに含まれる情報群St[1]のクラス名、メソッド名、行番号)が、セキュリティポリシーSPに登録されている一組の情報(パッケージ名、クラス名、メソッド名、行番号)のいずれかと一致した場合、呼び出されたAPI11aに関する情報がセキュリティポリシーSPに登録されている。また、コンテキストデータCDに含まれる情報(パッケージ名、コンテキストデータCDに含まれる情報群St[1]のクラス名、メソッド名、行番号)が、セキュリティポリシーSPに登録されている一組の情報(パッケージ名、クラス名、メソッド名、行番号)のいずれとも一致しなかった場合、呼び出されたAPI11aに関する情報はセキュリティポリシーSPに登録されていない。
呼び出されたAPI11aに関する情報がセキュリティポリシーSPに登録されている場合、セキュリティポリシー判定部14は、呼び出されたAPI11aに関してセキュリティポリシーSPに登録されている実行制御情報がダミー情報の利用を示しているか否かを判定する(ステップSB315)。実行制御情報がダミー情報の利用を示している場合、セキュリティポリシー判定部14は、API11aにダミー情報を利用させることを示す情報をAPI実行部11に与える(ステップSB320)。API実行部11は、セキュリティポリシー判定部14から与えられた情報に基づいて処理を実行し、実行結果をアプリケーション10に返す。このとき、API実行部11は、例えばダミー情報の格納場所として予め決められている場所から情報を読み出すAPIを実行してダミー情報を取得する。
実行制御情報がダミー情報の利用を示していない場合、セキュリティポリシー判定部14は、実行制御情報がAPIの実行の許可を示しているか否かを判定する(ステップSB330)。実行制御情報がAPIの実行の許可を示している場合、セキュリティポリシー判定部14は、API11aの実行を許可することを示す情報をAPI実行部11に与える(ステップSB335)。API実行部11は、セキュリティポリシー判定部14から与えられた情報に基づいてAPI11aに処理を実行させ、実行結果をアプリケーション10に返す。
また、実行制御情報がAPIの実行の許可を示していない場合、実行制御情報はAPIの実行の拒否を示している。この場合、セキュリティポリシー判定部14は、API11aの実行を拒否することを示す情報をAPI実行部11に与える(ステップSB340)。API実行部11は、セキュリティポリシー判定部14から与えられた情報に基づいてAPI11aの処理を中止し、実行結果をアプリケーション10に返す。このとき、端末装置のIMEIは取得されない。
ステップSB310において、呼び出されたAPI11aに関する情報がセキュリティポリシーSPに登録されていない場合、セキュリティポリシー判定部14は、実行制御部15を呼び出す(ステップSB325)。
セキュリティポリシー判定部14から呼び出された実行制御部15は、図14に示す処理を実行する。まず、実行制御部15は、個人情報等の送信が行われる可能性があることを示すメッセージを表示部18に表示する(ステップSB400)。このとき、例えばポップアップウィンドウが表示され、そのポップアップウィンドウにメッセージが表示される。メッセージを確認したユーザによって入力部17が操作され、APIの実行の許可、APIの実行の拒否、ダミー情報の利用のいずれかを示す情報が入力される。実行制御部15は、入力部17から出力される情報を監視し、これらの情報を受け付ける(ステップSB405)。
ユーザによって情報が入力された場合、実行制御部15は、入力された情報がダミー情報の利用を示しているか否かを判定する(ステップSB410)。入力された情報がダミー情報の利用を示している場合、実行制御部15は、API11aにダミー情報を利用させることを示す情報をAPI実行部11に与える(ステップSB415)。API実行部11は、実行制御部15から与えられた情報に基づいて処理を実行し、実行結果をアプリケーション10に返す。このとき、API実行部11は、例えばダミー情報の格納場所として予め決められている場所から情報を読み出すAPIを実行してダミー情報を取得する。
続いて、実行制御部15は記憶部16のセキュリティデータSDの記憶領域からコンテキストデータCDを読み出す(ステップSB420)。このとき読み出されるコンテキストデータCDは、直近に呼び出されたAPI11aに関するコンテキストデータCDである。続いて、実行制御部15は、コンテキストデータCDに含まれる情報のうち、パッケージ名と、情報群st[1]のクラス名、メソッド名、行番号と、ユーザによって入力された、APIの実行の許可、APIの実行の拒否、ダミー情報の利用のいずれかを示す実行制御情報とを、セキュリティポリシーSPとして、記憶部16内のセキュリティデータSDの記憶領域に格納する(ステップSB425)。
ステップSB410において、入力された情報がダミー情報の利用を示していない場合、実行制御部15は、入力された情報がAPIの実行の許可を示しているか否かを判定する(ステップSB430)。入力された情報がAPIの実行の許可を示している場合、実行制御部15は、API11aの実行を許可することを示す情報をAPI実行部11に与える(ステップSB435)。API実行部11は、実行制御部15から与えられた情報に基づいてAPI11aに処理を実行させ、実行結果をアプリケーション10に返す。続いて、実行制御部15は、上述したステップSB420,SB425の処理を行う。
また、入力された情報がAPIの実行の許可を示していない場合、入力された情報はAPIの実行の拒否を示している。この場合、実行制御部15は、API11aの実行を拒否することを示す情報をAPI実行部11に与える(ステップSB440)。API実行部11は、実行制御部15から与えられた情報に基づいてAPI11aの実行を中止し、実行結果をアプリケーション10に返す。このとき、端末装置のIMEIは取得されない。続いて、実行制御部15は、上述したステップSB420,SB425の処理を行う。
上記のように、API実行制御部20は、API11aの実行が、広告・統計ライブラリによる情報の送信に繋がる可能性がある場合にユーザに確認を促し、ユーザによる確認の結果に基づいて、API11aの実行を制御する。これによって、ユーザに気づかれずに情報の送信が行われることを防止することができる。
<第3の動作例>
第3の動作例では、API実行制御部20は、外部送信APIが、アプリケーションのコンポーネントの1つであるServiceを継承するクラスのメソッドから実行されることによりユーザに気づかれずに情報の送信が不正に行われることを防止する。Android(登録商標)上で動作するアプリケーションの構成要素(コンポーネント)として、Activity、Service、BroadcastReceiver、ContentProviderの4つがある。アプリケーションのソースコードにおいて、クラスが継承するコンポーネントが記述されることにより、そのクラスで定義されているメソッドはそのコンポーネントを利用することが可能となる。以下、各コンポーネントについて説明する。
Activityは、ユーザに対して視覚的なインターフェイスを提供し、画面上でユーザと対話を行うコンポーネントである。アプリケーションを起動すると画面が表示される場合、Activityに記述されたプログラムが動作している。
Serviceは、画面を表示する機能を持たずに、バックグラウンドで処理を実行するコンポーネントである。例えば、ユーザが音楽を聞きながらブラウザを起動してインターネットの利用を楽しむ場合、音楽用アプリケーションがServiceを起動することにより、ユーザはインターネットの利用中に音楽を聞くことができる。
BroadcastReceiverは、Android(登録商標)が搭載された端末装置のシステム全体にブロードキャストされるINTENTを受け取るコンポーネントである。例えば、電池残量が減ってきたときに、「残りのバッテリー残量が少ないです」というメッセージを含む画面を表示するアプリケーションでは、電池残量が変化するときに発行されるBroadcastIntentをBroadcastReceiverにより受け取ったアプリケーションがActivityを起動して画面を表示する。
ContentProviderは、アプリケーションが保持するデータを他のコンポーネントでも使用可能にするコンポーネントである。例えば、あるアプリケーションが電話帳のデータを取得したい場合、そのアプリケーションは、電話帳アプリケーションのContentProviderを利用して、電話帳に登録されている情報を取得する。
SMSでは、ユーザが入力した文章を送信することが多いため、アプリケーションはActivityを利用して情報を送信する。一方、悪性アプリケーションは、ユーザに気づかれないように、Serviceを利用してバックグラウンドで情報を送信することが多い。したがって、Serviceを継承するクラスのメソッドから外部送信APIが実行される場合、ユーザに気づかれずに不正な送信先に情報が送信されて個人情報等が漏洩するという不正行為が発生する可能性がある。このような不正行為を防止するため、API実行制御部20は、外部送信APIが実行されるときに呼び出されて、以下で説明する処理を実行する。
アプリケーション10がAPI11aを呼び出したとき、API実行部11から呼び出された情報取得部12は、図3に示す処理を実行する。図3に示す処理の内容については第1の動作例で説明したので、説明を省略する。
情報取得部12から呼び出された実行解析部13は、図15に示す処理を実行する。まず、実行解析部13は記憶部16のセキュリティデータSDの記憶領域からコンテキストデータCDを読み出す(ステップSC200)。このとき読み出されるコンテキストデータCDは、直近に呼び出されたAPI11aに関するコンテキストデータCDである。続いて、実行解析部13は、コンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列と、外部送信APIの文字列である「sendTextMessage」とを比較し、呼び出されたAPI11aが外部送信APIであるか否かを判定する(ステップSC205)。
コンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列が「sendTextMessage」でなかった場合、呼び出されたAPI11aは外部送信APIではない。この場合、実行解析部13は、API11aの実行を許可することを示す情報をAPI実行部11に与える(ステップSC220)。API実行部11は、実行解析部13から与えられた情報に基づいてAPI11aに処理を実行させ、実行結果をアプリケーション10に返す。
また、コンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列が「sendTextMessage」であった場合、呼び出されたAPI11aは外部送信APIである。この場合、実行解析部13は、コンテキストデータCDに含まれる情報群st[2]のメソッド名の文字列と、Serviceで実行されるメソッドの名称の文字列である「handleCreateService」とを比較し、Serviceを継承するクラスのメソッドから外部送信APIが呼び出されたか否かを判定する(ステップSC210)。
前述したように、図4の情報群st[1]には、API11aを呼び出したメソッドの名称(メソッド名)が含まれる。また、図4の情報群St[2]には、情報群St[1]のメソッド名で示されるメソッドを呼び出したメソッドの名称(メソッド名)が含まれる。情報群St[2]に含まれるメソッド名が「handleCreateService」である場合、Serviceを継承するクラスのメソッドであるhandleCreateServiceメソッドによって呼び出されたメソッドによって外部送信APIが呼び出される。
コンテキストデータCDに含まれる情報群st[2]のメソッド名の文字列が「handleCreateService」と一致する場合、Serviceを継承するクラスのメソッドから外部送信APIが呼び出されている。この場合、実行解析部13はセキュリティポリシー判定部14を呼び出す(ステップSC215)。この場合、ユーザが承認していない目的でユーザに気づかれずに情報が送信される可能性があるため、以下で説明するようにAPI11aの実行が制御される。
また、コンテキストデータCDに含まれる情報群st[2]のメソッド名の文字列が「handleCreateService」と一致しない場合、Serviceを継承するクラスのメソッドから外部送信APIが呼び出されていない。この場合、実行解析部13は、API11aの実行を許可することを示す情報をAPI実行部11に与える(ステップSC220)。API実行部11は、実行解析部13から与えられた情報に基づいてAPI11aに処理を実行させ、実行結果をアプリケーション10に返す。
実行解析部13から呼び出されたセキュリティポリシー判定部14は、図9に示す処理を実行する。図9に示す処理の内容については、第1の動作例で説明したので、説明を省略する。セキュリティポリシー判定部14から呼び出された実行制御部15は、図10に示す処理を実行する。図10に示す処理の内容については、第1の動作例で説明したので、説明を省略する。
上記のように、API実行制御部20は、API11aの実行がバックグラウンドでの情報の送信に繋がる可能性がある場合にユーザに確認を促し、ユーザによる確認の結果に基づいて、API11aの実行を制御する。これによって、ユーザに気づかれずに情報の送信が不正に行われることを防止することができる。
<第4の動作例>
第4の動作例では、API実行制御部20は、正規のアプリケーションがAPIを実行するシーケンスとは異なるシーケンスでAPIを実行する不正な動作を防止する。通常のカメラアプリケーションでは、カメラで撮影を行う前にプレビュー画像が表示され、ユーザはプレビュー画像を見ながら、撮影のシャッターを切る操作を行う。プレビュー画像が表示されていないにもかかわらず撮影のシャッターが切られた場合、盗撮等の不正行為が発生する可能性がある。このような不正行為を防止するため、API実行制御部20は、カメラで撮影を行う前にプレビュー画像を表示するAPI(プレビュー表示API)、およびカメラで撮影のシャッターを切るAPI(シャッターAPI)が実行されるときに呼び出されて、以下で説明する処理を実行する。
アプリケーション10がAPI11aを呼び出したとき、API実行部11から呼び出された情報取得部12は、図3に示す処理を実行する。図3に示す処理の内容については第1の動作例で説明したので、説明を省略する。
情報取得部12から呼び出された実行解析部13は、図16に示す処理を実行する。まず、実行解析部13は記憶部16のセキュリティデータSDの記憶領域からコンテキストデータCDを読み出す(ステップSD200)。このとき読み出されるコンテキストデータCDは、例えば現時点までの一定期間内に呼び出された全てのAPI11aに関するコンテキストデータCDである。
続いて、実行解析部13は、直近に呼び出されたAPI11aに関するコンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列と、プレビューAPIの文字列である「setPreviewDisplay」とを比較し、呼び出されたAPI11aがプレビューAPIである否かを判定する(ステップSD205)。
コンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列が「setPreviewDisplay」であった場合、呼び出されたAPI11aはプレビューAPIである。この場合、実行解析部13は、API11aの実行を許可することを示す情報をAPI実行部11に与える(ステップSD210)。API実行部11は、実行解析部13から与えられた情報に基づいてAPI11aに処理を実行させ、実行結果をアプリケーション10に返す。
また、コンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列が「setPreviewDisplay」でなかった場合、呼び出されたAPI11aはプレビューAPIではない。この場合、実行解析部13は、直近に呼び出されたAPI11aに関するコンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列と、シャッターAPIの文字列である「takePicture」とを比較し、呼び出されたAPI11aがシャッターAPIであるか否かを判定する(ステップSD215)。
コンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列が「takePicture」でなかった場合、呼び出されたAPI11aはシャッターAPIではない。この場合、実行解析部13は、API11aの実行を許可することを示す情報をAPI実行部11に与える(ステップSD210)。API実行部11は、実行解析部13から与えられた情報に基づいてAPI11aに処理を実行させ、実行結果をアプリケーション10に返す。
また、コンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列が「takePicture」であった場合、呼び出されたAPI11aはシャッターAPIである。この場合、実行解析部13は、ステップSD200で読み出されたコンテキストデータCDのうち直近に呼び出されたAPI11aに関するコンテキストデータCD以外のそれぞれのコンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列と、プレビューAPIの文字列である「setPreviewDisplay」とを比較し、以前にプレビューAPIが呼び出されたか否かを判定する(ステップSD220)。
いずれかのコンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列が「setPreviewDisplay」であった場合、以前にプレビューAPIが呼び出されている。ステップSD215での判定により、シャッターAPIが直近に呼び出されており、ステップSD220での判定により、シャッターAPIが呼び出されるよりも前にプレビューAPIが呼び出されていることが分かる。
プレビューAPIを呼び出した後、シャッターAPIを呼び出す動作は正規の動作であると考えられる。この場合、実行解析部13は、API11aの実行を許可することを示す情報をAPI実行部11に与える(ステップSD210)。API実行部11は、実行解析部13から与えられた情報に基づいてAPI11aに処理を実行させ、実行結果をアプリケーション10に返す。
また、どのコンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列も「setPreviewDisplay」でなかった場合、以前にプレビューAPIは呼び出されていない。ステップSD215での判定により、シャッターAPIが直近に呼び出されており、ステップSD220での判定により、シャッターAPIが呼び出されるよりも前にプレビューAPIが呼び出されていないことが分かる。
プレビューAPIを呼び出すことなくシャッターAPIを呼び出す動作は不正な動作であると考えられるので、実行解析部13はセキュリティポリシー判定部14を呼び出す(ステップSD225)。この場合、不正な動作によりユーザに気づかれずに写真が撮影される可能性があるため、以下で説明するようにAPI11aの実行が制御される。
実行解析部13から呼び出されたセキュリティポリシー判定部14は、図9に示す処理を実行する。図9に示す処理の内容については、第1の動作例で説明したので、説明を省略する。セキュリティポリシー判定部14から呼び出された実行制御部15は、図10に示す処理を実行する。図10に示す処理の内容については、第1の動作例で説明したので、説明を省略する。
上記のように、API実行制御部20は、API11aの実行が不正に行われる可能性がある場合にユーザに確認を促し、ユーザによる確認の結果に基づいて、API11aの実行を制御する。これによって、ユーザに気づかれずに不正な動作が行われることを防止することができる。
<第5の動作例>
第5の動作例では、API実行制御部20は、正規のアプリケーションがAPIを実行するシーケンスとは異なるシーケンスでAPIを実行する不正な動作を防止する。通常のSMSクライアントアプリケーションは、アドレス帳を参照し、アドレス帳から送信先の情報(アドレス)を取得した後、その送信先にメッセージ(メール)を送信する。
端末装置から個人情報を取得し、取得した個人情報を含むメッセージを外部に送信することで情報漏洩を行う悪性アプリケーションがある。悪性アプリケーションの開発者に個人情報を送信するためには、悪性アプリケーションの動作時にメッセージの送信先のアドレスに悪性アプリケーションの開発者の電話番号を設定する必要がある。このため、アドレス帳が参照されていないにもかかわらずメッセージが送信された場合、個人情報等が漏洩するという不正行為が発生する可能性がある。このような不正行為を防止するため、API実行制御部20は、メモリ内のデータベースにアクセスして情報を取得するAPI(データベース参照API)が実行されるとき、および外部送信APIが実行されるときに呼び出されて、以下で説明する処理を実行する。
アプリケーション10がAPI11aを呼び出したとき、API実行部11から呼び出された情報取得部12は、図3に示す処理を実行する。図3に示す処理の内容については第1の動作例で説明したので、説明を省略する。ただし、以下の点が、第1の動作例で説明した情報取得部12の処理と異なる。アプリケーション10は、データベース参照API を呼び出すとき、データベース内のアクセス先(データベース参照APIがアクセスするデータベース内の位置)を示す引数(データベース位置情報)をAPI実行部11に与える。API実行部11は、情報取得部12を呼び出すときにこの引数を情報取得部12に与える。情報取得部12は、この引数を含むコンテキストデータCDを記憶部16内のセキュリティデータSDの記憶領域に格納する。
情報取得部12から呼び出された実行解析部13は、図17に示す処理を実行する。まず、実行解析部13は記憶部16のセキュリティデータSDの記憶領域からコンテキストデータCDを読み出す(ステップSE200)。このとき読み出されるコンテキストデータCDは、例えば現時点までの一定期間内に呼び出された全てのAPI11aに関するコンテキストデータCDである。
続いて、実行解析部13は、直近に呼び出されたAPI11aに関するコンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列と、データベース参照APIの文字列である「Cursor」とを比較し、呼び出されたAPI11aがデータベース参照APIであるか否かを判定する(ステップSE205)。
コンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列が「Cursor」であった場合、呼び出されたAPI11aはデータベース参照APIである。この場合、実行解析部13は、API11aの実行を許可することを示す情報をAPI実行部11に与える(ステップSE210)。API実行部11は、実行解析部13から与えられた情報に基づいてAPI11aに処理を実行させ、実行結果をアプリケーション10に返す。
また、コンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列が「Cursor」でなかった場合、呼び出されたAPI11aはデータベース参照APIではない。この場合、実行解析部13は、直近に呼び出されたAPI11aに関するコンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列と、外部送信APIの文字列である「sendTextMessage」とを比較し、呼び出されたAPI11aが外部送信APIであるか否かを判定する(ステップSE215)。
コンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列が「sendTextMessage」でなかった場合、呼び出されたAPI11aは外部送信APIではない。この場合、実行解析部13は、API11aの実行を許可することを示す情報をAPI実行部11に与える(ステップSE210)。API実行部11は、実行解析部13から与えられた情報に基づいてAPI11aに処理を実行させ、実行結果をアプリケーション10に返す。
また、コンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列が「sendTextMessage」であった場合、呼び出されたAPI11aは外部送信APIである。この場合、実行解析部13は、ステップSE200で読み出されたコンテキストデータCDのうち直近に呼び出されたAPI11aに関するコンテキストデータCD以外のそれぞれのコンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列と、データベース参照APIの文字列である「Cursor」とを比較し、以前にデータベース参照APIが呼び出されたか否かを判定する(ステップSE220)。
いずれかのコンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列が「Cursor」であった場合、以前にデータベース参照APIが呼び出されている。ステップSE215での判定により、外部送信APIが直近に呼び出されており、ステップSE220での判定により、外部送信APIが呼び出されるよりも前にデータベース参照APIが呼び出されていることが分かる。
この場合、実行解析部13は、ステップSE200で読み出されたコンテキストデータCDのうちデータベース参照APIに関するコンテキストデータCDに含まれる、データベース内のアクセス先を示す引数の文字列と、正規のアプリケーションがアドレスの参照に利用するアドレス帳を示す文字列である「com.*andrd*.contacts」とを比較し、データベース参照APIのアクセス先としてアドレス帳が指定されたか否か(データベース参照APIのアクセス先がアドレス帳であるか否か)を判定する(ステップSE225)。
データベース内のアクセス先を示す引数の文字列が「com.*andrd*.contacts」であった場合、データベース参照APIのアクセス先としてアドレス帳が指定されている。アドレス帳にアクセスするデータベース参照APIを呼び出した後、外部送信APIを呼び出す動作は正規の動作であると考えられる。この場合、実行解析部13は、API11aの実行を許可することを示す情報をAPI実行部11に与える(ステップSE210)。API実行部11は、実行解析部13から与えられた情報に基づいてAPI11aに処理を実行させ、実行結果をアプリケーション10に返す。
データベース内のアクセス先を示す引数の文字列が「com.*andrd*.contacts」でなかった場合、データベース参照APIのアクセス先としてアドレス帳が指定されていない。アドレス帳にアクセスすることなく外部送信APIを呼び出す動作は不正な動作であると考えられるので、実行解析部13はセキュリティポリシー判定部14を呼び出す(ステップSE230)。この場合、不正な動作によりユーザに気づかれずに情報が送信される可能性があるため、以下で説明するようにAPI11aの実行が制御される。
また、ステップSE220において、どのコンテキストデータCDに含まれる情報群st[0]のメソッド名の文字列も「Cursor」でなかった場合、以前にデータベース参照APIは呼び出されていない。ステップSE215での判定により、外部送信APIが直近に呼び出されており、ステップSE220での判定により、外部送信APIが呼び出されるよりも前にデータベース参照APIが呼び出されていないことが分かる。
データベース参照APIを呼び出すことなく外部送信APIを呼び出す動作は不正な動作であると考えられるので、実行解析部13はセキュリティポリシー判定部14を呼び出す(ステップSE230)。この場合、不正な動作によりユーザに気づかれずに情報が送信される可能性があるため、以下で説明するようにAPI11aの実行が制御される。
実行解析部13から呼び出されたセキュリティポリシー判定部14は、図9に示す処理を実行する。図9に示す処理の内容については、第1の動作例で説明したので、説明を省略する。セキュリティポリシー判定部14から呼び出された実行制御部15は、図10に示す処理を実行する。図10に示す処理の内容については、第1の動作例で説明したので、説明を省略する。
上記のように、API実行制御部20は、API11aの実行が不正に行われる可能性がある場合にユーザに確認を促し、ユーザによる確認の結果に基づいて、API11aの実行を制御する。これによって、ユーザに気づかれずに不正な動作が行われることを防止することができる。
上述したように、第1〜第3の動作例では、ユーザが認識していない動作により情報が送信される場合に、ユーザに通知を行った後、ユーザによって入力された情報に基づいて、APIの実行を制御することによって、ユーザに気づかれずに情報が送信されることを防止することができる。また、第4〜第5の動作例では、プレビューAPIが実行されることなくシャッターAPIが実行される場合や、アドレス帳にアクセスするデータベース参照APIが実行されずに外部送信APIが実行される場合に、ユーザに通知を行った後、ユーザによって入力された情報に基づいて、APIの実行を制御することによって、ユーザに気づかれずに不正な動作が行われることを防止することができる。
また、表示部18に表示されたメッセージを確認したユーザによって入力された、APIの実行の許可、APIの実行の拒否、ダミー情報の利用のいずれかを示す実行制御情報をセキュリティポリシーSPとして登録しておき、次にAPI11aが実行されようとしているときに、セキュリティポリシーSPに登録された情報に基づいてAPI11aの実行を制御することによって、ユーザにとって手間となりうる確認の作業が頻繁に行われることを防止することができる。
以上、図面を参照して本発明の実施形態について詳述してきたが、具体的な構成は上記の実施形態に限られるものではなく、本発明の要旨を逸脱しない範囲の設計変更等も含まれる。