刘楚舒,王伟平,刘鹏飞
中南大学 信息科学与工程学院,长沙 410083
Android是目前最为流行的移动设备操作系统,这种流行性也为恶意应用的滋生提供了土壤。安全公司McAfee的数据[1]反映,中国每小时有超过6 000个恶意应用被检测出来,为全世界数量之首。因此,Android恶意应用的检测是目前安全领域研究中的重点。
目前,研究者针对Android恶意应用的检测提出了多种方法。其中,比较有代表性的是针对代码的静态分析方法,它的一般做法是提取程序代码特征,并基于正常应用和恶意应用在代码特征上的差异性对恶意应用进行识别。但目前静态分析普遍存在的问题是特征选取不够全面,导致检测方法只能针对特定的数据集才有效。
本文针对相关研究没有考虑的图片及界面元素两类资源特征进行了分析,发现应用图片和界面元素的数目在正常应用和恶意应用中有明显的差异性,继而提出了一种结合上述特征的Android恶意应用检测方法——MalAssassin,并验证了结合资源特征的检测方法在提高了识别准确性的同时,对不同数据集都具有较好的适应性。
静态分析方法首先对APK解压,然后从解压后得到的文件中提取特征,通过提取特征对应用的恶意性进行判定。
Drebin[2]提取了应用的8类特征,分别是硬件申请、权限申请[3]、实际使用的权限、组件名称、Intent-filter、敏感API、可疑API以及硬编码IP地址,随后使用SVM[4]分类器对应用的恶意性进行判定。Wu等人的方法[5]提取了在不同组件中出现的与隐私数据相关的API[6]作为特征,并使用KNNE、KNNM、逻辑回归、贝叶斯网络4种分类器算法对恶意应用进行检测。Naser的方法[7]提取了应用的权限申请以及API调用作为特征,并发现当检测方法将API和权限特征结合使用时,会取得更好的检测效果。DroidMat[8]提取了应用的权限与API调用特征,通过K-Means算法增强了检测方法对恶意应用的建模能力,最后通过KNN算法完成了对正常应用和恶意应用的二分类。Wei等人的方法[9]提取了应用的敏感权限和API等特征,并实现了一个基于随机森林分类器的检测方法,通过对不同特征集进行实验,验证了在多特征协同决策的情况下,机器学习方法能够达到较高的检测性能。Kang等人的方法[10]是首先通过恶意应用开发者的签名证书黑名单对应用进行初步筛选,对于无法通过黑名单判断的应用则提取其权限、可疑API、恶意命令作为特征,通过机器学习算法计算待测应用在这3种特征上与已知的恶意样本的相似性,并将相似性较高的应用判定为恶意应用。Allix[11]分析了多个机器学习方法在不同特征集下的检测性能,并指出特征选取不够全面会导致检测方法在不同样本集上的测试结果差距较大。
表1给出了这些研究提取的特征情况。没有一个研究对这些特征进行综合,并且这些特征只包含了APK解压后的文件中的部分信息,即AndroidManifest.xml文件、classes.dex文件以及META-INF文件夹中的信息,而resources.arsc文件以及res文件夹中的信息则没有被作为特征。这些未被考虑的信息主要是图片和界面元素这两类资源特征。
表1 相关研究提取的特征
为了提取的特征更加全面,针对应用中的图片资源和界面元素进行了分析和测试,发现这些元素在正常应用与恶意应用中存在明显的差异。基于此,本文提出了一种恶意应用检测方法——MalAssassin,该方法不仅考虑了相关研究[3,5,7-11]所提取的特征,还结合了资源特征。
将Android应用的图片与界面元素统称为资源特征。对已经标记好的59 093个应用(53 422个正常应用和5 671个恶意应用)的图片与界面元素两类资源特征进行了统计分析。
Android应用的图片存放在res文件夹中,其中较常使用到的图片有4种像素密度,分别为:ldpi(低像素密度,120 dpi)、mdpi(中像素密度,160 dpi)、hdpi(高像素密度,240 dpi)、xhdpi(超高像素密度,320 dpi)。像素密度越高,图片越清晰。
对这4种像素密度图片的数量以及图片总数的累计分布进行了统计,如图1~图5所示。其中横坐标表示图片数量,纵坐标表示包含图片数量小于对应横坐标值的应用数目占该种类全部应用数目的百分比。通过这5张累计分布图,有以下发现:
(1)正常应用与恶意应用在4种像素密度图片上的分布存在明显的差异。
(2)恶意应用更多地使用了ldpi和mdpi图片,正常应用更多地使用了hdpi和xhdpi图片。
(3)恶意应用中几乎不包含xhdpi图片。
(4)使用超过10张图片的恶意应用占所有恶意应用的比例为20%,而使用超过10张图片的正常应用占比为44%。
基于上述发现,ldpi、mdpi、hdpi、xhdpi图片数量以及图片总数对于区分正常与恶意应用有着重要的作用。
图1 ldpi图片数量对比
图2 mdpi图片数量对比
图4 xhdpi图片数量对比
为此,人工分析了一些恶意样本,并总结了出现这种现象的原因:恶意应用为了隐藏自己的意图,会故意使用非常小的图片,例如:恶意应用故意将按钮的图片设置为只有一个像素大小的图片,用户看不到应用界面中存在的这个按钮,不小心误触该按钮,从而触发应用的恶意行为。这就使得恶意应用更倾向于使用像素密度较小的图片,因此ldpi和mdpi图片的占比很高;而由于大像素的图片很容易暴露恶意应用的意图,因此hdpi和xhdpi图片的占比很低。与之相反的是,正常应用不需要隐藏自己的意图,反而由于功能的需要会用到更多高清的图片,所以其图片的累计分布与恶意应用的累计分布正好相反。此外,由于正常应用相对于恶意应用会使用到更多的图片,因此在图片总数上也要比恶意应用多。
同时考察了应用resources.arsc文件中的界面元素特征。应用的界面元素指的是一些用户交互界面(UI)的入口元素,例如按钮、输入框、返回键等元素,这些元素定义了Android应用与用户交互的方式。
对应用的界面元素做了与图片相同的累计分布统计,统计的对象分别是EditText、Toast、TextView 以及Button这4种界面元素,结果如图6~图9所示。同样的,横坐标表示界面元素数量,纵坐标表示包含的界面元素数量小于对应横坐标值的应用数目占该种类全部应用数目的百分比。通过这4张累计分布图,有以下发现:
(1)恶意应用几乎不使用任何EditText和Toast元素,而约40%的正常应用拥有EditText元素,约25%的正常应用拥有Toast元素。
图3 hdpi图片数量对比
图5 图片总数对比
(2)约25%的恶意应用会使用到10个以内的Text-View元素,而约57%的正常应用至少使用1个TextView元素,且有30%的正常应用使用超过10个TextView元素。
(3)正常应用和恶意应用在Button界面元素数目上的分布基本一致。
基于上述发现,认为EditText、Toast、TextView界面元素数量对于区分正常与恶意应用有着重要的作用。人工分析并总结了出现这种现象的原因:Android SDK为开发者提供了模板应用以便开发者快速上手,而这些模板有着相同的Button元素,如果开发者需要定义自己的用户交互界面,就需要自定义。
图6 EditText数量对比
图7 Toast数量对比
图8 TextView数量对比
图9 Button数量对比
通常,EditText、Toast以及TextView元素不会事先在开发模板中给出,需要自定义。而恶意应用几乎不会使用EditText和Toast,同时TextView的数量也要比正常应用少。因为这3类界面元素都属于提示信息的元素,恶意应用倾向于在后台偷偷地进行恶意操作,不给用户以任何提示。例如:正常应用在发送短信成功后,会通过Toast显示一段信息,提示用户短信已发送;而恶意应用则会将提示短信发送成功的Toast元素删除以隐藏其发送短信的行为。因此,恶意应用很少使用EditText、Toast、TextView这3种提示信息类型的界面元素;而在Button这类界面元素在Android SDK的模板中事先定义好了,因此正常应用与恶意应用的使用比率比较相近。
结合上述发现,提出了一种结合了资源特征的Android恶意应用检测方法——MalAssassin。MalAssassin的检测过程主要分为4步:(1)对已知的APK文件进行解压;(2)通过Androguard[12]工具提取应用的特征,并将特征映射到向量空间;(3)使用机器学习算法对特征向量进行学习,训练出检测模型;(4)使用检测模型对未知Android应用进行恶意性检测。具体的检测过程如图10所示。
MalAssassin首先对Android APK解压,得到应用的相关信息,包括AndroidManifest.xml文件、classes.dex文件、resources.arsc文件,以及META-INF和res两个文件夹。
AndroidManifest.xml文件存放了应用的一些配置信息,包括申请的权限、组件、硬件以及应用包名等等;classes.dex文件是应用源代码编译后形成的文件;resources.arsc文件存放了应用的界面元素信息;META-INF文件夹保存了应用的签名信息;res文件夹则存放了应用的图片。
从解压后得到的文件中,MalAssassin获取了应用的各种信息,并将这些信息提取为特征。
MalAssassin使用Androguard工具从解压后得到的应用信息中提取了8类特征,如表2所示。其中特征1~6为相关研究提取特征类型,特征7、8为所发现的资源特征类型,每个特征详细介绍如下:
(1)敏感权限。将正常应用使用较少、恶意应用使用较多的权限定义为敏感权限,统计了所有恶意应用和正常应用的权限申请,并选取了其中22个权限作为敏感权限。当应用使用了某项敏感权限,则该项特征值为1。
(2)组件数目。Android系统为应用开发者提供了4种实用组件:Activity、Service、BroadcastReceiver以及ContentProvider。恶意应用更倾向于在后台进行敏感操作,因此定义的Service、ContentProvider和BroadcastRe-ceiver组件数量要比正常应用多,而Activity组件数量比正常应用少。分别提取这4种组件的数量作为特征。
图10 MalAssassin检测过程
(3)敏感API数目。将加密方法、动态加载方法以及Native方法定义为敏感API,恶意应用中大量使用到了这些敏感API,因此分别提取这3种敏感API的调用次数作为特征。
(4)存在危险命令。Android SDK为开发者提供了Rumtime接口,开发者可以通过Runtime接口在代码中直接调用linux系统命令。统计了恶意应用常用的linux系统命令,并选取了11个系统命令作为危险命令特征,包括chmod、insmod、su、mount、sh、killall、reboot、mkdir、getprop、ln、pa。当应用的源代码中出现相应的危险命令的调用时,该危险命令特征值为1。
(5)硬编码IP地址。恶意应用开发者会将IP地址硬编码在代码中,通过与这些IP地址通信,将隐私信息发送到远程服务器。提取了已知恶意应用中包含的11个不同的硬编码IP地址作为特征。当应用中的硬编码IP地址在恶意应用中出现,则相应特征值为1。
(6)存在恶意签名。Android应用在发布时必须包含一个数字签名,以验证其开发者的合法性,而这个数字签名的公钥是由应用的签名证书发放。提取了9个已知恶意应用开发者的签名证书作为特征。当应用的签名证书与之匹配时,则相应特征值为1。
(7)图片数目。应用的图片分为ldpi、mdpi、hdpi、xhdpi,正常应用使用 hdpi、xhdpi图片较多,使用 ldpi、mdpi较少;而恶意应用使用ldpi、mdpi图片较多,使用hdpi、xhdpi较少。分别提取应用在这4种图片上的数量以及图片的总数作为特征。
(8)界面元素数目。正常应用为了方便与用户交互,会自定义EditText、Toast以及TextView元素,而恶意应用为了隐藏自己的恶意行为,则很少使用EditText、Toast以及TextView元素。分别提取了EditText、Toast、TextView这3种界面元素的数量作为特征。
将表2中的8类共68个特征映射到向量空间,形成应用的特征向量。例如,一个应用的特征向量ϕ(x)如下所示:
其中,该应用使用了INTERNET权限,因此INTERNET特征为1;它没有调用获取设备ID的API,因此该特征为0;另外,该应用包含了10张像素密度为mdpi的图片和15个Toast元素的,因此在这两维特征上的取值分别为10和15。
表2 MalAssassin提取的特征
将正常应用其标记为0;恶意应用标记为1,并通过Weka[13]机器学习工具对数据集进行训练。在Weka所有的机器学习分类器中,选择了其中的4种,分别是:逻辑回归、J48树、随机森林、SVM。这4种机器学习分类器在不同的二分类问题上都取得了不错的效果,是比较常用的分类算法。分别采用这4种算法构建检测模型,主要是为了对比的全面性,从而验证资源特征的加入是否能使得MalAssassin对不同数据集都具有较好的适应性。其中,逻辑回归是一种回归模型,它在线性回归的基础上,套用了一个逻辑方程,从而将预测值限定在[0,1]之间。J48树和随机森林都属于决策树算法,而决策树是一个利用像树一样的图形或决策模型的决策支持算法。支持向量机(SVM)通过将样本映射到高维向量空间,通过构建一个超平面对样本进行划分。
通过Weka内置的逻辑回归、J48树、随机森林及SVM分类器算法,对映射好的特征向量进行了训练,形成检测模型。每当需要检测新的应用,MalAssassin提取该应用的8类68个特征,并通过已经训练好的检测模型判断其恶意性。
主要是通过实验测试MalAssassin的检测性能,验证图片和界面元素特征对恶意应用检测的有效性,同时与相关研究进行了对比。
数据集由3个部分组成,如表3所示。其中正常样本是从国内应用市场下载的53 422个正常应用,将其标记为数据集B。
表3 数据集来源
恶意样本数据集来源于两处,分别是从研究Androdumpsys[14]中获取的4 429个恶意应用,该研究的恶意样本数据集采集自2012年—2014年,将其标记为数据集M1;以及从Malgenome[15]项目中获取的1 242个恶意应用,该恶意样本数据集采集自2011年—2012年,将其标记为数据集M2。M1和M2互不包含。
实验使用到了3个数据集,如表4所示。数据集1由数据集B、M1、M2构成,用它来测试MalAssassin在整个数据集下的性能;数据集2由数据集B和M1构成,数据集3由数据集B和M2构成,这两个数据集的恶意样本采集自不同的时间段,主要用它来验证MalAssassin在不同恶意样本数据集下的适应性。
表4 数据集划分
为了验证资源特征对检测结果的影响,将MalAssassin中的资源特征去掉,形成了一个不含资源特征的对比方法 MalAssassin(-)。
首先,直接在数据集1上测试了MalAssassin与MalAssassin(-)的检测精确度和召回率。以数据集1中67%的应用作为训练集,33%的应用作为测试集,并通过十折交叉验证的方式进行测试,结果如表5所示。可见,在数据集1上同时进行训练和测试时,MalAssassin与MalAssassin(-)相比平均精确度和召回率都略有提高,分别提高了0.9%和0.8%。
表5 数据集1下的精确度和召回率对比%
为了验证 MalAssassin 和 MalAssassin(-)对不同数据集的适应性,使用数据集3作为训练集,分别对MalAssassin和MalAssassin(-)提取的特征进行训练,并用训练得到的检测模型在数据集2上进行验证。来观察两种方法对新旧数据集是否具有较强的适应性。测试结果如表6所示。
由表6可知,含有资源特征的MalAssassin与不含资源特征的MalAssassin(-)相比,在训练数据集与测试数据集不同的情况下,可以取得更好的精确度和召回率。在4种不同分类器上的提升都达到了6%以上。其中逻辑回归提高了6.9%和6.9%,J48提高了5.9%和6.4%,随机森林提高了6.5%和7.2%,SVM提高了6.7%和6.9%。
表6 数据集2下的精确度和召回率对比%
这印证了资源特征是恶意应用的一项普遍包含的特征,这种特征可以有效地帮助识别,即便应用旧的训练模型来检测新的应用,依然能具有较好的适用性。
表7给出了MalAssassin与其他几种基于特征的机器学习方法的参照对比,由于无法获取这些相关方法的源代码,因此直接引用了其文中使用的数据集以及准确率测试结果。其中,Drebin[2]以及Kang等人[10]使用了与本文相同的恶意应用数据集,Naser[7]、Allix[11]使用的恶意应用数据集来自文献[15],是MalAssassin恶意应用数据集的一部分,因此这4个研究的测试结果同MalAssassin最具可比性;DroidMat[8]的恶意样本采集自contagio网站,Wu等人[5]和Wei等人[9]的恶意样本采集自VirusShare网站,由于无法获取他们的数据集,因此将DroidMat、Wu以及Wei文中的性能测试结果列在表7以供参考。MalAssassin综合了考虑各个方法所提取的特征,并取得了更好的检测效果。
表7 不同方法的检测性能参照对比
最后,测试了MalAssassin的运行效率。实验测试机器配置为:Intel Core i3-2100 3.10 GHz处理器,Windows 10专业版操作系统,6 GB内存。在这样的环境下,对1 242个大小从600 KB到16 MB的恶意样本进行测试,结果如图11所示。
图11 MalAssassin运行效率
由图11可知,这1 242个恶意样本的大小主要集中在6 MB以内,MalAssassin对这种大小的应用分析基本上控制在2~4 s之间,分析时间最多不超过10 s。
本文提出了一种基于静态分析和机器学习的Android恶意应用检测和分类方法,该方法综合了相关研究所提取的特征,并首次将图片和界面元素引入作为应用的特征。经实验验证,本文的方法达到了99.1%的精确度以及召回率。同时,资源特征的引入使得MalAssassin在不同数据集上具有较好的适应性。