JP6770335B2 - 解析装置及びプログラム - Google Patents

解析装置及びプログラム Download PDF

Info

Publication number
JP6770335B2
JP6770335B2 JP2016099308A JP2016099308A JP6770335B2 JP 6770335 B2 JP6770335 B2 JP 6770335B2 JP 2016099308 A JP2016099308 A JP 2016099308A JP 2016099308 A JP2016099308 A JP 2016099308A JP 6770335 B2 JP6770335 B2 JP 6770335B2
Authority
JP
Japan
Prior art keywords
variable
name
recorded
history
pseudo
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2016099308A
Other languages
English (en)
Other versions
JP2017207882A (ja
Inventor
旭洋 本多
旭洋 本多
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
NTT TechnoCross Corp
Original Assignee
NTT TechnoCross Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by NTT TechnoCross Corp filed Critical NTT TechnoCross Corp
Priority to JP2016099308A priority Critical patent/JP6770335B2/ja
Publication of JP2017207882A publication Critical patent/JP2017207882A/ja
Application granted granted Critical
Publication of JP6770335B2 publication Critical patent/JP6770335B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Stored Programmes (AREA)

Description

本発明は、解析装置及びプログラムに関する。
近年、Android(登録商標)を搭載した携帯端末(スマートフォン)が登場し、開発者は、携帯端末用のアプリケーションを開発して第三者に配布することが可能になっている。特にAndroid(登録商標)はJava(登録商標)をベースとしていることから、Java(登録商標)プログラミングの知識があれば、比較的容易に携帯端末用のアプリケーションの開発が可能である。
なお、携帯端末用のアプリケーションに関する従来技術として例えば特許文献1に開示された技術がある。
特開2014−071840号公報
携帯端末内には様々な個人情報が格納されていることから、携帯端末用のアプリケーションを作成する際は、これらの個人情報を外部に流出させるような動作を行うことがないように注意してアプリケーションの開発を行う必要がある。
ここで、作成されたアプリケーションの動作を分析する手法として、動的解析と静的解析の2つの手法が知られている。動的解析は、作成されたアプリケーションを実際に動作させることで精度の高い解析を実現する方法であるが、実際にアプリケーションを動作させるため、万が一、個人情報を外部に流出させるように動作するアプリケーションを作成してしまった場合、個人情報が外部に流出してしまう危険性がある。
一方、静的解析は、作成されたアプリケーションのソースコードを分析することで網羅性の高い解析を実現する方法であるが、複雑な処理を行うアプリケーションでは処理の見落としが発生する可能性があり、高精度な解析は難しいという問題がある。
開示の技術は上記に鑑みてなされたものであって、アプリケーションのリスク評価を、より安全かつ高精度に行うことが可能な技術を提供することを目的とする。
開示の技術の解析装置は、Java(登録商標)アプリケーションのリスク評価を行う解析装置であって、特定の情報を変数又はオブジェクトに格納する処理を行う第一のメソッドの名称と、変数又はオブジェクトに対して所定の処理を行う第二のメソッドの名称とを記憶する記憶手段と、解析対象のクラスファイルに含まれるバイトコードを追跡することで、前記解析対象のクラスファイルで使用される変数又はオブジェクトに値を書き込むメソッドの名称、及び、前記変数又はオブジェクトに格納された値を読込むメソッドの名称が記録された履歴を生成する、解析手段と、前記履歴に記録された前記変数又はオブジェクトに値を書き込むメソッドの名称のうち、前記第一のメソッドの名称と同一であるメソッドにより値が書き込まれた変数又はオブジェクトが抽出されるか否か、及び、抽出された変数又はオブジェクトが前記第二のメソッドの名称と同一の名称のメソッドで読込まれているか否かを検索することで、リスク評価を行う評価手段と、を有する。
開示の技術によれば、アプリケーションのリスク評価を、より安全かつ高精度に行うことが可能な技術が提供される。
実施の形態に係る解析装置の機能構成の一例を示す図である。 実施の形態に係る解析装置が行う処理手順の一例を示すフローチャートである。 疑似メモリ領域及びメモリ操作履歴の一例を示す図である。 動作例を説明するための図である。 バイトコードを示す図である。 処理始点メソッド一覧の状態を示す図である。 疑似スタティック変数領域の状態を示す図である。 メモリ操作履歴及び疑似スタティック変数領域の状態を示す図である。 リスク評価処理の具体例を説明するための図である。 変数の状態遷移を示す図である。
以下、図面を参照して本発明の実施の形態を説明する。なお、以下で説明する実施の形態は一例に過ぎず、本発明が適用される実施の形態は、以下の実施の形態に限られるわけではない。
以下の説明において、解析装置10が解析対象とするJava(登録商標)アプリケーションは、主にAndroid(登録商標)端末用のアプリケーションであることを前提として説明するが、本実施の形態は、Android(登録商標)端末用のアプリケーションに限らず、Java(登録商標)アプリケーション全般に適用することができる。
<概要>
本実施の形態に係る解析装置10は、Java(登録商標)アプリケーション(以下、単に「アプリケーション」と記載する)をコンパイルすることで生成されるクラスファイル(classファイル)を用いてアプリケーションの動作を追跡することで、解析対象であるアプリケーションのリスク評価を行う。クラスファイルとは、ソースコード内に記述されているクラス毎に1つ生成されるファイルであり、クラスに関する情報が含まれるヘッダ部分と、クラス内で定義されるメソッドの実行内容が記述されたバイトコードから構成されているファイルである。
まず、解析装置10は、解析対象とするアプリケーションのクラスファイルに含まれるバイトコードを追跡することで、クラスファイルで使用される変数及びオブジェクトに値を書き込むメソッドの名称、及び、当該変数及びオブジェクトに格納された値を読込むメソッドの名称が記録された履歴(以下、「メモリ操作履歴」と呼ぶ)を生成する。
続いて、解析装置10は、メモリ操作履歴に記録された、変数又はオブジェクトに値を書き込むメソッドの名称のうち、特定の情報(例えば、リスクが高いと判断される個人情報など)を変数又はオブジェクトに格納する処理を行うメソッドにより値が書き込まれた変数又はオブジェクトが抽出されるか否か、及び、抽出された変数又はオブジェクトが、所定の処理(例えば、変数又はオブジェクトに格納された値をネットワークに送信する処理)を行うメソッドで読込まれているか否かを検索することで、アプリケーションのリスク評価を行う。
つまり、本実施の形態に係る解析装置10は、解析対象とするアプリケーションのクラスファイルに含まれるバイトコードを解析し、特定の情報(例えば個人情報など)に対して所定の処理(例えば、変数又はオブジェクトに格納された値をネットワークに送信する処理)が行われるのか否かを追跡することで、実際にアプリケーションを実行することなくリスク評価を行うことを可能にする。また、ソースコードそのものを解析するのではなくバイトコードを解析するようにすることで、ソースコードが難読化されている場合であっても実際の変数の値及びオブジェクトの値の状態遷移を高精度に追跡することを可能にする。
<機能構成>
図1は、実施の形態に係る解析装置10の機能構成の一例を示す図である。図1に示すように、解析装置10は、記憶部101と、初期化部102と、解析部103と、評価部104とを有する。これら各部は、解析装置10にインストールされた1以上のプログラムが、解析装置10のCPUに実行させる処理により実現される。なお、記憶部101、初期化部102、解析部103、及び評価部104ごとに、異なるコンピュータを用いて実現されてもよいし、更に細かい単位でコンピュータが分散されていてもよい。すなわち、解析装置10は、1又は複数のコンピュータを用いて実現されてもよい。また、当該1又は複数のコンピュータは、仮想化技術を利用した仮想サーバであってもよいし、クラウド上に実装された仮想サーバであってもよい。
記憶部101は、メモリ、HDD(Hard Disk)等を用いて実現され、「解析対象のクラスファイル」、「メモリ操作履歴DB」、「処理開始メソッド情報」、「疑似メモリ領域」、及び「リスク評価情報」が格納される。
「解析対象のクラスファイル」は、解析対象であるアプリケーションのソースコードをコンパイルすることで生成されるクラスファイルである。Android(登録商標)端末用のアプリケーションの場合、クラスファイルは、APK(application package)ファイルを所定のツールを用いて展開することで抽出することが可能である。
「処理始点メソッド一覧」には、解析対象のアプリケーションにおいて処理を開始する始点となるメソッドのメソッド名の一覧が格納される。ここで、処理を開始する始点となるメソッドとは、ユーザが何かしらのアクションを行った際に呼び出されるメソッドであり、例えば、ユーザ操作によりアプリケーションが起動されて画面表示される際に必ず呼び出されるメソッド(一例としてonCreateメソッド)、ユーザが画面上でボタンを押下した際に呼び出されるメソッド(一例としてonClickメソッド)などである。
「疑似メモリ領域」は、アプリケーションがJava(登録商標)VM(Android(登録商標)の場合はDalvikVM)上で実行される際に用いられるメモリ領域を疑似的に実現するためのメモリ領域である。疑似メモリ領域には、クラス内でスタティック宣言(static)された変数が格納されるメモリ領域(スタティック領域(静的領域))を疑似的に実現する「疑似スタティック変数領域」、メソッド内に閉じたメモリ領域であり、自クラスのインスタンス(実行中の自クラスのオブジェクト)、ローカル変数及び引数が格納される領域(ローカル変数領域)を疑似的に実現する「疑似ローカル変数領域」、並びに、メソッド実行時に変数及びオブジェクトを一時的に格納するスタックを疑似的に実現する「疑似オペランドスタック領域」が含まれる。「疑似スタティック変数領域」、「疑似ローカル変数領域」、及び「疑似オペランドスタック領域」は、アプリケーションの解析が開始される際に、記憶部101内に動的に生成される。
「解析用情報」には、解析装置10の利用者により予め登録された「処理始点メソッド情報」及び「リスク評価情報」が含まれる。「処理始点メソッド情報」には、アプリケーションにおいて処理を開始する始点となるメソッドとして予め規定されているメソッド名の一覧(例えば、Android(登録商標)アプリケーションの場合、前述のonCreateメソッド、onClickメソッドなど)が格納されている。「リスク評価情報」は、特定の情報(例えば、個人情報など)を変数又はオブジェクトに格納する処理を行うメソッドのメソッド名(一例として、携帯電話の電話番号を取得するメソッドであるTelephonyManagerクラスのgetDeviceIDメソッド)の一覧、及び、所定の処理(例えば、変数又はオブジェクトに格納された値をネットワークに送信する処理)を行うメソッドとして予め規定されているメソッド名(一例として、httpクラスのsendRequestメソッド、WebViewクラスのloadUrlメソッドなど)の一覧が格納される。
初期化部102は、解析装置10がアプリケーションの解析を開始する際に、解析対象であるアプリケーションのAPKファイルを読み込み、記憶部101の「解析対象のクラスファイル」にクラスファイルを展開する等の処理を行う。
解析部103は、クラスファイルに含まれるバイトコードを追跡することでアプリケーションの動作を解析し、メモリ操作履歴を生成する。具体的な処理手順については後述する。
評価部104は、メモリ操作履歴に記録された内容と、「リスク評価情報」に格納されているメソッド名とを比較することで、アプリケーションのリスク評価を行う。より具体的には、評価部104は、メモリ操作履歴に記録された、変数又はオブジェクトに値を書き込むメソッドの名称のうち、特定の情報(例えば、個人情報など)を変数又はオブジェクトに格納する処理を行うメソッドにより値が書き込まれた変数又はオブジェクトが抽出されるか否か、及び、抽出された変数又はオブジェクトが、所定の処理(例えば、変数又はオブジェクトに格納された値をネットワークに送信する処理)を行うメソッドで読込まれているか否かを検索することで、アプリケーションのリスク評価を行う。
<処理手順>
図2は、実施の形態に係る解析装置10が行う処理手順の一例を示すフローチャートである。図2を用いて、解析装置10が行う処理手順を具体的に説明する。
ステップS101で、初期化部102は、解析対象のアプリケーションのAPKファイルを読込み、APKファイルを所定のツールを用いて展開することで1以上のクラスファイルを抽出し、記憶部101の「解析対象のクラスファイル」に格納する。
ステップS102で、解析部103は、「解析対象のクラスファイル」に記憶されている1以上のクラスファイルの内容と「処理開始メソッド情報」とを比較することで、解析対象のアプリケーションにおいて処理を開始する起点となるメソッドの一覧を生成し、メソッドを一意に識別するためのID(以下、「始点ID」と呼ぶ)と対応づけて「処理始点メソッド一覧」に格納する。なお、解析部103は、「解析対象のクラスファイル」に記憶されている1以上のクラスファイルを全て検索するのではなく、画面表示に必要なスーパークラス(例えば、android.app.Activityクラス)を承継しているクラスを対象に検索するようにしてもよい。Android(登録商標)のアプリケーションでは、基本的に、起動時に画面表示が行われる(つまり、画面表示を行うクラスが呼び出される)ため、解析部103は、処理を開始する起点となるメソッドの検索を効率的に行うことができる。
ステップS103で、解析部103は、「処理始点メソッド一覧」にメソッドが格納されているクラスファイル(つまり、処理始点メソッドを含むクラスのクラスファイル)を「解析対象のクラスファイル」から読み出すと共に、「疑似スタティック変数領域」を記憶部101内に生成する。続いて、クラスファイル内でスタティック宣言されている変数を検索し、変数名及び変数に格納される値を「疑似スタティック変数領域」に記録する。例えば、Aクラスのクラスファイル内で"tellnum"という名称の変数がスタティック宣言され、"XXX"の値が格納される場合、解析部103は、図3(a)に示すように、「疑似スタティック変数領域」に、変数名"A.tellnum"と値"XXX"とを記録する。
続いて、解析部103は、「処理始点メソッド一覧」に格納されているメソッドを1つ選択し、当該メソッド内に閉じた疑似的なメモリ領域である「疑似ローカル変数領域」を記憶部101内に生成する。図3(b)に「疑似ローカル変数領域」の一例を示す。「疑似ローカル変数領域」は、メソッド内で生成されるローカル変数(メソッド呼出し時に渡される引数を含む)、及び、メソッド内で生成されるオブジェクトごとに、特定のメモリ領域番号が対応づけられて格納される。メモリ領域番号は、バイトコード上でローカル変数又はオブジェクトを指定する際に用いられる番号であり、メモリ領域番号「1」には、自クラスのインスタンス(つまり、メソッドが実行される自クラスのオブジェクト)が格納される領域として予約されている。これは、Java(登録商標)VM(DalvikVM)上でのローカル変数領域の動作と同一である。
続いて、解析部103は、「疑似オペランドスタック領域」を記憶部101内に生成する。「疑似オペランドスタック領域」は、Java(登録商標)VM(DalvikVM)上で用意されるオペランドスタックと同様、後入れ先出し(LIFO:Last In First Out)で変数及びオブジェクトを一時的に格納するための領域であり、バイトコードの動作を追跡する際に用いられる。図3(c)に「疑似オペランドスタック領域」の一例を示す。スタックIDは、バイトコードの動作を追跡する際にスタックの位置を特定するために用いられるIDである。
続いて、解析部103は、選択されたメソッドのバイトコードをアドレス順に追跡する。バイトコードは、Java(登録商標)VM(DalvikVM)で定義されたインストラクション(命令)の組み合わせで構成されている。Java(登録商標)VM(DalvikVM)では様々なインストラクションが定義されているが、基本的に、スタティック領域又はローカル変数領域から変数又はオブジェクトをオペランドスタックにPUSHしたり、オペランドスタックから変数又はオブジェクトをPOPしてスタティック領域又はローカル変数領域に格納したりという動作が定義されている。
解析部103は、選択されたメソッドのバイトコードをアドレス順に追跡し、スタティック変数、ローカル変数、オブジェクト、及びオペランドスタックに対して、どのような操作が行われるのかをメモリ操作履歴に記録していく。より具体的には、解析部103は、バイトコードにアドレス順に記載されているインストラクションの動作を、疑似スタティック領域、疑似ローカル変数領域、疑似オペランドスタック領域を用いて疑似的に実行する(PUSH/POPの動作を疑似的に行う)ことで、スタティック変数、ローカル変数、オブジェクト、及びオペランドスタックに対して、どのような操作が行われるのかを把握してメモリ操作履歴に記録しておく。
図3(d)にメモリ操作履歴の例を示す。「始点ID」には、選択されたメソッド(追跡対象のメソッド)の始点IDが記録される。「ノードID」には、メモリ操作履歴の履歴順に割当てられるIDが記録される。「親ノードID」には、その履歴に係る操作の前に実行された操作に対応するノードIDが記録される。「読込先」には、その履歴に係る操作で読み込まれたスタティック変数の変数名、疑似スタティック領域のメモリ領域番号、又は、疑似オペランドスタック領域のスタックIDが記録される。「書込先」には、その履歴に係る操作で値が書き込まれたスタティック変数の変数名、疑似スタティック領域のメモリ領域番号、又は、疑似オペランドスタック領域のスタックIDが記録される。「操作名」には、その履歴に係る操作を行ったメソッドのメソッド名が記録される。なお、解析部103は、インストラクションにより、ファイル、データベース又はSharedPreferences(アプリケーションの設定値を保存するxmlファイル)への書込み、若しくは、ファイル、データベース又はSharedPreferencesからの読込みが行われる場合、「読込先」及び「書込先」に、当該ファイルを特定する情報(ファイルを一意に識別するためのIDなど)、当該データベースを特定する情報(データベースを一意に識別するためのIDなど)、又は、SharedPreferencesを特定する情報(SharedPreferencesを一意に識別するためのIDなど)を記録するようにしてもよい。
ここで、解析部103は、バイトコードを追跡している際にメソッドの呼び出しを検出し、かつ、そのメソッドがAPKファイル内で定義されている場合(つまり、Android(登録商標)の仕様で予め定義されたメソッドではない場合)、メソッド呼出しを検出した時点の疑似ローカル変数領域及び疑似オペランドスタック領域のスナップショットを作成しておき、呼び出されたメソッドに対して、新たにバイトコードの追跡を行う。この場合、当該呼び出されたメソッドに対して、新たな疑似ローカル領域及び疑似オペランドスタック領域が生成されることになる。解析部103は、当該呼び出されたメソッドの追跡が完了すると、上述のスナップショットを用いて疑似ローカル変数領域及び疑似オペランドスタック領域をスナップショット作成時の状態に戻し、元のメソッドのバイトコードの追跡を続ける。
また、解析部103は、バイトコードを追跡している際にif文などの条件分岐を検出した場合、分岐の直前で疑似ローカル変数領域及び疑似オペランドスタック領域のスナップショットを作成しておき、分岐後のバイトコードの追跡が完了した後、スナップショットを用いて疑似ローカル変数領域及び疑似オペランドスタック領域を分岐の直前の状態に戻し、次の分岐についてバイトコードの追跡を行う。解析部103は、これらの動作を全ての分岐に対して繰り返し行うことで、全ての分岐についてバイトコードの追跡を行う。なお、分岐数が多いと処理量が膨大になる可能性があるため、解析部103は、else句が存在しない分岐の場合、又は、解析装置10の利用者により指示された分岐については追跡を行わないようにしてもよい。
解析部103は、以上説明した追跡処理を、「処理始点メソッド一覧」に格納されている全てのメソッドについて行い、追跡結果をメモリ操作履歴に記録していく。
ステップS104で、評価部104は、メモリ操作履歴に記録された各履歴の「操作名」に記録されたメソッド名のうち、「リスク評価情報」に格納されている"特定の情報を変数又はオブジェクトに格納する処理を行うメソッドのメソッド名"と一致するメソッドが存在するか否かを検索する。一致するメソッドが存在する場合、評価部104は、解析対象のアプリケーションは特定の情報(例えば個人情報など)を取得していると判断する。
続いて、評価部104は、一致するメソッドが存在する場合、そのメソッドの履歴の「書込先」に記録されている情報(スタティック変数の変数名、疑似スタティック領域のメモリ領域番号、又は、疑似オペランドスタック領域のスタックID)と同一の情報(スタティック変数の変数名、疑似スタティック領域のメモリ領域番号、又は、疑似オペランドスタック領域のスタックID)が「読込先」に記録されている履歴を特定する。続いて、評価部104は、特定された履歴の「操作名」に記録されているメソッド名の中に、「リスク評価情報」に格納されている"所定の処理を行うメソッドとして予め規定されているメソッド名"と一致するメソッド名が存在するかを検索する。一致するメソッド名が存在する場合、評価部104は、解析対象のアプリケーションは特定の情報(例えば個人情報)を取得し、かつ、取得した特定の情報に対して所定の処理(例えば、ネットワークに送信する処理)を行っている判断する(「リスク大」と判断する)。一方、一致するメソッド名が存在しない場合、評価部104は、解析対象のアプリケーションは特定の情報を取得するが、所定の処理は行っていないと判断する(「リスク中」と判断する)。
<動作例>
続いて、解析装置10がアプリケーションの解析を行う際の具体的な動作例を説明する。図4(a)に、動作例の説明に用いるアプリケーションのソースコードを示す。本アプリケーションは端末の電話番号を画面上に表示するアプリケーションであるが、画面表示前に行われる処理(onCreateメソッド)の中に、端末の電話番号をネットワークに送信する処理が埋め込まれている。図4(b)は、図4(a)に示すソースコードが実行された際の画面表示例を示している。
図4(a)に示すソースコードの左側に付与されている番号(10〜150)は、ソースコードの行を示すために便宜上付与した番号であり、実際のソースコード内には存在しないものである。図4(a)に示すソースコードによれば、アプリケーションの実行が開始された後、端末の画面表示が行われる前に実行される30行目〜100行目までの処理において、20行目の処理で宣言されたスタティック変数「MainActivity.tellNum」に対して、70行目の処理で端末の電話番号が書き込まれ、90行目の処理で電話番号が書き込まれた変数「MainActivity.tellNum」を含むURLの送信が行われる。また、図4(b)に示す「表示」ボタンが押下された際、110〜140行目までの処理が行われることで電話番号が書き込まれた変数「MainActivity.tellNum」が画面上に表示される。
図4(a)に示すソースコードに対応するバイトコードの例を図5に示す。図5(a)は、図4(a)の10行目及び20行目に対応するバイトコードであり、図5(b)は、図4(a)のonClassメソッド(30〜100行目)に対応するバイトコードであり、図5(c)は、図4(a)のonClickメソッド(110〜140行目)に対応するバイトコードである。
以下、図4及び図5を参照しつつ、解析装置10がアプリケーションの解析を行う際の具体的な動作例を説明する。なお、以下の説明では、説明を簡略化するために、端末の電話番号が格納される「疑似スタティック変数領域」の状態のみを示し、「疑似ローカル変数領域」の状態「疑似オペランドスタック変数領域」の状態については省略する。また、バイトコードはアセンブリ言語に近いコードであり一見して内容の把握が難しいことから、動作例の説明に必要なバイトコードに絞りつつ、バイトコードの処理を適宜ソースコードの処理に置き換えて説明する。
まず、解析部103は、「解析対象のクラスファイル(ここでは、図5のバイトコードを含むMainActivityクラスのクラスファイル)」の内容と「処理開始メソッド情報」とを比較することで、解析対象のアプリケーションにおいて処理を開始する起点となるメソッドの一覧を生成し、始点IDと対応づけて「処理始点メソッド一覧」に格納する。図6は、生成された「処理開始メソッド一覧」の具体例を示している。「始点ID」は、例えば1から順に付与され、図6の例では、「MainActivity.onCreate」メソッドの始点IDには「1」が付与され、「MainActivity.onClick」メソッドの始点IDには「2」が付与されている。
続いて、解析部103は、「解析対象のクラスファイル」内でスタティック宣言されている変数を検索し、変数名及び値を「疑似スタティック変数領域」に記録する。具体的には、解析部103は、図5(a)のバイトコードにおいて、アドレス0のインストラクション(ldc)でオペランドスタックにPUSHされた空の文字列""が、アドレス2のインストラクション(putstatic)により、オペランドスタックからスタティック変数「MainActivity.tellNum」にPUTされていることを発見し、変数名「MainActivity.tellNum」と値「""」を「疑似スタティック変数領域」に記録する。図7は、「疑似スタティック変数領域」の具体例を示している。
続いて、解析部103は、「処理始点メソッド一覧」に格納されているメソッドから、始点ID=「1」である「MainActivity.onCreate」を選択し、当該メソッド内に閉じた疑似的なメモリ領域である「疑似ローカル変数領域」及び「疑似オペランドスタック領域」を記憶部101内に生成する。
続いて、解析部103は、「MainActivity.onCreate」メソッドのバイトコードをアドレス順に追跡する。バイトコードのアドレス0〜11までの追跡結果については、本動作例におけるリスク評価には影響しない部分であるため説明は省略する。続いて、解析部103は、ソースコードの60行目に対応するバイトコードのアドレス12及び14のインストラクションを解析する。アドレス12のインストラクション(ldc)は、"phone"をオペランドスタックにPUSHする処理を示している。アドレス14のインストラクション(invokevirtual)は、メソッド「getSystemService」に引数「Ljava/lang/String」(オペランドスタックからPOPされる"phone")を与えて呼び出し、メソッド「getSystemService」の実行結果として返されるオブジェクト「Ljava/lang/Object」をオペランドスタックにPUSHする処理を示している。
解析部103は、バイトコードのアドレス12及び14のインストラクションの解析結果をメモリ操作履歴に格納する。具体的には、アドレス12及びアドレス14のインストラクションの解析結果として、メモリ操作履歴の「操作名」には、呼び出されたメソッドの名称「getSystemService」が記録され、「読込先」には、引数「Ljava/lang/String」としてオペランドスタックからPOPされる"phone"が記録され、「書込先」には、実行結果として返されるオブジェクト「Ljava/lang/Object」が書き込まれるオペランドスタックのスタックID(実際には疑似オペランドスタック領域のスタックID)が記録される。
この時点のメモリ操作履歴の状態を図8(a)に示す。なお、図8(a)は、説明を簡略化するためにソースコードの表現に置き換えてある(以下、図8(b)、図8(c)、図8(d)も同様)。具体的には、「読込先」には、"phone"に相当するソースコード60行目の「TELEPHONY_SERVICE」を記載し、「書込先」には、疑似オペランドスタック領域のスタックIDに代えて、「getSystemService」メソッドの実行結果として返されるオブジェクトに相当するソースコード60行目の「telephonyManager」オブジェクトを記載している。また、図8(a)のメモリ操作履歴では、ノードIDとして便宜上「1」を記載しているが、実際のメモリ操作履歴では、バイトコードのアドレス0〜11までの追跡結果により記録されているノードIDの値に1を加えた値が記録されることになる。
続いて、解析部103は、ソースコードの70行目に対応するバイトコードのアドレス20及び23のインストラクションを解析する。アドレス20のインストラクション(invokevirtual)は、TelephonyManagerクラスのメソッド「getLine1Number」に引数(オペランドスタックからPOPされるtelephonyManagerオブジェクト)を与えて呼出し、メソッド「getLineNumber」の実行結果として返されるオブジェクト「Ljava/lang/String」をオペランドスタックにPUSHする処理を示している。また、アドレス23のインストラクション(putstatic)は、オペランドスタックから文字列をPOPしてスタティック変数「MainActivity.tellNum」にPUSHする処理を示している。
解析部103は、バイトコードのアドレス20及び23のインストラクションの解析結果をメモリ操作履歴に格納する。この時点でのメモリ操作履歴の状態を、説明を簡略化するためにソースコードの表現に置き換えた履歴を図8(b)に示す。「操作名」には、呼び出されたメソッドの名称「telephonyManager.getLine1Number」が記録され、「書込先」には、「telephonyManager.getLine1Number」の実行結果が書き込まれたスタティック変数「MainActivity.tellNum」が記録される。また、「親ノードID」には1つ前の処理のノードID「1」が記録され、「ノードID」には、1つ前の処理のノードIDに1を加えた値「2」が記録される。また、疑似スタティック変数領域の「MainActivity.tellNum」に対応する値が、「""」から「telephonyManager.getLine1Number()」に更新される。なお、疑似スタティック変数領域は、あくまで疑似的な領域であり実際にアプリケーションが実行された結果が格納されるのではないため、実際の端末の電話番号ではなく「telephonyManager.getLine1Number()」が格納されることになる。
続いて、解析部103は、ソースコードの80行目及び90行目に対応するバイトコードのアドレス26〜52のインストラクションを解析する。アドレス26〜52のインストラクションごとの詳細な説明は省略するが、アドレス26〜31のインストラクションでWebViewクラスのオブジェクトを生成し、アドレス34〜49のインストラクションで、文字列"http://xxxx.co.jp/?tell="とスタティック変数「MainActivity.tellNum」の値とを結合し、アドレス52のインストラクション(invokevirtual)で、webViewクラスのオブジェクトの「loadUrl」メソッドに結合した文字列を引数として与えて呼出す動作を示している。
解析部103は、バイトコードのアドレス26〜52のインストラクションの解析結果をメモリ操作履歴に格納する。この時点でのメモリ操作履歴の状態を、説明を簡略化するためにソースコードの表現に置き換えた履歴を図8(c)に示す。「操作名」には、呼び出されたメソッドの名称「webView.loadUrl」が記録され、「読込先」には、メソッド「webView.loadUrl」に引数として与えられたスタティック変数「MainActivity.tellNum」が記録される。また、「親ノードID」には1つ前の処理のノードID「2」が記録され、「ノードID」には、1つ前の処理のノードIDに1を加えた値「3」が記録される。以上で、「MainActivity.onCreate」メソッドのバイトコードの追跡が完了する。
続いて、解析部103は、「処理始点メソッド一覧」に格納されているメソッドから、始点ID=「2」である「MainActivity.onClick」を選択し、当該メソッド内に閉じた疑似的なメモリ領域である「疑似ローカル変数領域」及び「疑似オペランドスタック領域」を記憶部101内に生成する。
続いて、解析部103は、「MainActivity.onClick」メソッドのバイトコードをアドレス順に追跡する。解析部103は、ソースコードの110行目〜130行目に対応するバイトコードのアドレス0〜25のインストラクションを解析する。アドレス0〜25のインストラクションごとの詳細な説明は省略するが、アドレス0及び1のインストラクションでTextViewクラスのオブジェクト「textview」を生成し、アドレス4〜19のインストラクションで、文字列"tel Number:"とスタティック変数「MainActivity.tellNum」の値とを結合し、アドレス22のインストラクション(invokevirtual)で、TextViewクラスのオブジェクトの「setText」メソッドに結合した文字列を引数として与えて呼出す動作を示している。
解析部103は、バイトコードのアドレス0〜25のインストラクションの解析結果をメモリ操作履歴に格納する。この時点でのメモリ操作履歴の状態を、説明を簡略化するためにソースコードの表現に置き換えた履歴を図8(d)に示す。「操作名」には、呼び出されたメソッドの名称「textview.setText」が記録され、「読込先」には、メソッド「textview.setText」に引数として与えられたスタティック変数「MainActivity.tellNum」が記録される。また、「ノードID」には、1つ前の処理のノードIDに1を加えた値「4」が記録される。なお、始点ID=「2」である「MainActivity.onClick」メソッドに関する最初の履歴であるため、「親ノードID」には何も記録されない。以上で、「MainActivity.onClick」メソッドのバイトコードの追跡が完了する。
解析部103によるクラスファイルの解析が完了すると、評価部104は、メモリ操作履歴を検索することでリスク評価を行う。本動作例では、「telephonyManager.getLine1Number」メソッドが"特定の情報を変数又はオブジェクトに格納する処理を行うメソッドのメソッド名"として「リスク評価情報」に格納されている前提とする。また、「webView.loadUrl」メソッドが"所定の処理(例えば、ネットワークに送信する処理)を行うメソッドとして予め規定されているメソッド名"として「リスク評価情報」に格納されている前提とする。
図9は、クラスファイルの解析が完了した時点のメモリ操作履歴の状態を示している。評価部104は、メモリ操作履歴に記録された各履歴の「操作名」に記録されたメソッド名のうち、「リスク評価情報」に格納されている"特定の情報を変数又はオブジェクトに格納する処理を行うメソッドのメソッド名"と一致するメソッドが存在するか否かを検索する。図9の例では、「ノードID」=「2」の履歴の操作名に「telephonyManager.getLine1Number」メソッドが記録されていることから、評価部104は、解析対象のアプリケーションはリスクが高いと判断される情報を取得していると判断する。
続いて、評価部104は、「ノードID」=「2」の履歴で「書込先」に記録されている「MainActivity.tellNum」が「読込先」に記録されている履歴を特定する。図9の例では、「ノードID」=「3」及び「4」の履歴が該当する。続いて、評価部104は、特定された履歴の「操作名」に記録されているメソッド名の中に、「リスク評価情報」に格納されている"所定の処理(例えば、ネットワークに送信する処理)を行うメソッドとして予め規定されているメソッド名"と一致するメソッド名が存在するかを検索する。図9の例では、「ノードID」=「3」の履歴の操作名に「webView.loadUrl」メソッドが記録されていることから、評価部104は、解析対象のアプリケーションは特定の情報(個人情報である電話番号)を取得し、かつ、取得した情報に対して所定の処理(例えば、ネットワークに送信する処理)を行っていると判断する(「リスク大」と判断する)。
以上の解析により判明したスタティック変数「MainActivity.tellNum」の状態遷移を図10に示す。A1は初期状態であり、図7及び図8(a)の状態に対応する。A2は「telephonyManager.getLine1Number」メソッドにより値が書き込まれた状態であり、図8(b)の状態に対応する。A3は「webView.loadUrl」メソッドにより値が参照された状態であり、図8(c)の状態に対応する。A4は「textview.setText」メソッドにより値が参照された状態であり、図8(d)の状態に対応する。
<実施形態の補足>
以上、実施の形態において、解析装置10はクラウドサーバであってもよい。すなわち、図1に示す各機能部は、クラウドサーバ上に実装されるようにしてもよい。
以上、実施の形態に係る解析装置10が有する各機能部は、解析装置10が備えるCPU及びメモリなどのハードウェア資源を用いて、解析装置10で実施される処理に対応するプログラムを実行することによって実現することが可能である。また、当該プログラムは、記憶媒体に格納することができる。また、実施の形態に係る解析装置10は複数のコンピュータ等の組み合わせにより実現されてもよい。
記憶部105は、解析装置10が備えるメモリ又は解析装置10にネットワークを介して接続される記憶装置等を用いて実現可能である。
本発明は、上記の実施の形態に限定されることなく、特許請求の範囲内において、種々変更・応用が可能である。実施の形態で述べたシーケンスは、矛盾の無い限り順序を入れ替えてもよい。
実施の形態において、特定の情報を変数又はオブジェクトに格納する処理を行うメソッドのメソッド名は、「特定の情報を変数又はオブジェクトに格納する処理を行う第一のメソッドの名称」の一例である。所定の処理を行うメソッドとして予め規定されているメソッド名は、「変数又はオブジェクトに対して所定の処理を行う第二のメソッドの名称」の一例である。メモリ操作履歴は、履歴の一例である。
10 解析装置
101 記憶部
102 初期化部
103 解析部
104 評価部

Claims (3)

  1. Java(登録商標)アプリケーションのリスク評価を行う解析装置であって、
    特定の情報を変数又はオブジェクトに格納する処理を行う第一のメソッドの名称と、変数又はオブジェクトに対して所定の処理を行う第二のメソッドの名称とを記憶する記憶手段と、
    解析対象のクラスファイルに含まれるバイトコードを解析し、前記特定の情報が格納された変数又はオブジェクトに対して前記所定の処理が行われるのか否かを追跡することで、前記解析対象のクラスファイルで使用される変数又はオブジェクトに値を書き込むメソッドの名称、及び、前記変数又はオブジェクトに格納された値を読込むメソッドの名称が記録された履歴を生成する、解析手段と、
    前記履歴に記録された前記変数又はオブジェクトに値を書き込むメソッドの名称のうち、前記第一のメソッドの名称と同一であるメソッドにより値が書き込まれた変数又はオブジェクトが抽出されるか否か、及び、抽出された変数又はオブジェクトが前記第二のメソッドの名称と同一の名称のメソッドで読込まれているか否かを検索することで、リスク評価を行う評価手段と、
    を有し、
    前記評価手段は、
    前記履歴に記録された前記変数又はオブジェクトに値を書き込むメソッドの名称のうち、前記第一のメソッドの名称と同一であるメソッドにより値が書き込まれた変数又はオブジェクトが抽出されない場合、前記Java(登録商標)アプリケーションはリスクが低であると評価し、
    前記履歴に記録された前記変数又はオブジェクトに値を書き込むメソッドの名称のうち、前記第一のメソッドの名称と同一であるメソッドにより値が書き込まれた変数又はオブジェクトが抽出され、かつ、前記抽出された変数又はオブジェクトが前記第二のメソッドの名称と同一の名称のメソッドで読込まれていない場合、前記Java(登録商標)アプリケーションはリスクが中であると評価し、
    前記履歴に記録された前記変数又はオブジェクトに値を書き込むメソッドの名称のうち、前記第一のメソッドの名称と同一であるメソッドにより値が書き込まれた変数又はオブジェクトが抽出され、かつ、前記抽出された変数又はオブジェクトが前記第二のメソッドの名称と同一の名称のメソッドで読込まれている場合、前記Java(登録商標)アプリケーションはリスクが高であると評価する、解析装置。
  2. 前記特定の情報は、個人情報であり、
    前記所定の処理は、変数又はオブジェクトに格納された値をネットワークに送信する処理である、
    請求項1に記載の解析装置。
  3. コンピュータを、請求項1又は2に記載の解析装置の各手段として機能させるためのプログラム。
JP2016099308A 2016-05-18 2016-05-18 解析装置及びプログラム Active JP6770335B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2016099308A JP6770335B2 (ja) 2016-05-18 2016-05-18 解析装置及びプログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2016099308A JP6770335B2 (ja) 2016-05-18 2016-05-18 解析装置及びプログラム

Publications (2)

Publication Number Publication Date
JP2017207882A JP2017207882A (ja) 2017-11-24
JP6770335B2 true JP6770335B2 (ja) 2020-10-14

Family

ID=60417207

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2016099308A Active JP6770335B2 (ja) 2016-05-18 2016-05-18 解析装置及びプログラム

Country Status (1)

Country Link
JP (1) JP6770335B2 (ja)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111258797B (zh) * 2020-01-13 2023-04-18 北京字节跳动网络技术有限公司 一种内存泄露的检测方法、装置、介质和电子设备

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP5690689B2 (ja) * 2011-09-16 2015-03-25 Kddi株式会社 アプリケーション解析装置およびプログラム

Also Published As

Publication number Publication date
JP2017207882A (ja) 2017-11-24

Similar Documents

Publication Publication Date Title
KR101944570B1 (ko) 변형 컨텍스트-인식 데이터 소스 관리
Sen et al. Jalangi: A selective record-replay and dynamic analysis framework for JavaScript
US8261244B2 (en) Arbitrary runtime function call tracing
KR102077360B1 (ko) 애플리케이션에 대한 중간 언어 코드로부터 네이티브 코드를 생성하는 기법
US11074154B2 (en) Identifying a source file for use in debugging compiled code
Lin et al. Automated forensic analysis of mobile applications on Android devices
US10048960B2 (en) Identifying source code used to build executable files
TW201807576A (zh) 對用於應用二進位碼的經更新的版本的目標應用功能的虛擬記憶體位址進行更新
US20150199261A1 (en) Classification of JavaScript Code for Debugging using Just My Code
Shahriar et al. Testing of memory leak in android applications
US9317607B2 (en) Executing a fast crawl over a computer-executable application
JP6070847B2 (ja) 検証方法、検証装置および検証プログラム
US8984487B2 (en) Resource tracker
JP2020119348A (ja) 解析プログラム、解析方法および解析装置
Xu et al. A dynamic taint analysis tool for android app forensics
JP5846581B2 (ja) コードを投機的に最適化するための方法、並びにそのコンピュータ及びコンピュータ・プログラム
US8769498B2 (en) Warning of register and storage area assignment errors
JP6770335B2 (ja) 解析装置及びプログラム
Wu et al. CydiOS: A Model-Based Testing Framework for iOS Apps
KR20190020363A (ko) 동적 분석과 정적 분석을 연계한 프로그램을 분석하기 위한 방법 및 장치
US9672020B2 (en) Selectively loading precompiled header(s) and/or portion(s) thereof
JP7380851B2 (ja) テストスクリプト生成装置、テストスクリプト生成方法及びプログラム
JP5728979B2 (ja) 情報処理装置、ソフトウェア検査方法およびソフトウェア検査プログラム
US9898257B2 (en) Automatic probe construction system and method thereof
CN116955209B (zh) WebAssembly虚拟机的测试方法和装置

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20190515

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20200312

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20200324

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20200511

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20200609

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20200803

C60 Trial request (containing other claim documents, opposition documents)

Free format text: JAPANESE INTERMEDIATE CODE: C60

Effective date: 20200803

A911 Transfer to examiner for re-examination before appeal (zenchi)

Free format text: JAPANESE INTERMEDIATE CODE: A911

Effective date: 20200813

C21 Notice of transfer of a case for reconsideration by examiners before appeal proceedings

Free format text: JAPANESE INTERMEDIATE CODE: C21

Effective date: 20200818

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20200901

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20200925

R150 Certificate of patent or registration of utility model

Ref document number: 6770335

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250