Android アプリのマルウェア検出のための
理解駆動型プログラム分析∗

Suresh Kothari1

Tom Deering1

Ben Holland1

Ahmed Tamrawi1

Akshay Deepak1

Sandeep Krishnan1

Damanjit Singh1

Vani Bojja1

Ganesh Santhanam1

Jeremías Sauceda2

Jon Mathews2

Nikhil Ranade2

1Department of Electrical and Computer Engineering
Iowa State University, Ames, Iowa 50010

2ENSOFT
Ames, Iowa 50010

概要—本論文は、DARPA Automated Program Analysis for Cybersecurity(APAC)プログラムの支援を受けた我々の最近の研究の取り組みを紹介する。これは Iowa State University を主契約機関、EnSoft Corp を下請けとする 42 か月のプロジェクトである。目標は、DoD の Android ベースのモバイルアプリケーションマーケットプレイスに悪意あるコードが入らないようにするための手法とツールを開発することである。DoD ではアプリケーションマーケットプレイスを立ち上げる複数のプログラムが進行中であり、商業分野でも最近そのようなマーケットプレイスが数多く設立されていることから、この技術には明白かつ現実の需要があり、技術移転の道筋も数多くある。

DARPA APAC プログラムの Red チームは、Blue チームが開発しているマルウェア検出技術の限界を試すために、高度なマルウェアの設計に取り組んでいる。DARPA APAC プログラムの Blue チームである我々の研究グループは、Android アプリのソースまたは Java バイトコードが与えられたときにマルウェアを検出する「ヒューマン・イン・ザ・ループのプログラム分析」手法を提案した。我々のマルウェア検出装置は二つの構成要素からなる。Atlas と呼ばれる汎用のグラフィカルなプログラム分析プラットフォームと、Atlas プラットフォーム上に構築された Android 固有のセキュリティツールボックスである。我々のプロジェクトチームは、Iowa State University の PI、研究科学者 1 名、ポスドク 3 名、大学院生 4 名と、EnSoft の Co-PI およびシニアエンジニア 2 名からなる。

∗ 本資料は、契約番号 FA8750-12-2-0126 のもとで DARPA が支援した研究に基づく。米国政府は、著作権表示にかかわらず、政府の目的のために別刷りを複製し配布する権限を有する。

目次

I. はじめに

Android はスマートフォン用オペレーティングシステムで 80% の市場シェアを占め1、Android ベースのスマートフォンで動作するユーザーアプリケーション(「アプリ」)は 100 万を超える。Public Intelligence2 が公表した報告によれば、2012 年のモバイル脅威の 79% が Android を標的としていた。Android アプリの高度なマルウェアを検出するこの研究は、Defense Advanced Research Projects Agency(DARPA)の Automated Program Analysis for Cybersecurity(APAC)プログラム3の支援を受けている。APAC プログラムの目標は、Android アプリのマルウェアを検出する手法とツールを開発することである。

1 http://www.idc.com/getdoc.jsp?containerId=prUS24257413

2 http://info.publicintelligence.net/DHS-FBI-AndroidThreats.pdf

3 http://www.darpa.mil/Our_Work/I2O/Programs/Automated_Program_Analysis_for_Cybersecurity_(APAC).aspx。我々は契約番号 FA8750-12-2-0126 のもとで支援を受けている。

DARPA APAC プログラムが対象とするのは高度なマルウェア、特に内部脅威から生じる複雑なマルウェアである。DARPA APAC プログラムの Red チームは、Blue チームが開発しているマルウェア検出技術の限界を試すために、そのようなマルウェアの設計に取り組んでいる。高度なマルウェアは大きく三つの分類に分けられる。(a) 機密性の漏洩(例えば GPS 位置が敵対者に漏洩する)、(b) 完全性の侵害(例えば特定の条件下で誤った GPS 位置が表示される)、(c) サービス拒否(例えばマルウェアがループを実行してバッテリーを消耗させる)である。高度なマルウェアは通常、散在し巧妙に隠された部分を含むため、それをつなぎ合わせるには手続き間のデータフロー解析と制御フロー解析が必要である。例えば、機密情報の漏洩先となる敵対者の Web サイトの URL は、アプリ内の異なる場所に隠された散在する文字列連結操作によって組み立てられることがある。

II. 研究上の課題

根本的な課題は、豊かで複雑な Android のランタイムの意味論を考慮して、マルウェアを検出するスケーラブルで正確な解析手法を設計することである。ほかにも多くの研究上の課題がある。例えば、解析は、アプリケーション間およびアプリケーション内の通信に広く用いられる Android の Intent システムによって、パーミッションがどのように扱われるかという複雑さを考慮しなければならない。一部の Intent は、適切なパーミッションを持つアプリケーションからしか送信できない。

ここでは二つの研究上の課題を取り上げる。これらは、静的解析を用いるもの [1], [2], [3], [4], [5], [6], [7], [8] や動的解析を用いるもの [9], [10] を含む、Android アプリのマルウェアを検出する現在の研究の慣行とは別に、新たな破壊的イノベーションを必要とする重要な課題である。

A. 不明瞭な手続き間フロー

制御フローが間接的に、すなわち明示的に定義されたメソッドの呼び出しによらずに変更されるとき、それを不明瞭な手続き間フローと呼ぶ。さらに、目に見えるプログラミング機構(例えばリフレクションや動的ディスパッチ)を伴うかどうかに応じて、それを可視または不可視と呼ぶ。不可視の不明瞭なフローは非同期処理によって生じる。不明瞭なフローは、プログラム表現グラフにおいて制御フローまたはデータフローのエッジとして直接観測できないため、分析者にとって時間のかかる課題となる。実際、マルウェアは二つ以上の協調するアプリ間のフローを通じて実行されるため、一つのアプリケーションでは完全に観測できないことがある。

Android は、モバイルアプリの開発を容易にするために豊かで複雑な意味論を取り入れている。特に、Android の意味論には非同期処理を支える意味論が含まれる。例えば、AsyncTask クラスを使うと、スレッドやハンドラを操作することなく、バックグラウンド操作を行って結果を UI スレッドに公開できる。不明瞭なフローの別の例は Android の Intent4 である。Android において Intent オブジェクトは、別の Android コンポーネント(Activity、Service、Broadcast Receiver)への制御と情報の移転を、明示的にも暗黙的にも合図するために用いられるメッセージパッシング機構である。

4 http://developer.android.com/reference/android/content/Intent.html

課題: 解析は、不明瞭なフローをできる限り正確に解決しなければならない。特に、解析は Android API を通るフローによる隔たりを埋めなければならない。

B. 人間の労力の最小化

現在のマルウェア検出は 2 パスで行われる。(1) 第 1 パス(機械): 検出ツールが自動的に動作し、マルウェアの可能性の集合を報告する。(2) 第 2 パス(人間): 分析者が手作業で偽陽性を選り分ける。結果は、機械が検出して人間が検証した脆弱性か、機械が検出して人間が棄却した脆弱性のいずれかである。機械が人間にとって理解しやすいよい証拠を生成しない限り、人間による検証は多大な労力を要するものになりうる。さらに、偽陰性を最小化するため、自動解析は過大近似を行い、検出漏れよりも誤警報の側に倒れる。全体として、機械の結果を検証する人間の労力は非常に大きくなりえ、このパラダイムは大規模なソフトウェアにスケールしない。

もう一つの深刻な問題は、自動解析の視野に入っていない、アプリケーション固有のマルウェアの可能性を仮定し、洗練し、想定する際に、人間が機械から何の助けも得られないことである。

課題: 人間の労力を最小化するため、検出システムは次を提供しなければならない。(a) 人間によい証拠を提供することで、自動的に検出されたマルウェアの相互検証を支援する。(b) アプリケーション固有のマルウェアの可能性を仮定し、洗練し、想定するための what-if 実験を人間が行うのを補助する。

III. 技術的手法

上述の重要な課題に、我々の手法は次のように対処する。

A. 人間の労力を最小化するヒューマン・イン・ループの連携

図 ??(b) に示すように、我々は 2 パス方式とは対照的に、密に結合したヒューマン・イン・ループの連携を持つ。

我々の手法は、EnSoft が開発した Query-Model-Refine(QMR)プラットフォームを取り入れている。これは、密に結合したヒューマン・イン・ループの手法に必要なツールの仕組みを提供する。

パネル 1(a) は既存の 2 パス方式で、アプリから静的解析器と人間による検証を経て結果に至る。パネル 1(b) は、どちらも Atlas 上に構築されたセキュリティツールボックスと QMR の間をループしてから結果に至る。
図 1: 2 パス方式と反復的な改良

データベース言語 SQL と同様に、このプラットフォームは合成可能なクエリ言語を提供する。これは対話的に用いることも、Java プログラムにスクリプトとして埋め込んで、プログラムを解析するプログラムを作ることもできる。クエリ言語があるため、ユーザーは静的解析の低水準の詳細から解放され、より高水準の意味論におけるマルウェア検出戦略に労力を集中できる。「モデル」と「改良」の機能はクエリ言語と連動し、大規模なソフトウェアの効果的な抽象を作ることで人間の理解を助ける。人間と機械は、ソフトウェアグラフとそのようなグラフに対するクエリを媒介として意思疎通する。解析結果と裏付けとなる証拠は、コンパクトなグラフィカルな可視化によって提示される。

人間は利用可能な証拠を用いて、さらなる機械支援の推論を行うために労力を的に絞れるため、我々の手法は人間の労力を大幅に最小化できる。人間は機械が提供する対話的な what-if 実験の機能に助けられるため、自動解析器の視野に入っていないマルウェアを検出する機会が大きくなる。したがって、2 パス方式と比べて、我々の手法は自動化を高め、人間の労力と誤りを減らし、スケーラビリティを高めることができる。研究の進展とともに、我々はこれらの利点を実証的な実験によって科学的に定量化する。

B. 不明瞭なフローのモデル化

我々は、不明瞭なフローを解決するさまざまな手法を開発している。ここではそのような手法の一つを要約する。我々は、不明瞭なフローを特徴付ける 3 イベントのモデルを持つ。イベントは (i) セットアップ、(ii) ソース、(iii) デスティネーションである。このモデルは、BroadcastReceiver5、AsyncTask6、Handler7 といった Android で出会うさまざまな不明瞭なフローに適用できる。

5 http://developer.android.com/reference/android/content/BroadcastReceiver.html

6 http://developer.android.com/reference/android/os/AsyncTask.html

7 http://developer.android.com/reference/android/os/Handler.html

以下では、AsyncTask の不明瞭なフローをソースイベントとデスティネーションイベントを用いてどのようにモデル化できるかを要約する。次の節で、リスト 1 に示す具体的なコード例で説明する。

ソースイベント(8 行目)では、AsyncTask.execute() がオブジェクト Task(型は WriteTask、すなわち AsyncTask のインスタンス)に対して呼び出される。これは実行をデスティネーションイベント(15 行目)、すなわちクラス Task のメソッド doInBackground() へ非同期に移す。論理的には、不明瞭なフローは次のように特定し接続できる。

1) ソースイベントを特定する。すなわち AsyncTask.execute() のすべての呼び出しであり、Ie として保存する。

2) 各 ie ∈ Ie について、呼び出し ie が行われる被呼び出しオブジェクトを特定する(リスト ?? の 8 行目のように)。

3) (i) ステップ 2 の ie(ソースイベント)と、(ii) ステップ 2 の ie に対応する被呼び出しオブジェクトのクラスにあるメソッド doInBackground()(デスティネーションイベント)によって表される不明瞭なフローを接続する。

C. 不明瞭なフローの例

この例は、(a) Android の AsyncTask による非同期処理の不明瞭なフローと、(b) 自動的に検出されたマルウェアを裏付けるために機械が生成する証拠の例を示す。この証拠は、不明瞭なフローを解決し、それをプログラムグラフに明示的に組み込むことで作成され、機密情報が不明瞭なフローを通じて悪意あるシンクにどのように到達するかを示す。

リスト 1 に示すマルウェアの活動の例を考える。読み取りイベントに対応するコードブロックで、マルウェアは携帯電話のデバイス ID を読み取る(5〜6 行目)。デバイス ID は次に、クラス WriteTask の関数 execute() に引数として渡される。クラス WriteTask は AsyncTask を拡張しているので、WriteTask.execute() の呼び出しは実際には AsyncTask.execute() を呼び出す。Android API AsyncTask.execute() の呼び出しは非同期呼び出しである。すなわち、呼び出しは直ちに戻り、別の実行スレッドで、Android がクラス WriteTask の関数 doInBackground() をデバイス ID を引数として呼び出す。これは、リスト 1 の 8 行目で API AsyncTask.execute() が受け取ったのと同じ引数である。関数 doInBackground() の中で、デバイス ID は最終的に仮想の悪意ある URL「www.evil-URL.com」に漏洩する。読み取りイベントと漏洩イベントの間のフローは不明瞭である。クラス WriteTask の関数 doInBackground() の呼び出し(漏洩イベント)は、クラス MainActivity の関数 update()(読み取りイベント)のコールグラフには現れない。

/*Malware read block*/
public class MainActivity extends Activity {

public void update(Activity activity) {
  TelephonyManager tManager = (TelephonyManager) activity
       .getSystemService(Context.TELEPHONY_SERVICE);
  String imei = tManager.getDeviceId();
  WriteTask task = new WriteTask();
  task.execute(imei);
}
}

/*Malware leak block*/
public class WriteTask extends AsyncTask{
@Override
protected void doInBackground(String... params) {
  try {
    URL url = new URL("www.evil-URL.com");
        URLConnection connection = url.openConnection();
          OutputStreamWriter out = new OutputStreamWriter
               (
      connection.getOutputStream());
        out.write(params[0]);
        out.close()
    }
  catch(Exception e){
    }
}
}

リスト 1: 非同期処理を用いるマルウェアの例。

上記の不明瞭なフローにより、対応する漏洩イベントを特定することが難しくなる。そのような切り離された読み取りイベントと漏洩イベントが多数あるため、事態はしばしばさらに複雑になる。そうなると、悪意あるフローは他の多くの正当なフローの中の一つにすぎず、発見しにくくなる。GUI 要素を常にユーザーの操作に応答できる状態に保つ必要があるため、時間のかかるタスクを別の実行スレッドに任せるのは自然であり、そのことが Android アプリで非同期処理が非常に多い理由である。

不明瞭なフローは、上で論じたように、指定されたモデルを用いて計算できる。例えば、図 ?? の不明瞭なフローは、MainActivity.update() における AsyncTask.execute() の関数呼び出しに渡される引数(リスト 1 の 8 行目)から、WriteTask.doInBackground() が受け取るパラメータ(リスト ?? の 15 行目)へのデータフローエッジを追加することで、計算し明示できる。結果として接続されたフローを図 2 に示す。同様に、MainActivity.update() における関数 AsyncTask.execute() の呼び出しから関数 WriteTask.doInBackground() へ、関数呼び出しにおける実行フローの移転を表す制御フローエッジを追加する。

サンプルアプリの Atlas グラフ。MainActivity.update で読み取られたデバイス ID が、追加されたエッジを通って WriteTask.doInBackground へ流れ、さらに Writer.write へ至る。TelephonyManager の戻り値は Read event、書き込みは Leak event と示されている。
図 2: 機械が生成する証拠には、モデル化された不明瞭なフローが含まれる

IV. 関連研究

既存の自動化された Android マルウェアの検出・分類手法は、大きく二つの分類に分かれる。1) シグネチャベースと 2) 機械学習ベースである。シグネチャベースの手法は、バイトコードレベルの変換攻撃によって容易に回避されうる。学習ベースの手法は、プログラムの意味論ではなくアプリケーションの構文から特徴を抽出し、これもまた回避されうる。意味的に豊かな解析を行うため、論文 [?] は、古典的なプログラム分析の概念、すなわち抽象構文木、制御フローグラフ、プログラム依存グラフを一つのデータ構造に統合した、コードプロパティグラフと呼ばれるソースコードの表現を提案している。同様に、我々の手法も、全体を覆う意味的に豊かなプログラムグラフを用いた解析を伴う。しかし重要な違いは、解析を二つの異なる段階に分けることで、ドメイン固有の解析目標をその基盤となる仕組みから切り離している点である。第 1 段階では、多項式時間の静的解析器がソフトウェアの AST に索引を付け、豊かなグラフデータベースを構築する。第 2 段階では、ユーザーはグラフを直接探索することも、便利な API を用いて書かれたカスタム解析スクリプトを実行することもできる。これらの特長により、我々の手法は対話と自動化の両方に理想的である。

Holavanalli ら [11] は、Flow Permissions を提供するために、Android における非同期フローを接続する問題に取り組んでいる。著者らはコールグラフの静的解析を用いて、API 呼び出しに基づく意味情報を抽出し、アプリの振る舞いをユーザーに知らせる。Android における(AsyncTask と Message Handler を通じた)不明瞭なフローを取り込んだ完全なコールグラフを得るため、彼らはこれらの制御フローに対応するエッジを含むようにコールグラフを拡張している。Chen ら [12] は、アプリケーションが Android API とやり取りする時間的な順序を検査する手法を提示している。Lu ら [13] は、システム依存グラフに対する到達可能性テストを行うことで、ハイジャックを可能にするフローを含むマルウェアを検出する CHEX 静的解析フレームワークを述べている。アプリの複数のエントリポイントを特定するため、彼らは AsyncTask や MessageHandler などの非同期実行をモデル化している。我々は、これらの研究者が導入したモデル化手法を前進させている。

V. 結論

DARPA APAC プログラムの支援を最近受けた我々の研究に関するこの New Ideas and Emerging Results(NIER)論文は、米国国防総省が懸念する高度なマルウェアを検出するための重要な課題を述べる。我々はこれらの課題に対処する手法を提示する。

我々の解決策は、精度を保ちながら大規模なソフトウェアにスケールすることを助ける、革新的な機械と人間の統合を切り開く。我々の研究の革新的な側面には次のものがある。

  • Atlas と呼ばれるプログラム分析プラットフォームと、Atlas API を用いて書かれた解析・検出スクリプトを含む Android セキュリティツールボックスとからなる、分離されたアーキテクチャ。
  • 我々の解析器をこれらの既存 API によって実装することで、開発者の生産性が 10 倍向上し、解析器をより速く実装できると我々は見積もっている。Atlas API は、フロー依存、パス依存、型依存、文脈依存、オブジェクト依存の解析を実装するのに必要な素材を提供し、解析器がこれらの側面のどの組み合わせを用いるかを選べるようにする。その結果、望みの時間と精度のトレードオフを達成するカスタム解析器を実装する労力ははるかに小さくなる。
  • Atlas は、Java ソースコード向けに提供するものとほぼ同一の、Java バイトコードを解析するための API を提供する。
  • 人間と機械は、ソフトウェアグラフとそのようなグラフに対するクエリを媒介として意思疎通する。この統合された手法では、解析結果はコンパクトなグラフィカルな可視化によって提示される。この出力は人間の知能を増幅し、人間の誤りを最小化し、意思決定を最大規模のソフトウェアシステムにまでスケールさせる。

参考文献

  1. A. P. Fuchs, A. Chaudhuri, and J. S. Foster, “SCanDroid: Automated Security Certification of Android Applications,” Department of Computer Science, University of Maryland, College Park, Tech. Rep. CS-TR-4991, November 2009.
  2. D.-J. Wu, C.-H. Mao, T.-E. Wei, H.-M. Lee, and K.-P. Wu, “Droidmat: Android malware detection through manifest and api calls tracing,” in Information Security (Asia JCIS), 2012 Seventh Asia Joint Conference on. IEEE, 2012, pp. 62–69.
  3. J. Kim, Y. Yoon, K. Yi, J. Shin, and S. Center, “Scandal: Static analyzer for detecting privacy leaks in android applications,” in Proceedings of the Workshop on Mobile Security Technologies (MoST), in conjunction with the IEEE Symposium on Security and Privacy, 2012.
  4. Y. Aafer, W. Du, and H. Yin, “Droidapiminer: Mining api-level features for robust malware detection in android,” in Proc. of International Conference on Security and Privacy in Communication Networks (SecureComm), 2013.
  5. C. Gibler, J. Crussell, J. Erickson, and H. Chen, “Androidleaks: automatically detecting potential privacy leaks in android applications on a large scale,” in Trust and Trustworthy Computing. Springer, 2012, pp. 291–307.
  6. É. Payet and F. Spoto, “Static analysis of android programs,” Information and Software Technology, vol. 54, no. 11, pp. 1192–1201, 2012.
  7. Y. Zhou and X. Jiang, “Dissecting android malware: Characterization and evolution,” in Security and Privacy (SP), 2012 IEEE Symposium on. IEEE, 2012, pp. 95–109.
  8. R. Fedler, J. Schutte, and M. Kulicke, “On the effectiveness of malware protection on android,” Fraunhofer AISEC, Tech. Rep., 2013.
  9. W. Enck, P. Gilbert, B.-G. Chun, L. P. Cox, J. Jung, P. McDaniel, and A. Sheth, “Taintdroid: An information-flow tracking system for realtime privacy monitoring on smartphones.” in OSDI, vol. 10, 2010, pp. 255–270.
  10. A. Reina, A. Fattori, and L. Cavallaro, “A system call-centric analysis and stimulation technique to automatically reconstruct android malware behaviors,” in Proceedings of the 6th European Workshop on System Security (EUROSEC), Prague, Czech Republic, April 2013.
  11. S. Holavanalli, D. Manuel, V. Nanjundaswamy, B. Rosenberg, F. Shen, S. Y. Ko, and L. Ziarek, “Flow permissions for android,” SUNY Buffalo, Tech. Rep., October 2013. [Online]. Available: http://blueseal.cse.buffalo.edu/techreport/techreport.pdf
  12. K. Z. Chen, N. Johnson, V. D’Silva, S. Dai, K. MacNamara, T. Magrino, E. X. Wu, M. Rinard, and D. Song, “Contextual policy enforcement in android applications with permission event graphs,” in Proceedings of the 20th Annual Network and Distributed System Security Symposium (NDSS’13), San Diego, USA, February 2013.
  13. L. Lu, Z. Li, Z. Wu, W. Lee, and G. Jiang, “Chex: statically vetting android apps for component hijacking vulnerabilities.” in ACM Conference on Computer and Communications Security. ACM, 2012, pp. 229–240.