以下、実施形態について、添付の図面を参照しながら詳細に説明する。
本発明の実施形態に係る脆弱点探知システムは、以下で説明されるサーバによって実現されてよく、本発明の実施形態に係る脆弱点探知方法は、上述したサーバによって実行されてよい。例えば、サーバにおいては、本発明の一実施形態に係るコンピュータプログラムがインストールおよび実行されてよく、サーバは、実行されるコンピュータプログラムの制御に従って本発明の一実施形態に係る脆弱点探知方法を実行してよい。上述したコンピュータプログラムは、コンピュータで実現されるサーバと結合して脆弱点探知方法をコンピュータに実行させるためにコンピュータ読み取り可能な記録媒体に記録されてよい。
図1は、本発明の一実施形態における、ネットワーク環境の例を示した図である。図1のネットワーク環境は、複数の電子機器110、120、130、140、複数のサーバ150、160、およびネットワーク170を含む例を示している。このような図1は、発明の説明のための一例に過ぎず、電子機器の数やサーバの数が図1のように限定されることはない。
複数の電子機器110、120、130、140は、コンピュータ装置によって実現される固定端末や移動端末であってよい。複数の電子機器110、120、130、140の例としては、スマートフォン、携帯電話、ナビゲーション、PC(personal computer)、ノート型PC、デジタル放送用端末、PDA(Personal Digital Assistant)、PMP(Portable Multimedia Player)、タブレットなどがある。一例として、図1では、電子機器1(110)の例としてスマートフォンを示しているが、本発明の実施形態において、電子機器1(110)は、実質的に無線または有線通信方式を利用し、ネットワーク170を介して他の電子機器120、130、140および/またはサーバ150、160と通信することのできる多様な物理的なコンピュータ装置のうちの1つを意味してよい。
通信方式が限定されることはなく、ネットワーク170が含むことのできる通信網(一例として、移動通信網、有線インターネット、無線インターネット、放送網)を利用する通信方式だけではなく、機器間の近距離無線通信が含まれてもよい。例えば、ネットワーク170は、PAN(personal area network)、LAN(local area network)、CAN(campus area network)、MAN(metropolitan area network)、WAN(wide area network)、BBN(broadband network)、インターネットなどのネットワークのうちの1つ以上の任意のネットワークを含んでよい。さらに、ネットワーク170は、バスネットワーク、スターネットワーク、リングネットワーク、メッシュネットワーク、スター−バスネットワーク、ツリーまたは階層的ネットワークなどを含むネットワークトポロジのうちの任意の1つ以上を含んでもよいが、これらに限定されることはない。
サーバ150、160それぞれは、複数の電子機器110、120、130、140とネットワーク170を介して通信して命令、コード、ファイル、コンテンツ、サービスなどを提供する1つ以上のコンピュータ装置によって実現されてよい。例えば、サーバ150は、ネットワーク170を介して接続した複数の電子機器110、120、130、140に第1サービスを提供するシステムであってよく、サーバ160も、ネットワーク170を介して接続した複数の電子機器110、120、130、140に第2サービスを提供するシステムであってよい。より具体的な例として、サーバ150は、アプリケーションパブリッシャのシステムを構成する装置のうちの少なくとも一部であってよく、複数の電子機器110、120、130、140においてインストールされて実行されるアプリケーションのパッケージファイルが登録されて配布するサービスを第1サービスとして提供してよい。他の例として、サーバ160は、配布されたパッケージファイルによってアプリケーションをインストールおよび実行する複数の電子機器110、120、130、140に、そのアプリケーションと関連するサービスを第2サービスとして提供してよい。実施形態によって、サーバ150は、登録されるパッケージファイルの脆弱点情報を探知するための専用システムを実現するために利用されてもよい。
図2は、本発明の一実施形態における、電子機器およびサーバの内部構成を説明するためのブロック図である。図2では、電子機器に対する例として電子機器1(110)の内部構成と、サーバ150の内部構成を説明する。また、他の電子機器120、130、140やサーバ160も、上述した電子機器1(110)またはサーバ150と同一あるいは類似の内部構成を備えてよい。
電子機器1(110)とサーバ150は、メモリ211、221、プロセッサ212、222、通信モジュール213、223、および入力/出力インタフェース214、224を含んでよい。メモリ211、221は、コンピュータ読み取り可能な記録媒体であって、RAM(random access memory)、ROM(read only memory)、およびディスクドライブのような永続的大容量記録装置を含んでよい。ここで、ROMやディスクドライブのような永続的大容量記録装置は、メモリ211、221とは区分される別の永続的記録装置として電子機器1(110)やサーバ150に含まれてもよい。また、メモリ211、221には、オペレーティングシステムと、少なくとも1つのプログラムコード(一例として、電子機器1(110)においてインストールされて実行されるブラウザや特定のサービスの提供のために電子機器1(110)にインストールされたアプリケーションなどのためのコード)が記録されてよい。このようなソフトウェア構成要素は、メモリ211、221とは別のコンピュータ読み取り可能な記録媒体からロードされてよい。このような別のコンピュータ読み取り可能な記録媒体は、フロッピードライブ、ディスク、テープ、DVD/CD−ROMドライブ、メモリカードなどのコンピュータ読み取り可能な記録媒体を含んでよい。他の実施形態において、ソフトウェア構成要素は、コンピュータ読み取り可能な記録媒体ではない通信モジュール213、223を通じてメモリ211、221にロードされてもよい。例えば、少なくとも1つのプログラムは、開発者またはアプリケーションのインストールファイルを配布するファイル配布システム(一例として、上述したサーバ160)がネットワーク170を介して提供するファイルによってインストールされるコンピュータプログラム(一例として、上述したアプリケーション)に基づいてメモリ211、221にロードされてよい。
プロセッサ212、222は、基本的な算術、ロジック、および入出力演算を実行することにより、コンピュータプログラムの命令を処理するように構成されてよい。命令は、メモリ211、221または通信モジュール213、223によって、プロセッサ212、222に提供されてよい。例えば、プロセッサ212、222は、メモリ211、221のような記録装置に記録されたプログラムコードに従って受信される命令を実行するように構成されてよい。
通信モジュール213、223は、ネットワーク170を介して電子機器1(110)とサーバ150が互いに通信するための機能を提供してもよいし、電子機器1(110)および/またはサーバ150が他の電子機器(一例として、電子機器2(120))または他のサーバ(一例として、サーバ160)と通信するための機能を提供してもよい。一例として、電子機器1(110)のプロセッサ212がメモリ211のような記録装置に記録されたプログラムコードに従って生成した要求が、通信モジュール213の制御に従ってネットワーク170を介してサーバ150に伝達されてよい。これとは逆に、サーバ150のプロセッサ222の制御に従って提供される制御信号や命令、コンテンツ、ファイルなどが、通信モジュール223とネットワーク170を経て電子機器1(110)の通信モジュール213を通じて電子機器1(110)に受信されてよい。例えば、通信モジュール213を通じて受信されたサーバの制御信号や命令、コンテンツ、ファイルなどは、プロセッサ212やメモリ211に伝達されてよく、コンテンツやファイルなどは、電子機器1(110)がさらに含むことのできる記録媒体(上述した永続的記録装置)に記録されてよい。
入力/出力インタフェース214は、入力/出力装置215とのインタフェースのための手段であってよい。例えば、入力装置は、キーボードまたはマウスなどの装置を、出力装置は、ディスプレイやスピーカなどのような装置を含んでよい。他の例として、入力/出力インタフェース214は、タッチスクリーンのように入力と出力のための機能が1つに統合された装置とのインタフェースのための手段であってもよい。入力/出力装置215は、電子機器1(110)と1つの装置で構成されてもよい。また、サーバ150の入力/出力インタフェース224は、サーバ150と連結するか、サーバ150が含むことのできる入力または出力のための装置(図示せず)とのインタフェースのための手段であってよい。より具体的な例として、電子機器1(110)のプロセッサ212がメモリ211にロードされたコンピュータプログラムの命令を処理するにあたり、サーバ150や電子機器2(120)が提供するデータを利用して構成されるサービス画面やコンテンツが、入力/出力インタフェース214を経てディスプレイに表示されてよい。
また、他の実施形態において、電子機器1(110)およびサーバ150は、図2の構成要素よりも多くの構成要素を含んでもよい。しかし、大部分の従来技術的構成要素を明確に図に示す必要はない。例えば、電子機器1(110)は、上述した入力/出力装置215のうちの少なくとも一部を含むように実現されてもよいし、トランシーバ、GPS(Global Positioning System)モジュール、カメラ、各種センサ、データベースなどのような他の構成要素をさらに含んでもよい。より具体的な例として、電子機器1(110)がスマートフォンである場合、一般的にスマートフォンが含んでいる加速度センサやジャイロセンサ、カメラモジュール、物理的な各種ボタン、タッチパネルを利用したボタン、入力/出力ポート、振動のための振動器などのような多様な構成要素が電子機器1(110)にさらに含まれるように実現されてよい。
図3は、本発明の一実施形態における、保安性評価システムのブロックダイヤグラムである。図3の保安性評価システム300は、上述したサーバ150によって実現されてよく、上述した脆弱点探知システムは、保安性評価システム300に含まれるように実現されても、または保安性評価システム300で脆弱点を探知するための構成だけを別に含むように実現されてもよい。
保安性評価システム300が含むパッケージ分解モジュール310、ファイル識別モジュール320、パーシングモジュール330、分析モジュール340、およびレポートモジュール350は、サーバ150が含むプロセッサ222の互いに異なる機能(different functions)の表現であってよい。例えば、サーバ150のプロセッサ222が、コンピュータプログラムが含む制御命令に従ってパッケージファイルを分解するプロセッサ222の機能として、パッケージ分解モジュール310が利用されてよい。このとき、分析モジュール340に含まれる脆弱点探知モジュール342が、脆弱点探知のための核心モジュールとして実現されてよい。
上述したように、サーバ150は、開発者が登録するアプリケーションのパッケージファイルを利用者に配布するサービスを提供する。
このとき、パッケージ分解モジュール310は、登録されたパッケージファイルを分解してよい。例えば、アンドロイドアプリケーションパッケージ(Android Application Package:APK)は、モバイルオペレーティングシステムであるアンドロイドのソフトウェアと、ミドルウェア配布に使用されるパッケージファイルのファイルフォーマットとして「.apk」拡張子を有する。以下の実施形態では、このようなAPKのようなパッケージファイルを基盤として本発明の実施形態を説明するが、このような説明から、他の種類のパッケージファイルにも同一または類似の特徴が適用可能であることは、当業者であれば容易に理解できるであろう。
また、APKは周知の事項であるため、APKファイルまたはAPKファイルが含むファイル自体に関する説明も、当業者であれば周知の従来技術から容易に理解できるはずであり、したがって、APKファイルまたはAPKファイルが含むファイル自体の詳しい説明については省略する。
ファイル識別モジュール320は、分解されたパッケージファイルに含まれるファイルを識別してよい。図3に示した拡張子(「dex」、「so」、「dll」、「json」、「ini」、「apk」、「xml」、「cert」)は、上述したように、APKと関連する従来技術から、当業者であれば容易に理解できるであろう。
パーシングモジュール330は、識別されたファイルをパースする。このために、パーサ331は、識別されたファイルのうち特定の拡張子(一例として、「dex」、「so」、「dll」)のファイルをパースしてよく、コレクタ332は、特定の拡張子(一例として、「json」、「ini」、「apk」、「xml」、「cert」)のファイルから必要な情報を収集してよい。
例えば、パーシングモジュール330は、「dex」ファイルが含むクラス(class)とメソッド(method)それぞれを識別してよく、メソッドが含むインストラクション(命令(instruction))を追跡し、多数のマス(mass)に区分して識別してよい。インストラクションのマスは、「goto」文や「switch」文、または「if」文などのような分岐命令を基準として区分されてよい。また、パーシングモジュール330は、このようなインストラクションマス間の呼び出し関係に関する情報を生成して管理してよい。一例として、インストラクションマス間の呼び出し関係はツリー構造で管理されてよく、呼び出し関係に関する情報は、特定のインストラクションマスが呼び出すメソッドに関する情報を含んでよい。このような情報の生成および管理は、APKファイルのようなパッケージファイルが含むファイルそれぞれに対して処理されてよく、ファイルの特性によってパーシング方式が異なってよい。
パースされた情報と収集された情報は、分析モジュール340に伝達されてよい。
分析モジュール340は、パーシングモジュール330から伝達される情報に基づき、該当のパッケージファイル(または、該当のパッケージファイルによって電子機器1(110)のような利用者端末においてインストールおよび実行されるアプリケーション)に対する難読化(obfuscation)観点、脆弱点(vulnerability)観点、および保安ソリューション観点での分析情報を生成および提供してよい。
例えば、難読化探知モジュール341は、特定の拡張子(一例として、「dex」、「so」、「dll」)のファイルにどのくらいの水準の難読化が適用されているかに関する分析情報を生成してよい。このために、難読化探知モジュール341は、ファイルの種類によって予め設定される項目別に難読化が適用されているかを判断してよい。
また、脆弱点探知モジュール342は、特定の拡張子(一例として、「dex」、「so」、または設定(configuration)ファイルの拡張子である「config」)のファイルに、どのような脆弱点があるかに関する分析情報を生成してよい。このために、保安性評価システム300は、既に知られた脆弱点に関する情報を管理してよく、脆弱点探知モジュール342は、このような脆弱点に関する情報を利用してどのようなファイルにどのような脆弱点が存在するかに関する分析情報を生成してよい。
また、プラットフォーム探知モジュール343は、該当のアプリケーションが開発されたプラットフォームおよび/または該当のアプリケーションが動作するプラットフォームに関する情報を抽出してよい。例えば、保安性評価システム300は、該当のアプリケーションがどのようなプラットフォーム(一例として、ユニティ(Unity)やココス(Cocos)のような開発ツール)で開発されたかに応じて互いに異なる分析方式を活用してよい。
または、保安性評価システム300は、アプリケーションが動作するプラットフォームごとにパッケージファイルが含むファイルフォーマットが異なることがあるため、このようなプラットフォームごとに互いに異なる分析方式を活用してもよい。
このために、保安性評価システム300は、パッケージファイルのプラットフォームに関する情報を抽出してよく、このような情報に基づいてパッケージファイルを分析するか、または抽出されたプラットフォームに関する情報を外部に提供してよい。
保安ツール探知モジュール344は、パッケージファイルの開発者が自主的にパッケージファイルに挿入した保安ソリューションを探知してよい。例えば、第三者によってライブラリ形態で提供される第1保安ツールが、開発者によって該当のパッケージファイルに追加されることがある。他の例として、開発者が自ら開発した第2保安ツールが、開発者によって該当のパッケージファイルに追加されることもある。言い換えれば、保安ツール探知モジュール344は、このような保安ツールのパッケージファイルが適用されているかに関する分析情報を生成してよい。
関係分析モジュール345は、パッケージファイルが含むファイル間の参照関係に関する分析情報を生成してよい。例えば、第1ファイルが第2ファイルを呼び出すためのコードを含んでいる場合、第1ファイルと第2ファイルとの参照関係に関する情報が分析情報に含まれるように分析情報が生成されてよい。
レポートモジュール350は、分析モジュール340で生成される分析情報を収集し、保安性評価システム300の関係者(一例として、サーバ150の管理者またはアプリケーションパブリッシャの保安検査チーム)に提供するための報告書を生成してよい。このような報告書は、図3に示すように、HTML(Hypertext Markup Language)やXML(eXtensible Markup Language)を利用して関係者の端末に提供されてよい。
図4は、本発明の一実施形態における、インストラクションマス間の呼び出し関係を説明するための図である。図4は、1つのメソッドA(Method A)400に対し、ルートマス(Root Mass)410、インストラクションマス1(Instruction Mass 1)420、インストラクションマス2(430)、インストラクションマス3(440)、およびインストラクションマス5(450)のような5つのインストラクションマスが識別された例を示している。上述したように、インストラクションマスは、分岐命令を基準として区分されてよく、インストラクションマスそれぞれをノードと仮定するとき、図4において、点線矢印は、特定のノードの親ノードを指している。例えば、図4は、インストラクションマス3(440)の親ノードがインストラクションマス1(420)であることを示している。ここで、子ノードは、親ノードが含む分岐命令に従って区分されるインストラクションのマスを含んでよい。ルートマス410は、メソッドA(400)に対して最初に実行されるインストラクションのマスであってよい。
より具体的な例として、図4は、インストラクションマス1(420)が条件分岐(conditional branch)421のための命令を含み、条件に従ってインストラクションマス3(440)またはインストラクションマス4(450)の命令が実行されると仮定する。このとき、インストラクションマス3(440)とインストラクションマス4(450)が識別され、インストラクションマス3(440)とインストラクションマス4(450)の親ノードは、インストラクションマス1(420)となる。また、条件分岐421のための命令に従い、インストラクションマス3(440)に移動される位置がラベル1(Lable 1)441によって、インストラクションマス4(450)に移動される位置がラベル2(Lable2)451によって、それぞれ指示される。言い換えれば、インストラクションマス1(420)で呼び出しが探知されると、探知された呼び出しに従って呼び出されるインストラクションマス440、450は、ラベル441、451によって指示されるのである。図4では、実線によってこのような指示関係を示した。
図5は、本発明の一実施形態における、メソッド間の呼び出し関係を説明するための図である。図5は、呼び出し参照に関する情報510とメソッドa520を示している。メソッドa520は、少なくとも1つのインストラクションマスを含んでよく、図5では、1つのインストラクションマス521を示している。
このとき、図5では、インストラクションマス521でメソッドb511とメソッドc512に対する呼び出しが探知された例を示している。メソッドは、それぞれ固有のメソッドIDによって識別されてよい。本実施形態に係る脆弱点探知システムは、探知された呼び出しに従い、呼び出し参照に関する情報510からメソッドa520のメソッドIDを利用してメソッドb511とメソッドc512に関する情報を取得してよい。
ここで、メソッドb511とメソッドc512に関する情報は、それぞれ、図4を参照しながら説明したように、呼び出されたメソッドb511とメソッドc512それぞれに対するインストラクションマスに関する情報、またはインストラクションマス間の参照関係に関する情報などを含んでよい。したがって、脆弱点探知システムは、該当のファイルによるプログラムの実行制御がどのような方法で動いているかの把握が可能となる。
図6は、本発明の一実施形態における、ルールおよびパターンを説明するための図である。図6は、本実施形態に係るルール(Rule)600の構造の例を説明している。本実施形態において、ルール600は、既に知られている脆弱点のうちのいずれか1つに対応し、該当の脆弱点を探知するための探知パターンに関する情報を含んでよい。
図6において、「名称(Name)」項目610は、該当のルール600の名称を含んでよく、「説明(Description)」項目620は、該当のルール600に関する詳しい説明を含んでよい。例えば、該当のルール600がどのような脆弱点に対するものかに関する説明情報を含んでよい。また、「ガイド(Guide)」項目640は、該当のルール600の使用と関連する行動原理や指針に関する情報を含んでよい。
また、「優先順位(Priority)」項目630は、該当の脆弱点に対する危険性等級に関する情報を含んでよい。例えば、「クリティカル(Critical)」、「ワーニング(Warning)」、「ノーマル(Normal)」のような3つの危険性等級のうちの1つの等級に対する値が「優先順位(priority)」項目630に含まれてよい。このような危険性等級は、2つの等級や4つ以上の等級でも設定可能であることが明らかである。
また、「依存性(Dependency)」項目650は、脆弱階層の実際の脆弱性を動的に決定しなければならない条件が存在するかを示してよい。例えば、1つの脆弱点に対する危険性が条件に応じて異なる場合が存在する。例えば、脆弱点aが、条件1では「クリティカル(Critical)」な危険性等級を有するのに反し、条件2では「ノーマル(Normal)」な危険性等級を有するか、または危険性がまったくない場合も存在する。したがって、このような条件別の差を区分するために、「依存性(Dependency)」項目650は、条件に関する情報と条件別の危険性等級に関する情報を含んでよい。または、単に、このような条件が存在するかに関する情報だけを含んでもよい。
以上で説明したルール600の項目は、実施形態によって選択的にルール600に含まれて活用されてよい。
「パターン(Pattern)」項目660は、脆弱点探知のための1つ以上の探知パターンを含んでよい。探知パターンは予め設定されてよく、1つのルール600は、脆弱点探知のための1つの探知パターンを含んでもよいし、2つ以上の探知パターンの組み合わせを含んでもよい。探知パターンは、少なくとも1つの命令で実現されてよく、少なくとも1つの命令それぞれは、パラメータを有するメソッドやクラスの形態で実現されてよい。パラメータは、予め設定されてもよいし、他のパターンによって抽出される値で動的に設定されてもよい。
図7は、本発明の一実施形態における、パターンの構造を説明するための図である。
ルールテーブル(rule_tbl)710は、設定されたルールに関する情報を含んでよい。「rule_id(pk)」は、設定されたルールのうちで主識別子(primary key、pk)に対応するルールを意味してよい。このような実際には「rule_id(pk)」は、主識別子pkをパラメータとして受け、対応するルールの識別子を返還する関数を意味してよい。「name(key)」は、キー(key)に対応するルールの名称を意味してよい。このような「name(key)」も、実際にはキー(key)をパラメータとして受け、対応するルールの名称を返す関数を意味してよい。このように、図7において、「x(y)」は、「y」が入力された関数「x」を意味してよいが、「y」に対応する「x」を意味するものと説明する。「pattern_hash(fk)」は、外部識別子(foreign key、fk)に対応するパターンのハッシュ値を意味してよい。さらに、「説明(description)」、「優先順位(priority)」、「ガイド(guide)」、「依存性(dependency)」はそれぞれ、図6を参照しながら説明した「説明(Description)」項目620、「優先順位(Priority)」項目630、「ガイド(Guide)」項目640、および「依存性(Dependency)」項目650に対応する値を意味してよい。「pattern_hash(key)」は、キーに対応するパターンのハッシュ値を意味してよい。脆弱点探知システムは、ルールテーブル710を利用して必要なルールに関する情報を得てよく、得られたルールに含まれるパターンの識別子としてパターンのハッシュ値を取得してよい。
パターンテーブル(pattern_tbl)720は、設定されたパターンに関する情報を含んでよい。「pattern_id(pk)」は主識別子(primary key、pk)に対応するパターンを、「rule_id(pk)」は外部識別子(foreign key、fk)に対応するルールを、それぞれ意味してよい。また、「ソース(source)」は、パターンのソースに関する情報を意味してよい。例えば、パターンのソースは、APKのようなパッケージファイルで探索されるファイルの種類を示してよい。「テーブルタイプ(table_type)」は返されるパターンのタイプに関する情報を、「ジョインパターン(join_pattern)」は該当のパターンと結合して1つのルールを構成する他のパターンに関する情報を、「join_type(and/or/sub)」はパターンがどのようなタイプで結合されるかに関する情報を、それぞれ意味してよい。ここで、「and」、「or」、および「sub」は、以下で表19を参照しながら説明するように、パターンの組み合わせのための論理演算子を意味してよい。脆弱点探知システムは、ルールテーブル710から得られるルールに関する情報に基づいて該当のルールが含むパターンを識別してよく、パターンテーブル720から該当のルールが含むパターンに関する情報を得てよい。
デックスファイルテーブル(pattern_data_dex_find_api)730は、APKのデックスファイルから抽出される情報を含んでよい。「pattern_id(fk)」は、設定されたパターンのうちで外部識別子(foreign key:fk)に対応するパターンを意味してよい。「呼び出されたクラス名(called_class_name)」は呼び出しされるクラス名を識別するための値を、「呼び出されたメソッド名(called_method_name)」は呼び出しされるメソッド名を識別するための値を、それぞれ意味してよい。「enable_tracing_argument(optional)」は追跡可能な引数(argument)を返す関数を、「argument_index(optional)」は引数のインデックスを返す関数を、「引数タイプ(argument_type)」は返される引数のタイプを、それぞれ意味してよい。「argument_from_null_detect(true/false)」はヌル(null)引数を探知するか否かを、「argument_from_null_except(true/false)」はヌル(null)引数を例外にするか否かを、それぞれ意味してよい。また、デックスファイルテーブル730は、探知されたAPIリストからの引数(argument_from_detect_api_list)、例外処理されたAPIリストからの引数(argument_from_except_api_list)、探知されたフィールドリストからの引数(argument_from_detect_field_list)、および例外処理されたリストからの引数(argument_from_except_list)に関する情報を含んでよい。脆弱点探知システムは、パターンによって脆弱点探知に必要な情報を探知するにあたり、デックスファイルテーブル730を参照してよい。例えば、脆弱点探知システムは、特定のインストラクションマスに対する脆弱点を探知するにあたり、該当のインストラクションマスから呼び出すメソッドやクラスを、デックスファイルテーブル730を利用して識別してよい。
ファイルテーブル(pattern_data_retrieve_file_tbl)740は、パッケージファイルが含む特定のファイルの情報を抽出するパターン情報を含んでよい。「pattern_id(fk)」は、設定されたパターンのうちで外部識別子(foreign key、fk)に対応するパターンを意味してよく、「pattern_hash(key)」は、キーに対応するパターンのハッシュ値を意味してよい。「ファイルタイプ(file_type)」はパターンによって検索されるファイルのタイプを、「ファイル拡張子(file_extension)」はパターンによって検索されるファイルの拡張子を、「ファイル名(file_name)」はパターンによって検索されるファイル名を、それぞれ意味してよい。
コンテンツテーブル(pattern_data_retrieve_file_contents_tbl)750は、ファイルに含まれる文字を抽出するパターン情報を含んでよい。「pattern_id(fk)」は、設定されたパターンのうちで外部識別子(foreign key、fk)に対応するパターンを意味してよく、「pattern_hash(key)」は、キーに対応するパターンのハッシュ値を意味してよい。「ファイルタイプ(file_type)」はパターンによって検索されるファイルのタイプを、「文字タイプ(character_type)」は文字(または文字列)のタイプを、「文字(character)」はファイルで検索しようとする文字(または文字列)を、それぞれ意味してよい。
パーミッションテーブル(pattern_data_retrieve_permission_tbl)760は、パッケージファイルのパーミッション(permission)情報を抽出するパターン情報を含んでよい。「pattern_id(fk)」は、設定されたパターンのうちで外部識別子(foreign key、fk)に対応するパターンを意味してよく、「名称(name)」は、パーミッションの名称を意味してよい。
アクティビティテーブル(pattern_data_retrieve_activity_tbl)770は、アクティビティ情報を抽出するパターン情報を含んでよい。「pattern_id(fk)」は、設定されたパターンのうちで外部識別子(foreign key、fk)に対応するパターンを意味してよく、「名称(name)」は、アクティビティの名称を意味してよい。ここで、アクティビティとは、ユーザインタフェースがある1つの画面を意味するものであって、一例として、APKからアクティビティクラス(activity class)を継承して実現されてよい。このように、上述したアクティビティやパーミッションなどの用語は、当業者であれば、APKに対する従来の技術から容易に理解できるであろう。
SDKテーブル(pattern_data_retrieve_min_sdk)780は、SDK(Software Development Kit)に関する情報を抽出するパターン情報を含んでよい。「pattern_id(fk)」は、設定されたパターンのうちで外部識別子(foreign key、fk)に対応するパターンを意味してよく、「バージョン(version)」はSDKのバージョン情報を、「バージョン探知条件(conditional_equality)」はバージョンの探知条件を、それぞれ意味してよい。例えば、「バージョン(version)」が「21」に設定され、「バージョン探知条件(conditional_equality)」が「小さいか同じ」である場合、バージョンが21以下の場合に該当のSDKのバージョンが探知されてよい。
図8は、本発明の一実施形態における、パターンのソースを説明するための図である。ルール600が含むパターン660のソースは、APKのようなパッケージファイルの特定のファイルであってよい。図8では、パターン660が、パッケージファイルが含む任意のファイル(Any files)810、デックスファイル(dex)820、アンドロイドマニフェストファイル(AndroidManifest.xml)830、soファイル(so)840、またはdllファイル(dll)850をソースとして有することを示している。
図9は、本発明の一実施形態における、任意のファイルに対するパターンの例を示した図である。図9は、任意のファイル810に対するパターン900の種類を示している。
第1種類910のパターンは、ファイルから特定の文字(または文字列)を探索するパターンを意味してよく、以下のパターン1のように表現されてよい。
[パターン1]
RetrieveFileContents:
: FileType(string) CharacterType(string) Character(string)
例えば、JSON(JavaScript(登録商標) Object Notation)ファイルからURL(Uniform Resource Locator)を探索するパターンは、「RetrieveFileContents:FileType(json)CharacterType(string)Character(http://*)」のように実現されてよい。言い換えれば、上述したパターンの例は、ファイルに含まれるコンテンツを検索するパターンであって、「json」タイプのファイルから「string」タイプの文字列として「http://*」を探索しろという命令を意味してよい。このようなパターン「RetrieveFileContents」において、ファイルタイプ「FileType()」のパラメータは、「all」、「apk」、「txt」、「ini」、「property」、「json」、「xml」、「img」、「mp4」などのようなファイル拡張子に基づいて予め設定された値のうちで予め設定されてもよいし、動的に設定されてもよい。ここで、ファイルタイプ「all」は、すべての拡張子のファイルを意味してよい。また、キャラクタタイプ「CharacterType()」のパラメータは、「string」、「hexa」などのように文字や文字列の種類を意味してよい。「Character()」のパラメータは、検索しようとする文字列を意味してよく、*は、*よりも前の文字列から始まるすべての文字列を意味してよい。
第2種類920のパターンは、パッケージファイル内から特定のファイルを探索するパターンを意味してよく、以下のパターン2のように表現されてよい。
[パターン2]
RetrieveFile:
: FileType(string) FileName(string)
例えば、パッケージファイルが含むファイルのうちから、DLL(Dynamic Linking Library)タイプを有してファイル名が「Assembly−Csharp」であるファイルを探索するパターンは、「RetrieveFile:FileType(string)FileName(Assembly−Csharp)」のように実現されてよい。他の例として、パッケージファイルが含むファイルのうちからDLLタイプのファイルを探索するパターンは、「RetrieveFile:FileType(string)」のように実現されてよい。
ファイルタイプ「FileType()」のパラメータは、「all」、「apk」、「txt」、「ini」、「property」、「json」、「xml」、「img」、「mp4」などのようなファイル拡張子に基づいて設定された値のうちで予め設定されてもよいし、動的に設定されてもよい。ファイル名「FileName()」のパラメータも、予め設定されてもよいし、動的に設定されてもよい。必要に応じて、ファイル拡張子を基準としてファイルを探索するための「FileExtension()」がさらに利用されてもよく、「FileExtension()」のパラメータも、予め設定されてもよいし、動的に設定されてもよい。
図10は、本発明の一実施形態における、ファイルから特定の文字列を探知した結果とパッケージファイルから特定のファイルを探知した結果の例を示した図である。
探知された情報1010は、第1種類910のパターンによって探知されたファイル名(File name)1011とマッチングストリング(Match string)1012を含むことを示している。上述した図9において、「json」タイプのファイルが3つ存在する場合、3つのファイルそれぞれで「string」タイプの文字列として「http://*」が探索されてよく、探知された文字列がファイル名別に提供されてよい。1つの「json」ファイルが複数のURLを含む場合、複数の文字列が探知されてよい。
また、探知された情報1020は、第2種類920のパターンによってパッケージファイルから探知されたファイル名(File name)1021を含むことを示している。この場合にも、パターンによって複数のファイル名が探索されてよい。
図11は、本発明の一実施形態における、アンドロイドマニフェストファイルに対するパターンの例を示した図である。図11は、アンドロイドマニフェストファイル(AndroidManifest.xml)830に対するパターン1100の種類を示している。
第3種類1110のパターンは、アンドロイドマニフェストファイル830からパーミッション(permission)グループを探索するパターンを意味してよく、以下のパターン3のように表現されてよい。
[パターン3]
RetrievePermission:
: Name(string or *)
例えば、パターン「RetrievePermission:Name(*)」に対する探知結果として「android.permission.GET_TASKS」および「android.permission.INTERNET」のようなパーミッションが提供されてよい。他の例として、パターン「RetrievePermission:Name(android.permission.READ_EXTERNAL_STORAGE)」のように、特定のパーミッション名によって該当の名称のパーミッションが検索されてもよい。特定のパーミッションと関連する脆弱点が分かっていれば、該当のパーミッションが存在するかを探索するためのパターンが予め設定されてよく、設定されたパターンに基づいて脆弱点探知が実行されてよい。以下で説明するパターンでも、共通するファクタは共通する役割を含んでよい。
第4種類1120のパターンは、アンドロイドマニフェストファイル830からアクティビティ(activity)グループを探索するパターンを意味してよく、以下のパターン4のように表現されてよい。
[パターン4]
RetrieveActivity:
: Name(string or *)
第5種類1130のパターンは、アンドロイドマニフェストファイル830から最小SDK APIバージョンを探索するパターンを意味してよく、以下のパターン5のように表現されてよい。
[パターン5]
RetrieveMinSDK:
: Version(string or *)
: ConditionalEquality
バージョン「Version()」のパラメータは、所望するバージョンの値がストリングタイプとして動的に設定されるか、またはすべてのバージョンを意味する「*」が活用されてよい。また、比較条件を意味する「ConditionalEquality」は、等号や不等号を利用し、バージョン「Version()」で設定された値とアンドロイドマニフェストファイルに設定されたSDK APIバージョンとの比較のために活用されてよい。例えば、「RetrieveMinSDK:Version(21)ConditionalEquality(<=)」は、バージョン21以下の場合を探知するパターンを意味してよい。
第6種類1140のパターンは、アンドロイドマニフェストファイル830からターゲットSDK APIバージョンを探索するパターンを意味してよく、以下のパターン6のように表現されてよい。
[パターン6]
RetrieveTargetSDK:
: Version(string or *)
: ConditionalEquality
バージョン「Version()」と比較条件を意味する「ConditionalEquality」は、パターン6と共通されてよい。
第7種類1150のパターンは、アンドロイドマニフェストファイル830からメインアプリケーション(main application)を探索するパターンを意味してよく、以下のパターン7のように表現されてよい。
[パターン7]
RetrieveMainApplication:
: Name(string or *)
第8種類1160のパターンは、アンドロイドマニフェストファイル830からサービスグループを探索するパターンを意味してよく、以下のパターン8のように表現されてよい。
[パターン8]
RetrieveService:
: Name(string or *)
第9種類1170のパターンは、アンドロイドマニフェストファイル830からレシーバグループを探索するパターンを意味してよく、以下のパターン9のように表現されてよい。
[パターン9]
RetrieveReceiver:
: Name(string or *)
第10種類1180のパターンは、アンドロイドマニフェストファイル830からプロバイダグループを探索するパターンを意味してよく、以下のパターン10のように表現されてよい。
[パターン10]
RetrieveProvider:
: Name(string or *)
アンドロイドマニフェストファイル830から探索されるパーミッション、アクティビティ、最小SDK APIバージョン、ターゲットSDK APIバージョン、メインアプリケーション、サービス、レシーバ、プロバイダは、当業者であれば、APKに対する周知の従来技術から容易に理解できるであろう。
図12は、本発明の一実施形態における、デックスファイルに対するパターンの例を示した図である。図12は、デックスファイル(dex)820に対するパターン1200の種類を示している。
第11種類1210のパターンは、呼び出されたAPIを探索するパターンを意味してよく、以下のパターン11のように表現されてよい。
[パターン11]
DexFindApi:
: DexCalledAPI (require)
: ClassName, MethodName
: DexTraceArgument (optional)
: ArgumentIndex(number)
: ArgumentType(string)
: DexArgumentFrom (optional)
: Exceptional(true/false)
: FromNull
: List: FromAPIList
:ClassName, MethodName
: List: FromFieldList
:ClassName, MethodName
ここで、「DexFindApi」は、呼び出されたAPIを探索するパターンのパターン名を意味してよい。また、「DexCalledAPI」は、特定クラスの特定メソッドを指定するためのファクタを意味してよい。このようなクラスとメソッドは、「ClassName」および「MethodName」によって指定されてよい。また、「DexTraceArgument」は、特定インデックスおよび/または特定タイプの引数(argument)を指定するためのファクタを意味してよい。さらに、「DexArgumentFrom」は、例外処理の可否を決定したり、ヌル(null)からの引数を探知したり、または特定APIリストやフィールドリストを指定したりするためのファクタを意味してよい。
以下の表1はインストラクションマスの第1例を、表2はパターンの第1例を、それぞれ示している。
表2のパターンは、クラス「Liavax/net/ssl/SSLContext」のメソッド「init」を呼び出すAPIを探索するパターンを意味してよい。この場合、脆弱点探知システムは、該当のパターンに基づき、表1のインストラクションマスからクラス「cfindMe」のメソッド「mfindMe」が該当のメソッド「init」を呼び出すことを探知してよく、探知結果として「called from cfindMe−>mfindMe」のようなメッセージを提供してよい。
以下の表3はインストラクションマスの第2例を、表4はパターンの第2例を、それぞれ示している。
表4のパターンは、クラス「Liavax/net/ssl/SSLContext」のメソッド「init」を呼び出すAPIを探索してメソッド「init」のインデックス「2」のタイプ「Ljavax/net/ssl/TrustManager」の引数を追跡するが、ここで、ApiListに指定されたクラス「Ljavax/net/ssl/TrustManagerFactory」とメソッド「getTrustManagers」に対しては例外(true)として扱うパターンを意味してよい。
表3を詳しく見ると、クラス「Liavax/net/ssl/SSLContext」のメソッド「init」を呼び出すAPIは、クラス「cfindMe」のメソッド「mfindMe」であり、メソッド「init」のインデックス「2」のタイプ「Ljavax/net/ssl/TrustManager」の引数が「tm」であることが分かる。しかし、クラス「Ljavax/net/ssl/TrustManagerFactory」のメソッド「getTrustManagers」に対しては例外処理をするため、引数「tm」やクラス「cfindMe」のメソッド「mfindMe」は、探知されずに例外処理されてよい。
以下の表5はインストラクションマスの第3例を、表6はパターンの第3例を、それぞれ示している。
表6のパターンは、クラス「Liavax/net/ssl/SSLContext」のメソッド「init」を呼び出すAPIを探索してメソッド「init」のインデックス「2」の引数を追跡するが、ここで、ヌル(null)からの引数であるかを探索するパターンを意味してよい。
表5のインストラクションマスを詳しく見ると、クラス「Liavax/net/ssl/SSLContext」のメソッド「init」を呼び出すAPIは、クラス「cfindMe」のメソッド「mfindMe」であり、メソッド「init」のインデックス「2」の引数がヌル(null)であることが分かる。したがって、「DexCalledAPI」によってクラス「cfindMe」のメソッド「mfindMe」が該当のメソッド「init」を呼び出すことを探知することができ、「DexTraceArgument」および「DexArgumentFrom」によってヌル(null)からの引数がメソッド「init」のインデックス2に存在することを探知することができる。このとき、探知結果として「called from cfindMe−>mfindMe」メッセージおよび「argument from null」メッセージが提供されてよい。
以下の表7はインストラクションマスの第4例を、表8はパターンの第4例を、それぞれ示している。
表8のパターンは、クラス「System」のメソッド「loadLibrary」を呼び出すAPIを探索してメソッド「loadLibrary」のインデックス「1」の引数を追跡するパターンを意味してよい。
表7のインストラクションマスによると、クラス「System」のメソッド「loadLibrary」を呼び出すAPIは、クラス「C」のメソッド「m」であることが分かる。このとき、メソッド「loadLibrary」のインデックス「1」の引数は「str」であり、引数「str」はメソッド「m」を呼び出すクラス「A」のメソッド「init」において「xxx」であり、クラス「C」のメソッド「m」において「xx」が「append」されることが分かる。このような引数「str」に対する追跡は、上述したように、予め生成および管理されるメソッド間の呼び出し関係を利用してなされてよい。
このとき、パターンに対する探知結果は、以下の表9のメッセージのように提供されてよい。
「called from C−>m」は、クラス「System」のメソッド「loadLibrary」を呼び出すAPIがクラスCのメソッドmであることを示してよい。「argument str is string」は、引数「str」のタイプが「string」であることを示してよい。また、「str+=“xx”」は、表7のメソッド「str.append(“xx”);」によって引数「str」に「xx」が加えられることを意味してよい。さらに、str=input(parameter)は、引数「str」がパラメータ「input」として伝達されたことを意味してよく、「Parameter is“xxx”in A−>init」伝達されたパラメータ「input」は、クラス「A」のメソッド「init」において「xxx」であることを意味してよい。したがって、クラス「System」のメソッド「loadLibrary」のインデックス「1」の引数である「str」は現在、「string」タイプの値「xxxxx」を有することが分かる。
以下の表10はインストラクションマスの第5例を、表11はパターンの第5例を、それぞれ示している。
表11のパターンは、クラス「Liavax/net/ssl/SSLContext」のメソッド「init」を呼び出すAPIを探索してメソッド「init」のインデックス「2」の引数を追跡するが、このとき、「FromFieldList」によって指定されるフィールドに対しては例外処理をしないパターンを意味してよい。
表10のインストラクションマスによってクラス「Liavax/net/ssl/SSLContext」のメソッド「init」を呼び出すAPIがクラス「cfindMe」のメソッド「mfindMe」であることが分かり、メソッド「init」のインデックス「2」の引数が「tm」であることが分かる。
このとき、クラス「Lorg/apache/http/conn/ssl/SSLSocketFactory」のフィールド「ALLOW_ALL_HOSTNAME_VERIFIER」は例外処理をしないため、クラス「Liavax/net/ssl/SSLContext」のメソッド「init」を呼び出すAPIがクラス「cfindMe」のメソッド「mfindMe」であることを知らせるためのメッセージ(一例として、「called from cfindMe−>mfindMe」)が探知結果として提供されてよく、メソッド「init」のインデックス「2」の引数「tm」がフィールド「SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER」からの引数であることを知らせるためのメッセージ(一例として、「argument from SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER」)が探知結果としてさらに提供されてよい。
図12を再び参照すると、第12種類1220のパターンは、メソッドの特定インストラクションを探索するパターンを意味してよく、以下のパターン12のように表現されてよい。
[パターン12]
DexMethodBody :
: MethodName (require)
: MethodName
: DexInstructionList (require)
: List<DexInstruction>
: Except(true/false)
: DexInstruction
: VoidBody
: InvokeInstruction
: ClassName(string)
: MethodName(string)
ここで、「DexMethodBody」は、特定のメソッド内で特定のインストラクションを探索するためのパターンであることを意味してよい。また、「MethodName」は、メソッドを指定するためのファクタを意味してよい。また、「DexInstructionList」は、探知するためのインストラクションを特定するためのファクタを意味してよい。例えば、「List<DexInstruction>」は、探知するためのインストラクションを指定するために利用されてよく、「Except(true/false)」は、指定されたインストラクションを例外処理するかを決定するために利用されてよい。さらに、「VoidBody」は、voidタイプのインストラクションを指定するために利用されてよく、「InvokeInstruction」は、呼び出しされるインストラクションを指定するために利用されてよい。
以下の表12はインストラクションマスの第6例を、表13はパターンの第6例を、それぞれ示している。
表13のパターンは、メソッド「checkServerTrusted」がvoidタイプであるか否かを確認するパターンを意味してよい。表12のインストラクションマスにおいて、メソッド「checkServerTrusted」はvoidタイプとして宣言されているため、メソッド「checkServerTrusted」がvoidタイプであることを知らせるためのメッセージ(一例として、「Body is void」)が提供されてよい。
以下の表14はインストラクションマスの第7例を、表15はパターンの第7例を、それぞれ示している。
表15のパターンは、メソッド「checkServerTrusted」からメソッド「Ljava/security/cert/CertificateException」を呼び出すインストラクションとメソッド「Ljava/lang/IllegalArgumentException」を呼び出すインストラクションを探索するパターンを意味してよい。表14のインストラクションマスと関連し、メソッド「Ljava/security/cert/CertificateException」を呼び出すインストラクションが存在することが分かる。したがって、メソッド「Ljava/security/cert/CertificateException」を呼び出すインストラクションが探知されたことを知らせるためのメッセージ(一例として、「Invoke instruction isdetected、CertificateException−><init>」)が提供されてよい。
上記で簡単に説明したように、パターンは結合(join)されてよい。例えば、パターン「DexFindApi」を利用して特定のクラス「a」を探索した後、パターン「DexMethodyBody」を利用してクラス「a」のメソッドから特定のインストラクションを探索してよい。例えば、1つのルールにこのような2つのパターンが結合されて含まれてよい。
図12を再び参照すると、第13種類1230のパターンは、特定のクラスの子クラスを探索するパターンを意味してよく、以下のパターン13のように表現されてよい。
[パターン13]
DexFindSubClass :
: DexParent (require)
: ClassName(string)
ここで、「DexFindSubClass」は、特定のクラスの子クラスを探索するパターン名を意味してよい。「DexParent」は、探索しようとする子クラスの親クラスを指定するためのファクタを意味してよい。
以下の表16はインストラクションマスの第8例を、表17はパターンの第8例を、それぞれ示している。
表17は、クラス「IamYourFather」を親にもつ子クラスを探索するためのパターンを意味してよい。表16のインストラクションマスと関連し、クラス「cfindMe」とクラス「csearchMe」はそれぞれ、クラス「IamYourFather」の子ノードであるため、クラス「cfindMe」とクラス「csearchMe」がそれぞれ探知されてよく、探知されたクラス「cfindMe」とクラス「csearchMe」を知らせるためのメッセージが提供されてよい。
パターン間の結合(join)は、より多様に活用されてよい。例えば、パターン「DexFindSubClass」を利用してクラス「a」を親にもつ子クラス「b」を探索した後、探知されたクラス「b」をパターン「DexFindApi」における「ClassName(b)」のように動的パラメータとして活用してよい。
図13は、本発明の一実施形態において、soファイルに対するパターンの例を示した図である。図13は、soファイル840に対するパターン1300の種類を示している。
第14種類1310のパターンは、soファイル840からストリング(特定の文字列)を検索するパターンを意味してよく、以下のパターン14のように表現されてよい。
[パターン14]
RetrieveSoContents :
: Character(string)
ここで、パターン「RetrieveSoContents」は、soファイル840からストリングを検索するパターン名を意味してよく、「Character(string)」は、soファイル840から検索しようとする特定のストリング(一例として、「http://*」のような文字列)を指定するためのファクタを意味してよい。このとき、ストリングは、soファイル840が含む「.rdata」セクションから検索されてよい。
第15種類1320のパターンは、soファイル840からAPIを検索するパターンを意味してよく、以下のパターン15のように表現されてよい。
[パターン15]
RetrieveApiContents :
: APIType(iat) Name(strcpy)
ここで、パターン「RetrieveApiContents」は、soファイル840からAPIを検索するパターン名を意味してよく、「APIType()」は、APIのタイプをIAT(Import Address Table)とEAT(Export Address Table)のうちの1つに設定するためのファクタを、「Name()」は、検索しようとするAPIの名称を指定するためのファクタを、それぞれ意味してよい。
図14は、本発明の一実施形態における、dllファイルに対するパターンの例を示した図である。図14は、dllファイル850に対するパターン1400の種類を示している。
第16種類1410のパターンは、dllファイル850からストリング(特定の文字列)を検索するためのパターンを意味してよく、以下のパターン16のように表現されてよい。
[パターン16]
RetrieveDllContents :
: Character(string)
ここで、パターン「RetrieveDllContents」は、dllファイル850からストリングを検索するパターン名を意味してよく、「Character(string)」は、dllファイル850から検索しようとする特定のストリング(一例として、「http://*」のような文字列)を指定するためのファクタを意味してよい。
パターンにおいて、パラメータは、上述したように動的に決定されてよい。例えば、パターンaとパターンbとの結合により、パターンaによって抽出される値がパターンbのためのパラメータとして動的に活用されてよい。
上述したパターン1〜16は、APKのための一実施形態であって、他のパッケージファイルのためには他のパターンが活用されてよい。脆弱点探知システムは、このようなパターンを登録するか、登録されたパターンを編集することのできるエディタ機能を管理者や利用者に提供してよい。例えば、アプリケーションに対する新たな脆弱点が分かった場合、新たに分かった脆弱点を探知できるようにエディタ機能を利用して新たなパターンが登録されてよく、脆弱点探知システムは、新たなパターンに基づいてアプリケーションのパッケージファイルを分析して脆弱点を探知してよい。
さらに他の実施形態において、パターンの種類は、以下の表18のように示されてよい。
表18のパターンのうち、パターン「dex(find_api)」は、上述したパターン11「DexFindApi」に対応してよい。このようなパターン「dex(find_api)」は、メソッド内で指定されたapiの呼び出しを探知するためのパターンであってよい。
また、パターン「dex(find_sub)」は、上述したパターン13「DexFindSubClass」に対応してよく、指定されたクラスの相続を受けて実現した子クラスを探知するために利用されてよい。
また、パターン「dex(method_body)」は、上述したパターン12「DexMethodBody」に対応してよく、aptjem内のインボークインストラクション(invoke instruction)、インストラクションの個数、メソッド名などを比較および探知するために利用されてよい。
また、パターン「dex(method_annotation)」は、Javaでメソッドに指定された注釈(annotation)を探知するために利用されてよい。
また、パターン「dex(exist_api)」は、特定のクラスおよび/またはメソッドが存在するかを探索するために利用されてよい。例えば、以下で説明する論理演算を利用したパターンの組み合わせを利用する場合、パターン組み合わせ(dex(exist_api)sub dex(find_api))は、左側パターンである「dex(exist_api)」によって探索されたクラスを対象に、右側パターンである「dex(find_api)」によって指定されたapi呼び出しを探索してよい。
また、パターン「dex(exist_field)」は、特定のクラスのメンバーが存在するかを探索するために利用されてよい。例えば、パターン「dex(exist_field)」は、「クラス−>メンバー名」のような形態の値を該当のメンバーの値と比べる正規表現式を指定することにより、指定された正規表現式に該当するメンバーが探索されてよい。
また、パターン「manifest」は、AndroidManifest.xmlの項目との比較のために利用されてよい。
さらに、パターン「xml」、「so」、「dll」、「find_file」はそれぞれ、xmlファイル、soファイル、dllファイル、およびすべてのファイルで探索を実行するために利用されてよい。例えば、dllファイルで探索を実行する例については、パターン16(RetrieveDllContents)を参照しながら詳しく説明したとおりである。
また、パターンは、論理演算と括弧を利用して組み合わされて活用されてもよい。例えば、以下の表19は、パターンの組み合わせのために活用可能な論理演算の例を示している。
例えば、(パターンA or パターンB)でパターンAが探知されると、既に「true」であるため、パターンBに対する探知は実行されないことがある。また、(パターンA sub パターンB)でパターンAが「false」であれば、パターンBに対する探知は実行されないことがある。このような論理演算を利用したパターンの組み合わせに対するより具体的な例として、パターン組み合わせ(dex(find_sub_class)sub dex(find_api))が挙げられる。該当のパターン組み合わせでは、左側のパターン「dex(find_sub_class)」によってすべてのアクティビティの子を探索するようになり、左側のパターンによって探索されたクラスが、右側パターンのためのクラスに利用されてよい。言い換えれば、右側パターン「dex(find_api)」は、左側パターンによって探索されたクラスでapiを探索するようになる。
図15は、本発明の一実施形態における、サーバのプロセッサが含むことのできる構成要素の例を示したブロック図であり、図16は、本発明の一実施形態における、サーバが実行することのできる脆弱点探知方法の例を示したフローチャートである。
本発明の実施形態に係る脆弱点探知システムは、上述したサーバ150のようなコンピュータ装置の形態で実現されてよい。また、図15に示すように、サーバ150のプロセッサ222は、脆弱点探知システムを実現するための構成要素として、探知パターン管理部1510、パッケージファイル登録部1520、および脆弱点情報探知部1530を含んでよい。このようなプロセッサ222およびプロセッサ222の構成要素は、図16の脆弱点探知方法が含む段階1610〜段階1630を実行してよい。このとき、プロセッサ222およびプロセッサ222の構成要素は、メモリ221が含むオペレーティングシステムのコードと、少なくとも1つのプログラムのコードとによる制御命令(instruction)を実行するように実現されてよい。ここで、プロセッサ222の構成要素は、サーバ150に記録されたコードが提供する制御命令に従ってプロセッサ222によって実行される、プロセッサ222の互いに異なる機能(different functions)の表現であってよい。例えば、プロセッサ222が上述した制御命令に従って探知パターンを管理するプロセッサ222の機能的表現として、探知パターン管理部1510が使用されてよい。
段階1610において、探知パターン管理部1510は、アプリケーションのインストールおよび実行のためのパッケージファイルに含まれるファイルと、ファイルに含まれるコードのうちの少なくとも一方に関連し、アプリケーションの脆弱点診断のための予め設定された探知パターンを管理してよい。探知パターンについては、詳しい実施形態を参照しながら上述したとおりであり、脆弱点によってさらに多様な実施形態が導き出されてもよいことは、当業者であれば、上述した実施形態から容易に理解できるであろう。
このとき、探知パターン管理部1510は、段階1610で新たな探知パターンを登録するか、または登録された探知パターンを編集するためのエディタ機能を提供し、提供されたエディタ機能を利用して登録または編集された探知パターンに関する情報を記録および管理してよい。エディタ機能は、一例として、特定のウェプページの形態や特定のアプリケーションの形態で脆弱点探知システムの管理者や利用者に提供されてよい。例えば、管理者の端末にインストールされる特定のアプリケーションによって管理者の端末と脆弱点探知システムとが通信してよく、特定のアプリケーションで登録または編集される探知パターンに対する情報は、ネットワークを介して脆弱点探知システムに送信されてよい。このとき、探知パターン管理部1510は、新たな探知パターンを登録するか、または編集された探知パターンを更新してよい。
上述した実施形態では、パターンが含むファクタのパラメータが予め設定されてもよいが、必要に応じて動的に決定されてもよいことを説明したし、パラメータが動的に決定可能であることにより、さらに多様な方式で探知パターンが実現されることについて説明した。
段階1620において、パッケージファイル登録部1520は、アプリケーションのインストールおよび実行のために利用者に配布するためのパッケージファイルを登録してよい。サーバ150は、上述したように、脆弱点探知システムが含まれる形態で実現されてよい。例えば、アプリケーションパブリッシャのシステムと脆弱点探知システムとが結合された形態でサーバ150が実現されてよい。このとき、パッケージファイルは、アプリケーションパブリッシャが利用者に配布するために開発者側から提供を受けて登録されてよい。
このとき、登録されるパッケージファイルにおいてそれぞれのファイルが識別されてよく、クラスとメソッドが識別されてよい。また、メソッドそれぞれは、分岐命令(分岐文)を基準としてインストラクションマスの形態で区分されてよく、インストラクションマス間の呼び出し関係および/またはメソッド間の呼び出し関係は、ツリー構造のようなデータ構造の形態で記録および管理されてよい。このような呼び出し関係に関する情報は、引数(argument)の追跡や呼び出されたAPIなどを検索するために活用されてよい。
段階1630において、脆弱点情報探知部1530は、探知パターンのうちの少なくとも1つの探知パターンによって登録されたパッケージファイルを分析し、少なくとも1つの探知パターン別に脆弱点情報を探知してよい。このような脆弱点情報の探知については、多様な実施形態を参照しながら詳しく上述したとおりである。このとき、脆弱点情報探知部1530は、複数の探知パターンを結合(join)し、第1探知パターンによって登録されたパッケージファイルから探知された第1情報を、第2探知パターンが含むファクタのパラメータとして動的に設定し、探知された第1情報がパラメータとして設定されたファクタを含む第2探知パターンによって登録されたパッケージファイルから脆弱点情報を探知してよい。
探知パターンは、登録されたパッケージファイルが含むファイルのうちの少なくとも1つのファイルから特定の文字列を検索するパターンを含んでよい。例えば、上述したパターン1、パターン14、およびパターン16は、ファイルから特定の文字列(またはストリング)を検索するパターンについて説明している。特に、パターン1は、登録されたパッケージファイルが含むファイルのうちで特定のタイプのファイルを指定するためのファクタを含むことを説明した。
また、探知パターンは、登録されたパッケージファイルが含むファイルのうちで特定のタイプのファイルおよび特定のファイル名のファイルのうちの少なくとも1つを検索するためのパターンを含んでよい。例えば、上述したパターン2は、指定されたタイプのファイルおよび/または指定されたファイル名のファイルを検索するためのパターンについて説明している。
また、探知パターンは、APK(Android application package)が含むアンドロイドマニフェストファイルからパーミッション(permission)を検索するためのパターン、アクティビティ(activity)を検索するためのパターン、SDK(Software Development Kit)API(Application Programming Interface)バージョンを検索するためのパターン、メインアプリケーション(main application)を検索するためのパターン、サービスを検索するためのパターン、レシーバ(receiver)を検索するためのパターン、およびプロバイダ(provider)を検索するためのパターンのうちの少なくとも1つのパターンを含んでよい。このようなパターンは、パターン3〜10を参照しながら詳しく説明したとおりである。
また、探知パターンは、指定されたクラスと指定されたメソッドのうちの少なくとも一方から呼び出されたAPIを検索するパターンを含んでよい。このとき、呼び出されたAPIを検索するためのパターンは、クラスとメソッドのうちの少なくとも一方を指定するファクタ、指定されたメソッドの引数(argument)を追跡するために前記引数のインデックスとタイプのうちの少なくとも一方を指定するファクタ、および指定されたメソッドの引数に対して指定されたAPI、指定されたフィールド、およびヌル(null)のうちの少なくとも1つから伝達された引数を探知するためにAPI、フィールドおよびヌル(null)のうちの少なくとも1つを指定するファクタのうちの少なくとも1つのファクタを含んでよい。このようなパターンについては、パターン11を参照しながら詳しく説明したとおりである。
また、探知パターンは、指定されたメソッドから指定されたインストラクションを検索するパターンを含んでよい。このとき、特定のインストラクションを検索するためのパターンは、検索するインストラクションを指定するファクタ、検索するインストラクションのタイプを指定するファクタ、および検索するインストラクションが呼び出すクラスとメソッドを指定するファクタのうちの少なくとも1つのファクタを含んでよい。このようなパターンについては、パターン12を参照しながら詳しく説明したとおりである。
また、探知パターンは、指定されたクラスの子クラスを検索するパターンおよび/または登録されたパッケージファイルが含むファイルのうちの少なくとも1つのファイルからAPIを検索するパターンを含んでよい。このようなパターンについては、パターン13およびパターン15を参照しながら詳しく説明したとおりである。
以上のように、本発明の実施形態によると、アプリケーションの脆弱点(vulnerability)を診断するための探知パターンを予め設定し、設定された探知パターンに基づき、配布のために登録されるアプリケーションのパッケージファイルの脆弱点を探知することができる。
上述したシステムまたは装置は、ハードウェア構成要素、ソフトウェア構成要素、またはハードウェア構成要素とソフトウェア構成要素との組み合わせによって実現されてよい。例えば、実施形態で説明された装置および構成要素は、例えば、プロセッサ、コントローラ、ALU(arithmetic logic unit)、デジタル信号プロセッサ、マイクロコンピュータ、FPGA(field programmable gate array)、PLU(programmable logic unit)、マイクロプロセッサ、または命令を実行して応答することができる様々な装置のように、1つ以上の汎用コンピュータまたは特殊目的コンピュータを利用して実現されてよい。処理装置は、オペレーティングシステム(OS)およびOS上で実行される1つ以上のソフトウェアアプリケーションを実行してよい。また、処理装置は、ソフトウェアの実行に応答し、データにアクセスし、データを記録、操作、処理、および生成してもよい。理解の便宜のために、1つの処理装置が使用されるとして説明される場合もあるが、当業者は、処理装置が複数個の処理要素および/または複数種類の処理要素を含んでもよいことが理解できるであろう。例えば、処理装置は、複数個のプロセッサまたは1つのプロセッサおよび1つのコントローラを含んでよい。また、並列プロセッサのような、他の処理構成も可能である。
ソフトウェアは、コンピュータプログラム、コード、命令、またはこれらのうちの1つ以上の組み合わせを含んでもよく、思うままに動作するように処理装置を構成したり、独立的または集合的に処理装置に命令したりしてよい。ソフトウェアおよび/またはデータは、処理装置に基づいて解釈されたり、処理装置に命令またはデータを提供したりするために、いかなる種類の機械、コンポーネント、物理装置、仮想装置、コンピュータ記録媒体または装置に具現化されてよい。ソフトウェアは、ネットワークによって接続されたコンピュータシステム上に分散され、分散された状態で記録されても実行されてもよい。ソフトウェアおよびデータは、1つ以上のコンピュータ読み取り可能な記録媒体に記録されてよい。
実施形態に係る方法は、多様なコンピュータ手段によって実行可能なプログラム命令の形態で実現されてコンピュータ読み取り可能な媒体に記録されてよい。コンピュータ読み取り可能な媒体は、プログラム命令、データファイル、データ構造などを単独でまたは組み合わせて含んでよい。媒体に記録されるプログラム命令は、実施形態のために特別に設計されたものであっても、コンピュータソフトウェアの当業者に公知されて使用可能なものであってもよい。コンピュータ読み取り可能な記録媒体の例には、ハードディスク、フロッピーディスク、および磁気テープのような磁気媒体、CD−ROMおよびDVDのような光媒体、フロプティカルディスク(floptical disk)のような光磁気媒体、およびROM、RAM、フラッシュメモリなどのような、プログラム命令を記録して実行するように特別に構成されたハードウェア装置が含まれる。このような記録媒体は、単一または複数のハードウェアが結合された状態の多様な記録手段または格納手段であってよく、あるコンピュータシステムに直接に接続される媒体に限定されることはなく、ネットワーク上に分散存在するものであってもよい。プログラム命令の例には、コンパイラによって生成されるもののような機械語コードだけではなく、インタプリタなどを使用してコンピュータによって実行される高級言語コードを含む。
以上のように、実施形態を、限定された実施形態および図面に基づいて説明したが、当業者であれば、上述した記載から多様な修正および変形が可能であろう。例えば、説明された技術が、説明された方法とは異なる順序で実行されたり、かつ/あるいは、説明されたシステム、構造、装置、回路などの構成要素が、説明された方法とは異なる形態で結合されたりまたは組み合わされたり、他の構成要素または均等物によって対置されたり置換されたとしても、適切な結果を達成することができる。
したがって、異なる実施形態であっても、特許請求の範囲と均等なものであれば、添付される特許請求の範囲に属する。