さて、アプリの構造を紹介したところで、実際のAndroidアプリの分析技術の解説に移ろう。APKファイルを分析する技術にはさまざまなものが存在するが、大きく分けると「静的解析」と「動的解析」がある。静的解析とは、APKファイルの中身を解析していく手法であり、動的解析とは、APKファイルを実際のAndroid OS上にてアプリとして動作させ、その動作を解析していく手法である。どちらも有効な技術ではあるが、今回は、「静的解析」に焦点を絞って話を進めたい。
静的解析において最もよく使われるのは、ブラックリストに基づきマルウェアを特定する手法である。ブラックリストには、マルウェアと分かっているAPKファイルのブラックリストや、通信先のブラックリスト、アプリ作成者の証明書のブラックリストなどが存在する。
「APKファイルのブラックリスト」では、あらゆる手法でマルウェアと特定されたAPKについて、そのハッシュ値がリスト化されている。「通信先のブラックリスト」では悪意のある第三者と関係すると思われるURLがリスト化されており、dex分析などの中でこれらのURLへの通信が確認されれば、マルウェアと判断する。また、「アプリ作成者の証明書ブラックリスト」については、マルウェアの証明書をリスト化してあり、同じ作成者が作成したアプリが発見された際には、マルウェアの可能性が高いと判断される。
ただし、ブラックリスト方式は、既に誰かが評価をした結果に基づきリストが作成されていることが前提となる。従って、新たに登場するアプリケーションの信頼性を評価するには、別の方法でそのアプリを評価しなければならない。以下では、まだ評価されていないAPKがマルウェアか否かを判定するための手法をいくつか紹介する。
マルウェアであるかどうかを診断するための手法の1つに、「アプリのリスクを数値化する」アプローチがある。その一種である「DroidRisk」という方式では、あるアプリが利用している各パーミッションについて、そのリスクの期待値を算出し、期待値の総和をアプリ全体のリスク値とする。そして、リスク値が一定の閾値に達しているか否かで、マルウェア診断を実施する。
より具体的に言えば、AndroidManifest.xmlファイルに記載されているパーミッション要求パターンを参照した後、各パーミッションがマルウェアに悪用される確率とその際の影響度を算出し、それらを乗算することにより各パーミッションのリスク値を求めている。そして、1つのAPKが利用する全てのパーミッションに対するリスク値を合算し、その値を当該APK のリスク値とする。
ただし、この方式はある程度のマルウェア検出精度を実現しているが、完璧ではない。例えば、あるパーミッションが悪影響を与える期待値は、本来そのアプリの種類により異なるはずであるが、この方式ではそうしたアプリのコンテクストについては考慮されない。具体例を挙げると、カレンダーアプリが電話帳へのアクセスパーミッションを要求することがあってもおかしくないが、電卓アプリがそのパーミッション要求を行うことは考えにくい。このようなコンテクストが考慮されないため、この方式でも、やはりマルウェア検知精度には限界がある。
では、コンテクストを考慮した方式についてはどうか。一例として、「Category-based Rare Critical Permission (CRCP)」を用いる方式がある。この方式では、アプリをカテゴリに分け、カテゴリごとにパーミッション要求の頻度を統計情報に基づき分析し、「利用頻度が極めて少ない」もしくは「使われない」パーミッションを“CRCP”として定義する。そして、CRCP の利用を監視することにより、APKのマルウェア判定を行う。なおここで、あるカテゴリでCRCPとして扱われるパーミッションが、別のカテゴリではCRCPではないこともある点に留意されたい。
APKのマーケットに行くと、APKファイルにたどり着く前に、「アプリカテゴリ」や「アプリ説明文」などのメタ情報を目にすると思うが、この「アプリ説明文と実際のアプリの挙動が一致するのか」を分析する技術をマルウェア検知に応用するというアプローチもある。
こうした技術の代表例としては「CHABADA」がある。CHABADAではまず、一定のアルゴリズムに従い、アプリ説明文からアプリを複数のカテゴリに自動的に分類する。次に、その各カテゴリに属するAPKの特徴を比較し、他のAPKとは明らかに異なる特徴を持つAPKを、「アプリ説明文と実際の挙動が一致しないアプリ」として検出する。こうしたアプローチとしては、CHABADAの他にも、「WHYPER」や「ACODE」などの方式が存在する。
マルウェアは実際の説明文とは異なる挙動をすることが多いため、これらの手法を少し加工すれば、マルウェア検知にも十分利用できるだろう。ただし、マルウェア検知を目的とするならば、直接アプリの特徴情報を基に機械学習を実施するアプローチの方が検知率は高くなる。
ここまで説明してきたような「アプリのリスクを数値化する手法」や、「疑わしいパーミッションの利用を監視する手法」も有効性は高いが、マルウェアか否かを「2値判定」するという目的に絞れば、 「サポートベクターマシン(SVM)」を用いた手法が優れている。筆者の研究開発チームでも、このアプローチに基づく研究開発を行っている。
SVMは機械学習手法の1つであり、対象となるデータ集合に対し、それぞれのデータの特徴をマッピングし、データ集合を2分割する境界線を引く技術である。下図はそのイメージ図であるが、2次元の特徴量を扱う際には、それぞれの特徴軸X1およびX2に基づいてデータをマッピングし、そのデータの境界線(下図における実線)を探し当ててデータ集合を2分割する。さらに具体的に言えば、2つのデータ集合のそれぞれについて、最も外側のサンプルを通る線(下図における点線)を引き、それらの線までの距離が最大となる線(下図における実線)を、境界線として設定する。
この手法はAndroidアプリのマルウェア分析にも応用可能だ。入力されるAPKファイルの特徴情報に対して、マルウェアとそうでないものの境界線を引くことにより、APKファイル全体を二分することができる。上述のリスク数値化技術などとは異なり、“マルウェアらしさ”などの「程度」を考慮するのは難しいものの、「マルウェアか否か」を2値評価することに絞れば、非常に精度が高い。
この手法では、マルウェアとそれ以外での特徴が出やすいと考えられるパラメータを入力することで、よりマルウェア検知の精度を高めることができる。例えば、各アプリで利用しているパーミッション要求リストを入力すれば、高いマルウェア判定精度を実現できる。その他にも、アプリのカテゴリ情報や、アプリの説明文、またアプリのダウンロード数などを入力として用いる手法も検討が進められている。
なお、本稿では全ての方式の説明において、「パーミッションに基づく判定」を例として取り上げたが、実際には分析の対象としてはパーミッションよりも「API呼び出し」を用いた方が、一般に分析精度が高い。実際、上記のそれぞれの方式において、パーミッションの代わりにAPI呼び出しを分析することで、マルウェアの検知精度がさらに向上することはわれわれも実験にて確認済みであるが、本稿では簡単のため、パーミッションに基づく判定という形で説明を進めたい。
Copyright © ITmedia, Inc. All Rights Reserved.