基于沙盒的Android应用风险行为分析与评估
李舟军 1 , 吴春明 1 , 王啸 2     
1. 北京航空航天大学 计算机学院, 北京 100191 ;
2. 国家计算机网络应急技术处理协调中心, 北京 100029
摘要:Android是移动领域市场占有率最高的操作系统, 其开源的系统、海量的应用使得Android的用户量与日俱增, 因此Android的安全问题受到业界的高度重视和广泛关注, 特别是Android设备上大量涌现的恶意应用, 已成为Android生态圈发展所面临的重大问题。该文基于Android 4.1.2设计并实现了一个沙盒, 能够对Android系统中应用的行为进行动态监视和记录; 提出了一种基于行为分析的应用风险评估方法, 以便用户对相关应用的风险有一个明确的预判, 从而提高和保障用户的安全; 通过对恶意应用和正常应用的样本分别进行实验和分析, 验证了该文所提出方法的有效性。
关键词Android应用     沙盒     行为分析     风险评估    
Assessment of Android application's risk behavior based on a sandbox system
LI Zhoujun1 , WU Chunming1 , WANG Xiao2     
1. School of Computer Science and Engineering, Beihang University, Beijing 100191, China ;
2. National Computer Network Emergency Response Technical Team/Coordination Center of China, Beijing 100029, China
Abstract:Android has become the most popular operating system on mobile devices. However, the Android is an open source system with billions of applications. More users are choosing Android, so Android security problems are receiving much attention in the industry. Android of malware is already a major problem and cannot be avoided in the Android ecosystem. This paper describes a sandbox system based on Android 4.1.2 which can dynamically monitor and record application behavior. A risk assessment approach based on behavior analysis is given so that users can get an explicit risk prognosis for an application to improve their safety. Tests on malware and normal application samples verify the effectiveness of this risk assessment approach.
Key words: Android applications     sandbox     behavior analysis     risk assessment    

Android是由Google公司与开放手机联盟(由34家终端企业和运营商所组建的全球性联盟组织)领导和开发的开源手机操作系统。自2008年面世以来,Android在移动领域中取得了巨大的成功,市场份额一路飙升,截至2015年第3季度,Android占据了84.7%的智能手机市场份额。在Android系统不断繁荣的今天,Android所面临的安全问题也受到人们越来越多的关注和重视。根据Android漏洞信息库的统计,截至2013年12月,在Android系统所发现的漏洞中,第三方应用漏洞占据了62.54%[1]。赛门铁克安全响应中心在2014年公布的《互联网安全威胁报告》[2]中发出警告,在所有已发布的Android应用中,有17%(约100万个)实际上是由恶意应用伪装的。

本文的主要目的在于研究和分析Android应用的风险行为,为Android用户选择风险较小的Android应用提供判断依据,为应用市场评估应用风险提供参考。本文所指的风险行为主要指应用未经用户允许,私自获取用户信息、破坏用户系统,给用户造成损失的行为。本文并未对应用是基于功能性需求(软件本身需要)还是基于破坏性需求(盗窃数据)而获取用户数据进行鉴别。

1 Android应用安全研究

目前,Android应用的安全性分析主要存在2种方法:基于动态分析技术的方法和基于静态代码分析的方法[3]

Enck等[4]提出了基于污点传播的信息跟踪系统TaintDroid,通过修改Android系统源码,将用户的隐私数据作为污点放到Android系统中进行污点传播,借此发现应用是否存在窃取用户信息的行为。文[5]实现了名为CopperDroid的工具,通过对应用行为的模拟,重现应用的恶意行为。文[6]提出了名为ProfileDroid的系统,可以从语义和行为2个方面来对应用的行为进行刻画,提高了行为分析的准确性。文[7]则设计了名为DroidScope的系统,该系统更加细化,不仅可以从语义上刻画应用行为,还可以分析应用内部组件之间的行为特征。复旦大学的杨珉等设计并实现了名为VetDroid[8]的工具,可以从应用的通用行为和内部行为2个方面来分析应用的敏感动作。

上述Android应用安全研究工作均是基于动态分析实现的。另一方面,Android应用行为静态分析的研究也硕果累累,包括PEG[9]、DroidMat[10]等静态工具也在应用行为分析方面取得了不错的成效。

对应用行为进行动态分析,可以比较准确地判断其恶意行为,但无法保证对应用的全部代码实施覆盖,因此可能会出现较高的漏判率;静态分析能够保证对代码的覆盖率,但准确度不及动态分析,且易受代码混淆等技术的影响。

本文从Android应用风险行为的角度出发,基于动态分析的思想,设计并实现了一个Android沙盒,能够自动安装、启动、卸载应用,并在应用启动后可模拟用户操作,同时监视和记录应用的行为;在此基础上,提出了一种基于行为分析的应用风险评估方法,能对应用行为可能给用户带来的安全风险进行分析,以便用户对相关应用的风险有一个明确的预判。

2 Android沙盒 2.1 Android系统介绍

Android自身层次结构清晰,自上而下分别由应用层、应用程序框架层、Library层和Kernel层组成。Android系统的层次结构如图1所示。

图 1 Android系统层次结构

Android应用是运行在最上面的应用层之中的Android软件,即App。Android系统为每个应用提供一个单独的Dalvik虚拟机环境(类似于Java中的JVM),应用实际运行在虚拟机之中,其自身并无法对Android底层的系统进行修改。本质上讲,Android系统中的每个应用本身就处于一个简单的沙盒之中,这样做可以隔离应用之间的相互干扰以及防止应用对系统底层的蓄意破坏。

Android应用主要由四大组件构成,分别是Activity、Service、Broadcast Receiver和Content Provider。四大组件是构成一个Android应用的基本要素,一个标准的Android应用也应该由符合规范的组件构成。

2.2 Android沙盒介绍

Android沙盒(Android application sandbox)[11]是在Android系统中对应用行为进行动态分析的必要环境,尽管Android系统已经给应用提供了一个沙盒,但是该沙盒仅仅起到隔离应用和保护系统的作用,并没有保护用户隐私、记录应用行为等功能。事实上,即使是在保护系统不被破坏这个层面上,该沙盒的作用也十分有限,由于Java JNI[12](允许用户调用本地非Java代码)机制的存在,使得不少应用可以通过JNI绕过该沙盒。

本文所需要实现的沙盒是为了监视并记录应用的行为,但Android系统自身提供的沙盒显然不能满足这种需求。为此,本文设计并实现了一个全新的Android 沙盒,位于Library层之上,应用程序框架层之下,其层次结构如图2所示。

图 2 Android沙盒结构示意

2.3 Android沙盒实现

本文的沙盒基于Cydia Substrate的免费Hook框架,主要是利用对Android系统进程的注入和Java中的反射机制,以实现对Android应用行为的监视和记录。Cydia通过注入系统进程Zygote来实现对系统本身应用程序编程接口API(application programming interface)的重定向,拦截其调用地址,将其地址指向一段自定义代码的地址,然后执行自定义的代码,最后再回调系统的API,完成整个调用过程,如图3所示。

图 3 注入与拦截API的流程

2.3.1 应用行为的监视

Zygote是Android系统中十分重要的一个进程,每个Android应用在启动时,系统都会为其分配一个Dalvik虚拟机,而这个分配虚拟机的过程就是由Zygote来完成的。注入了Zygote就相当于实现了对系统中每个进程的注入,这样就可以实现对所有应用的API调用的Hook。Cydia已经为Android系统上的Hook提供了良好的接口,利用其提供的现成的接口,可通过Java反射机制定位Android应用中的各种各样的API,实现对多种API的Hook。只需要在已经root过的Android手机或者模拟器中安装Cydia的客户端,在eclipse开发集成环境中配置Cydia的SDK,然后利用eclipse集成的Android开发环境,为Cydia客户端实现Hook插件,即可完成对系统API的Hook。

2.3.2 应用行为的记录

在实现了对API的Hook之后,就可实施对Android应用行为的记录。首先,注入应用程序的进程,Hook其对API的调用;然后,跳转到自定义的记录模块执行本地代码,对API调用过程和参数进行记录;最后,返回到原来API的调用地址,完成API调用。本文将记录结果保存为log文件存储到Android手机的SD卡中。log文件的格式如图4所示,记录的信息依次为:日期、时间、API所在的包、调用API的应用的名称、应用的进程号、API的名称、应用的行为、API的重要参数(若有参数)。

图 4 log文件格式

要实现对Android应用行为的记录和分析,需要把应用安装到已经具备了沙盒功能的Android模拟器或者真机中,安装完成后还需要将其执行一段时间,并在此期间随机地模拟用户的操作,之后还需要对应用进行自动卸载。可利用Google提供的adb调试命令行和Monkey工具来实现上述的功能。

Monkey是Google为Android应用开发者提供的一款压力测试软件,它通过随机产生用户的触摸和键盘操作来测试应用在高压力使用环境下的抗压能力,本文使用其来模拟普通的用户输入。

本文使用python脚本调用adb命令“adb install”来实现对Android应用的自动安装,然后调用Google的压力测试工具Monkey,使用命令“adb shell monkey-px-vv-throttle 500 500”来模拟用户的行为,测试完成后调用“adb uninstall”对应用进行自动卸载,最后导出log文件,并分析log文件得到最终结果。

3 应用的风险行为分析与评估

一个应用所调用的API,均真实地反映出该应用在Android系统中的行为。例如,一个应用产生网络行为,它肯定会去调用网络通信相关的API;一个应用产生文件行为,它肯定会去调用文件相关的API。所以,要描述一个应用的行为,可以将其对API的调用情况作为标准。

3.1 应用的风险行为分析

用户一旦在Android中安装了恶意应用,这些应用在Android中通常有以下常见的一些恶意行为:

1) 后台发送吸费短信,拨打吸费电话;

2) 盗窃用户信息(包括手机中的短信、通话记录、手机的IMEI、IMSI编号、用户使用的运营商);

3) 获取用户的地理位置信息,后台打开MIC录音,后台打开摄像头;

4) 后台联网,传输用户信息,消耗用户流量;

5) 伪装进程,后台杀死手机中其他进程(例如支付宝、PayPal等应用的进程),然后伪装该进程,进行欺骗。

根据上面的描述,如果一个应用去调用实现上述行为所需要的一个或者几个API,则可以从某种程度上认为用户安装该应用存在着一定的风险。当这种风险大到一定程度时,应当告知用户。

应用想要在Android系统中实施自己的行为,就需要对Android系统API的调用,而这种实施风险行为所需的API就是敏感API。所以,只要能够检测到应用对敏感API的调用,并记录在案,就能够对应用的行为了如指掌。通过查阅Android开发者文档,本文对实施各种风险行为所需的API进行了统计,这种API大致可分为如下5类:网络API,进程API,电话、短信相关API,Android组件API,数据库API等。表1举例说明了部分API及其行为结果。

表 1 API与行为对照表
API名称实现的行为其他
Android.content. ContentResolver.query对数据库进行查询操作根据其Uri确定操作内容
Android.app.Activity. startActivity启动Activity组件需要根据其携带的Intent判断行为
Android.telephony. SmsManager.send- TextMessage后台发送短信
Android.app.ActivityManager.killBack- groundProcess杀死后台程序 (可关闭杀软)

值得注意的是,在敏感API之中,许多API是否具有风险性,还要根据其相应的参数才能确定。例如,数据库操作相关的API需要根据其携带的Uri参数来确定其所要操作的数据库内容。而startActivity和startActivityForResult两个API是启动Activity(应用四大组件之一)的标准API,也是大多数应用都会反复利用的API,其行为既可能是风险行为,也可能是正常行为。因此,需要对其携带的Intent参数进行进一步分析,才能确定其行为是否为风险行为。

对于具有风险的API,不同的API所代表的风险程度也是不一样的。在一般情况下,以用户的经济利益作为直接的风险衡量标准:

1) 可能直接造成用户财产损失的API,其风险程度为最高;

2) 能够获得或者泄露用户隐私的API,其风险程度次之;

3) 修改系统设置和用户配置、破坏系统环境的API,其风险程度相对来说最低。

综上所述,将一些API视为具有风险的敏感API,根据API所代表的风险程度的高低,统计API在应用运行期间出现的频度,是判断和衡量应用的风险程度的一个重要指标。

3.2 应用的风险行为评估

信息熵[13]属于信息论的范畴,是一种对变量不确定性的度量,一个变量包含的信息熵与其复杂程度呈正相关的关系,当组成变量的内容的熵值越大,其不确定性就越强,描述其就需要越多的信息。熵最初出现在热力学之中,由香农引入信息论之中,并给出了信息熵的数学模型。

假设变量X的取值范围为{Xi|i=1,2,3,…,n},pi表示X=Xi的概率,则把X的信息熵δ定义为

$\delta {\rm{ = }} - \sum\limits_{i = 1}^n {{p_i}} \times \log {p_i}$

基于信息熵的理论,本文提出了一种利用信息熵来评估Android应用的风险行为的新方法。将应用安装到沙盒中并运行,同时模拟固定次数(例如500次)的用户操作。假设在此过程中,应用所调用的所有具有风险的敏感API出现次数分别为k1,k2,k3,…,kn,则用于评估该应用的风险行为的信息斜δ如下,令s为所有敏感API出现的总的次数:

$\eqalign{ & s = \sum\limits_{i = 1}^n {{k_i}} , \cr & \delta {\rm{ = }} - \sum\limits_{i = 1}^n {{{{k_i}} \over s}} \times \log {{{k_i}} \over s}. \cr} $

由于恶意应用普遍会集中地实施风险行为,频繁地调用一些敏感API。若使用敏感API所组成的集合来描述和刻画一个应用,则恶意应用调用的敏感API会更多,次数也更频繁,因而其信息量就更大,其信息熵δ就会比正常应用的信息熵大,因此,通过计算一个应用在敏感API集合上的信息熵的大小,即可判断其风险程度的高低。

4 测试与实验 4.1 Java Benchmark

CaffeineMark[14]是一款国际通用的测试软件,用于测试不同软硬件平台上Java的执行效率。CaffeineMark使用其内部的评分机制为系统的Java性能进行评分,分别从Service、Loop、Logic、String、Float、Method六个方面,去评估一个系统的Java性能,并得出总评结果。从CaffeineMark的文档中可知,CaffeineMark的评分结果很大程度上依赖于系统中Java指令的执行速度,CaffeineMark能够客观地反映出系统的Java执行效率。

沙盒的工作是监视并记录Android应用对系统API的调用,这些API调用均是通过Java来实现的,所以沙盒对系统中Java的执行效率影响最大。本文使用CaffeineMark的评估结果作为沙盒中Java的执行效率的评判标准,实际测得的结果如图5所示。由CaffeineMark的评估结果可知,除去Loop、Logic、Float三项指标之外,沙盒在其他方面的性能基本与原生Android系统持平。总体上来看,沙盒造成的Java方面的性能损失为13%~15%。

图 5 CaffeineMark 3.0 测试结果

4.2 应用的行为统计

本文收集了1 200余个已经被各大手机安全平台确认的具有恶意行为的Android应用作为恶意应用样本,并在Google官方的应用商店Google Play上,爬取了各大应用分类中下载次数名列前茅的应用共400个,作为正常应用样本。一般而言,Google的官方应用商店被普遍认为是比较安全的应用商店,而Google官方商店中下载量排行前列的应用,更是经受了无数用户与安全厂商的考验,所以可以认为其是安全的正常应用。基于上述2个样本集,使用沙盒对其API调用情况进行监视和记录,并进行统计与分类,其结果如图67所示。

图 6 恶意应用行为频度统计

图 7 Google Play正常应用行为频度统计

从上述结果可知,不论是恶意应用还是正常应用,openConnection、openStream等网络API的调用占据了主要地位,这也是未来Android应用发展的一个趋势。除网络API外,恶意应用对其他敏感API的调用与正常应用具有明显的区别。从图67中可以看出,恶意应用对getDeviceId、getSubscriberId、getLine1Number、getSimSerialNumber等敏感API的调用频率要明显多于正常应用,而这些API可分别获取用户的IMEI码、IMSI码、电话号码、SIM卡序列码等,因此这些API显然比网络API的风险程度高得多。

除此之外,在恶意应用的统计结果中,可以找到在正常应用统计结果中从未出现的敏感API,例如killBackgroundProcess、restartPackage等API,这些API可以杀死Android系统中的进程,甚至可以关闭杀毒软件。

综上所述,在恶意应用样本的运行期间,其对敏感API的调用更加频繁,且能够检测到更多的敏感API的调用;在同样的情况下,正常应用样本则对敏感API的调用频率较低。

4.3 应用的风险计算

在已经获得log文件的情况下,计算恶意应用样本的总信息熵,结果如图8所示,对Google Play的正常应用的计算结果如图9所示。

图 8 恶意应用的信息熵

图 9 正常应用的信息熵

由于恶意应用会频繁地调用敏感API,若使用敏感API所组成的集合来描述和刻画一个应用,则恶意应用调用的敏感API会更多,次数也更频繁,因而其信息量就更大,信息熵就会更大。由图89可知,正常应用样本的总信息熵为2.898,而恶意应用的总信息熵为3.257,很好地验证了上述结论。由此可知,选定一个信息熵的合理取值作为标准值,若应用的信息熵高于标准值,则说明应用的风险较大,反之则说明其风险较小。

事实上,信息熵标准值的选取是一个不小的挑战。本文在实验中发现,当选取恶意应用样本和正常应用样本总信息熵的均值3.08作为标准值时,其对风险应用的识别率达64.38%,而取二者的加权均值3.17作为标准值时,其识别率则骤降到17.59%;如果单纯选择恶意应用样本中信息熵最小的应用的信息熵1.67作为标准值,则能够保证对风险应用100%的识别率,但其误判率则高达50%。

所以,合理地选择信息熵的标准值,才能使恶意应用识别率和正常应用误判率达到一个可以接受的范围。本文经过多次实验,发现取标准值为2.92左右时,恶意应用识别率能够保持在80%以上,而正常应用误判率在10%以下,结果如表2所示。

表 2 识别率和误判率
标准值识别率误判率
3.1717.59%1.00%
3.0864.38%3.50%
2.9281.53%7.30%
1.67100%>50%

5 总结

在移动互联网飞速发展的今天,Android应用已经成为人们工作和生活所不可或缺的重要工具,了解和认识Android应用所具有的风险对于Android用户而言至关重要。本文聚焦于Android应用风险行为的分析与评估,通过Android沙盒来监视和记录Android应用的行为,利用信息熵的相关理论来对Android应用的风险行为进行分析和评估。该方法能够为应用商店审查应用提供借鉴,也使得Android用户能够对相关应用的风险有一个明显的判断。基于上述方法,本文收集了1 200余个恶意应用与400个正常应用,分别计算二者的信息熵,并在此基础上进行分析对比,验证了本文所述方法的有效性。

参考文献
[1] SCAP中文社区. Android漏洞信息库[Z/OL]. (2013-12-20). http://android.scap.org.cn. The SCAP Community of China. Android vulnerbilities database[Z/OL]. (2013-12-20). http://android.scap.org.cn. (in Chinese)
[2] 赛门铁克安全响应中心. 《互联网安全威胁报告》[Z/OL]. http://www.symantec.com/zh/cn/security_response/publications/threatreport.jsp. Symantec Security and Response Center. A survey of global security threat on the internet[Z/OL]. http://www.symantec.com/zh/cn/security_response/publications/threa-treport.jsp. (in Chinese)
[3] 张玉清, 王凯, 杨欢, 等. Android安全综述[J]. 计算机研究与发展,2014, 51 (7) : 1385 –1396. ZHANG Yuqing, WANG Kai, YANG Huan, et al. Survey of Android OS security[J]. Journal of Computer Research and Development,2014, 51 (7) : 1385 –1396. (in Chinese)
[4] Enck W, Gilbert P, Chun B G, et al. TaintDroid: An information flow tracking system for real-time privacy monitoring on smartphones[J]. Communications of the ACM,2014, 57 (3) : 99 –106.
[5] Reina A, Fattori A, Cavallaro L. A system call-centric analysis and stimulation technique to automatically reconstruct Android malware behaviors[C]//Proceedings of European Workshop on Systems Security. Prague, Czech Republic:EuroSec, 2013:135-141.
[6] Wei X, Gomez L, Neamtiu I, et al. ProfileDroid:Multi-layer profiling of Android applications[C]//Proceedings of the 18th Annual International Conference on Mobile Computing and Networking. Istanbul, Turkey:ACM, 2012:137-148.
[7] Yan L K, Yin H. DroidScope:Seamlessly reconstructing the OS and dalvik semantic views for dynamic Android malware analysis[C]//Proceedings of the 21st USENIX Conference on Security Symposium. Washington DC, USA:USENIX Security Symposium, 2012:569-584.
[8] Zhang Y, Yang M, Xu B, et al. Vetting undesirable behaviors in Android apps with permission use analysis[C]//Proceedings of the 2013 ACM SIGSAC Conference on Computer & Communications Security. Hangzhou, China:ACM, 2013:611-622.
[9] Chen K Z, Johnson N M, D'Silva V, et al. Contextual policy enforcement in Android applications with permission event graphs[C]//Proceedings of 20th Annual Network & Distributed System Security Symposium. San Diego, USA:NDSS, 2013.
[10] Wu D J, Mao C H, Wei T E, et al. Droidmat:Android malware detection through manifest and API calls tracing[C]//Information Security (Asia JCIS), 2012 Seventh Asia Joint Conference. Tokyo, Japan:IEEE, 2012:62-69.
[11] Bläsing T, Batyuk L, Schmidt A D, et al. An android application sandbox system for suspicious software detection[C]//Malicious and Unwanted Software (MALWARE), 2010 5th International Conference. Nancy, France:IEEE, 2010:55-62.
[12] Wikipedia. Java native interface[Z/OL]. http://en.wikipedia.org/wiki/Java_Native_Interface.
[13] HAN T S, Kobayashi K. Mathematics of Information and Coding[M]. Washington, DC: American Mathematical Society, 2002 .
[14] CM3. CaffeineMark[Z/OL]. http://www.benchmarkhq.ru/cm30/info.html.