基于随机森林的抗混淆Android恶意应用检测

2021-03-04 02:51王柯林赵瑞哲辛丽玲汪秋云
信息安全研究 2021年2期
关键词:调用静态组件

王柯林 杨 珂 赵瑞哲, 辛丽玲 汪秋云

1(中国科学院大学 北京 101400) 2(中国科学院信息工程研究所 北京 100093) 3(国网电子商务有限公司(国网雄安金融科技集团有限公司) 北京 100053) 4(国家电网有限公司区块链技术实验室 北京 100053)

(wangkelin20@mails.ucas.ac.cn)

在Android系统迅速发展的同时也带来了一些安全问题.很多第三方平台可以发布Android应用.由于第三方平台对于分发软件审核不严,造成了很多恶意应用大肆泛滥.2018年全年,360互联网安全中心共截获移动端新增恶意应用样本约434.2万个,平均每天新增约1.2万个.2018全年移动端新增恶意应用类型主要为资费消耗,占比高达63.2%;其次为隐私窃取(33.7%)、恶意扣费(1.6%)、流氓行为(1.2%)、远程控制(0.3%)[1].这些Android平台下的恶意应用不仅对个人用户产生威胁,同时也为APT攻击提供了新的思路和方法,例如2019年2月4日披露的APT-C-26和2019年8月5日披露的APT-C-28攻击.

针对Android恶意应用的分析方法可以分成静态分析和动态分析.静态分析是将Android应用文件进行反汇编处理后,对代码进行规则匹配及分析.例如,通过分析manifest.xml文件,可以获知应用开发者申请的权限和组件信息.静态分析消耗的资源较少,通过分析反汇编出来的代码,也能获取更进一步的恶意代码特征,但是很难处理代码混淆及加密后的恶意代码.动态分析是使用沙箱监控Android应用运行时的行为,实时捕获Android应用的敏感行为.例如,在Android应用运行时给手机通讯录发送的短信内容.动态分析可以处理代码混淆、加密等情况,但是动态分析需要在沙箱中运行Android应用,并实时监控行为,资源消耗更大,分析时间也比静态分析长很多.

针对静态分析和动态分析的优缺点,本文将结合2种方法对Android应用进行动静态分析,提取特征信息,再使用机器学习方法进行训练,从而实现对Android应用程序是良性应用还是恶意应用的判断.另外,本文将选取部分Android应用进行混淆,利用在混淆前后不变的权限特征和组件特征,使用机器学习方法进行10折交叉验证,从而对混淆恶意应用进行检测.

1 相关研究

1.1 基于静态分析的Android恶意应用检测

Payet等人[2]改进了Julia(Java字节码静态分析工具),使其适用于DVM(Dalvik virtual machine)字节码的分析,首次将静态分析用于Android程序的分析.Hou等人[3]将Android应用程序、相关的API调用及其相互关系表示为结构化HIN,并用元路径表示Android应用上的相似度,利用多内核学习来汇总不同的相似度,最后由学习算法自动加权元路径进行预测,这种方法的检测率达到99%.陈泽峰等人[4]提出2个级别的不同分类器来平衡精确度和系统开销.作者使用n-gram处理操作码序列,并关注权限等特征,在级别1无法可靠预测时,使用级别2,最终实现了多级分类准确率97.82%、级别2访问频率10.4%的效果.郗桐等人[5]使用Opcode操作码为检测特征,采用卷积神经网络模型来检测恶意应用.该实验将原始操作码划分为256类时效果最佳,实现了94.12%的准确率.Ma等人[6]通过Android应用的控制流程图来获取API的调用、调用频率和调用序列,并创新性地构建了是否调用、调用频率和调用序列3个数据集,通过机器学习方法对恶意应用进行检测,并最终实现了98.98%的准确率和较高的稳定性.Mariconti等人[7]提出名为MaMaDroid的Android恶意应用检测系统.该系统通过将API调用抽象到它的程序包或家族,使用马尔科夫链对抽象后的API序列建模,最后通过机器学习来检测恶意代码.该系统能有效检测恶意应用,F度量高达99%,而且可以通过该系统长期保持其检测能力,在训练后1年和2年,平均F-measure分别为87%和73%.

1.2 基于动态分析的Android恶意应用检测

王勇等人[8]选用静态特征和动态特征,对特征选择后进行数据降维,最后利用SDA算法构建神经网络,并用BP算法微调结果来完成分类任务.数据集包括15 000个应用,系统的准确率达到95.8%.黄浩华等人[9]使用静态分析获取应用API调用来初步判断,之后根据疑似恶意应用UI控件的可疑度进行有针对性的动态测试,来确认是否为恶意应用.实验结果表明,该方法可以在提高检测效果的同时降低误报率.Feng等人[10]提出了一种有效的动态分析框架,即EnDroid,其基于多种类型的动态行为特征进行检测.动态行为通过运行时监视器提取,涵盖系统级的行为跟踪和应用程序级恶意行为,利用特征选择算法提取关键行为特征,并通过集成学习方法对应用程序分类.该模型被证明在数据集上的有效性,并且分类性能好.

1.3 抗混淆的Android恶意应用检测

王兆国等人[11]选取抗混淆的资源文件和代码特征,通过计算高位空间距离,来判断恶意应用的家族信息,检测结果的正确率超过86.3%.焦四辈等人[12]基于文本内容,将选取图片文件、音频文件和布局文件作为特征文件,并针对3种特征文件的特点,提出了不同内容特征提取方法和相似度计算方法,并通过学习对其相似度赋予权重,进一步提高应用相似性检测的准确性.该方法可以准确识别重打包应用和含有已知恶意代码的应用.Ikram等人[13]提出了DaDiDroid,该系统基于API调用的加权有向图来检测混淆恶意应用,通过将API程序包抽象,并提取加权有向图特征,最终检测(混淆的)恶意应用.该系统DaDiDroid的性能优于MaMaDroid[7],通过对43 262个良性应用和20 431个恶意应用组成的数据集的检测,DaDiDroid对未混淆恶意应用准确率为96%,对于混淆后的恶意应用准确率达到91%.

本节主要介绍了基于静态分析的Android恶意应用检测、基于动态分析的Android恶意应用检测和抗混淆的Android恶意应用检测.通过对以往研究进行总结分析,我们发现,当前针对Android恶意应用的检测较少涉及对混淆后恶意应用的检测,抗混淆检测大多为Android恶意应用同源性分析.现有静态分析方法大多数基于API调用序列,利用API调用序列进行多种变换来提取所需要的特征,在这些方法中对组件特征涉及较少.因此,本文除了对正常的Android恶意应用进行检测后,还通过对正常数据集进行混淆来构建混淆数据集,测试本文的实验方法对混淆后恶意应用的检测效果.在特征选择上,本文选取在混淆前后不发生改变的Activity,Service,Intent等Android组件信息和危险权限,来得到静态特征.在机器学习方法上,随机森林方法、卷积神经网络等应用广泛,本文将选取多种机器学习方法进行比较,选出最佳分类方法.

2 抗混淆Android恶意应用特征分析与检测方法

2.1 系统设计

本文方法首先收集恶意应用和良性应用数据集,并分别选取数据集中的部分正常Android应用进行混淆,形成混淆数据集.之后,针对正常数据集和混淆后数据集中的每一个APK文件,都使用Cuckoodroid进行分析.然后,根据分析的结果,在每种特征都选出具体的部分特征来进行编码,接着,特征选取后,正常数据集和混淆数据集分别对数据集中的每一个APK文件进行编码,得到可以用于机器学习训练的CSV文件.最后分别对正常数据集和混淆数据集采取多种机器学习方法来训练,完成10折交叉验证,实现对恶意应用的判断.方法流程图如图1所示:

图1 本文方法流程图

针对动静态分析,本文经过调研选取了3种沙箱来进行比对.Cuckoodroid[14]能够完成动静态分析,且检测特征多样全面,但安装过程步骤繁琐,非常容易出错;MobSF[15]静态分析非常全面,但是动态分析需要人工交互来选择分析种类,并且动态与静态多有重叠,内容很少;Droidbox[16]沙箱能够完成动静态分析,但是动态分析内容过于少,所以本文结合各类沙箱优缺点,最终选择Cuckoodroid来作为本文方法的动静态分析环境.

接下来,本文将对Android混淆恶意应用分析、Android混淆恶意应用特征提取、特征编码和分布式分析方法进行介绍.

2.2 Android混淆恶意应用分析

混淆并不是让代码无法被反编译,而是将代码中的类、方法、变量等信息进行重命名,将它们改成一些毫无意义的名字.混淆代码可以在不影响程序正常运行的前提下增加逆向工程和破解的难度,大大提升了程序的安全性.Android中的混淆包括Java代码的混淆、Native(C&C++)代码的混淆和资源文件的混淆3种.

在Android代码混淆中,常用的技术有控制流平坦化、花指令、标识符混淆、字符串混淆等.其中,控制流平坦化是在不改变源代码功能的前提下,将if,while,for等控制语句转换成switch分支语句;花指令也叫垃圾指令,是在原始程序中插入的无用的但不会影响程序运行的指令;标识符混淆是使用无意义的标识符来替换源代码中的包名、类名、方法名和变量名;字符串混淆是对源程序中一些关键的字符串进行混淆,主要有Java层的字符串混淆和Native层的字符串混淆.

Android恶意应用通过混淆之后,源程序中Java代码、Native代码会发生改变,这对于Android应用程序代码的静态分析会造成一定的干扰.结合Android代码混淆机制,在混淆前后,Android组件、权限信息不发生改变,Android应用也可以正常运行.因此,本文选取的组件、危险权限特征适用于混淆代码的检测,同时,加上动态分析获取短信发送数量,作为混淆代码检测特征.

2.3 Android混淆恶意应用特征提取

本文基于Android分析结果,提取出权限、API调用、Service、Intent等静态特征和短信发送频率的动态特征.下面将对所提取的特征进行阐述.

2.3.1 权限

Android应用如果要在使用过程中获得权限,则必须在manifest.xml文件中申请相应的权限.系统权限分为4个保护级别,分别为正常权限、危险权限、签名权限和特殊权限.在本文方法中,重点关注危险权限.危险权限的使用会对用户数据资源读取或更改,也会影响其他应用的使用,例如读取通讯录和获取手机GPS定位,对用户信息安全造成威胁.危险权限在使用时,除了需要开发者在manifest.xml文件中申请,还需要用户的授权才能使用.但是由于大部分用户的安全意识比较薄弱,在安装Android应用程序时对程序所要求的权限都全部授予,并且有的Android应用在当用户不授予权限时,就不能正常使用,这也加重了危险权限的恶意性.一般情况下,恶意应用会申请比良性软件更多的危险权限,对一些敏感的数据或者资源来访问,实现恶意行为.并且,危险权限特征在代码混淆前后不发生变化,也可以适用于混淆代码的检测,因此,本文方法选择危险权限作为恶意应用检测特征[17].

2.3.2 API调用

应用程序通过调用系统API执行应用程序的命令,例如获取位置信息、发送短信、拨打电话、拍摄照片、网络连接等功能.API调用序列反映了Android应用的执行过程.利用工具获取API调用序列,对序列信息进行详细分析,能够获取应用程序执行的行为信息.良性应用和恶意应用对于使用的API调用类型及其频率都存在着差异.因此,本文方法选用API调用序列作为检测特征.

2.3.3 组件

Android恶意应用如果要执行恶意行为,是需要借助组件来完成的.Android的四大组件分别为Service,Activity,Intent,ContentProvider.Service在后台运行,可以为远程进程实现操作;Intent是消息传递对象,可以通过多种方式完成组件之间的交互;Activity负责与用户交互.在Android应用运行期间,这些组件相互交互,来协助应用程序实现功能.恶意应用要实现恶意行为,需要组件的交互完成.因此良性应用和恶意应用在组件的使用上都不尽相同,并且,当应用程序被混淆时,组件信息一般不发生改变.因此本文方法选用组件作为恶意应用检测特征[18].

2.3.4 短信发送数量

发短信在人们日常生活中是一种很重要的远程沟通方法,但是Android恶意应用开发者会发送付费短信来实现恶意吸费以及窃取用户数据.并且,恶意应用会发送不止1条短信,而良性应用发送1条或者不发送短信.短信内容长度不一,内容差别大,例如,恶意应用A发送了内容为“A N T 8 0 8 1 9 4 0 2 0 1 2 - 0 9 - 1 1 1 1 : 5 6 : 5 9”的短信,良性应用B发送了内容为“AB”的短信.此外,代码混淆不改变程序的执行结果,在混淆之后,Android恶意应用还会对特殊号码发送短信.故本文方法选择短信发送数量作为检测特征之一.

2.4 特征编码

在2.3节中主要介绍了本文方法将选取的主要特征种类.对于每种特征来说,本文将根据恶意应用和良性应用在特征使用上的差异来进行挑选.本文将数据集中各个Android应用程序的分析结果中选取的特征进行统计,选用175种危险权限特征、500种Activity组件特征、79种API调用特征、200种反射API调用特征、150种Intent特征、200种Service特征和短信发送频率特征,一共1 305种特征.除去API调用和反射API调用以及短信发送这3类特征使用出现的频率编码外,其余用0表示不存在该种特征,1表示存在该种特征.

针对危险权限特征,本文将数据集中所有应用程序申请的危险权限进行统计,选取其中调用次数最多的175种危险权限,最多的次数有10 583;针对Activity,本文选取了前500种使用次数最多的Activity,峰值为1 715;针对API调用,本文选取了其中调用次数最多的前79个作为选取的特征,最高为8 924;针对反射API调用,本文选取了其中调用次数最多的前200个作为选取的特征,峰值为3 559;针对Intent组件,本文选取了其中调用次数最多的前150个作为选取的特征,最多次数为2 654;针对Service组件,本文选取了其中调用次数最多的前200个作为选取的特征,峰值为620.

2.5 分布式检测方法

本文选用Cuckoodroid作为Android应用分析工具.Cuckoodroid工具基于Xposed框架,具有反检测功能,当APK文件被分析完成后,分析结果存在mongodb数据库中,即json文件.在实验中,Cuckoodroid分析1个APK文件用时10 min左右,总的数据集有1万多个APK文件,在1台机器上逐个分析APK文件耗费时间太长,因此为了节省时间,选择在多台虚拟机中配置Cuckoodroid,实现分布式分析.

分析过程分为主机和虚拟机.主机负责给虚拟机分配APK文件和汇总分析好的结果,虚拟机负责完成APK分析任务.在分析开始前,对每台虚拟机建立快照,主机内存储着全部需要分析的APK样本.当开始分析时,先将1台空闲的虚拟机恢复到快照状态,主机将1个APK样本传到该台虚拟机内,开始对APK文件进行分析.当分析完成后,虚拟机传给主机分析之后的结果,并告诉主机自己处于空闲状态.在分布式分析的实现中,主机负责给未执行分析任务的虚拟机分配发送APK文件,并接收来自虚拟机的分析结果(json文件);虚拟机在接收主机发送的APK文件后,利用Cuckoodroid沙箱负责具体实现Android应用的分析,并将分析结果发送给主机.其流程图如图2所示:

图2 APK分析流程图

3 实验结果分析

3.1 实验数据集

本文使用的实验样本包括以下2个部分:从Drebin[19-20]收集的5 538个恶意APK文件和从androzoo[21]中收集了5 388个良性APK文件.其中Drebin数据集一共收集了5 560个样本、178个恶意应用家族,Drebin团队也鉴于该数据集提取静态特征对Android恶意应用分类.androzoo数据集从Google Play等多个应用市场下载,并逐一在VirusTotal上面检测,本文选择VirusTotal引擎检测不多于3的样本作为良性样本.同时,选取了450个良性APK文件和450个恶意APK文件,借助AndResGuard工具[22],该工具将原本冗长的资源路径变短,例如将res/drawable/wechat变为r/d/a,对其进行混淆处理.对于2种数据集,本文均采用10折交叉验证的方式训练.

3.2 训练结果

3.2.1 特征重要度评估

本文选取的数据集有1 305种特征,为了查看每种特征在模型中发挥的重要程度,本文借用随机森林对特征重要度进行评估,即计算每种特征在随机森林的每棵树上的贡献值,并取平均值与其他特征进行比较.由于本文特征众多,无法一一展示,故选取了重要程度前20的特征进行展示.

从图3可以看出,危险权限占据较大的比重,例如android.permission.SEND_SMS与发送短信相关,排名第一,重要程度值为0.099 788,相当于1/10,android.permission.READ_PHONE_STATE与手机状态相关,重要程度值为0.053 490;本文选取的API特征也占据着较大的重要程度,例如java_io_File_exists位于第5位,重要程度值为0.023 445.其余与Service,Activity,Intent相关的特征重要程度也占据着重要的值,短信发送数量排名35,重要程度为0.005 846.所有的特征重要程度值反映了系统在对Android应用程序是良性还是恶意时所发挥的作用,危险权限和API调用也是重要程度最高的2种特征.此外,本文选取的特征中也存在特征重要程度为0的情况,在之后的改进中,系统将对特征重要程度为0的特征进行筛除,提高检测效率.

图3 特征重要程度

3.2.2 正常训练集

本文选用了随机森林、决策树、卷积神经网络和SVM这4种机器学习方法来训练数据集.为了评价它们训练结果的优劣性,选取准确率、AUC值、召回率和F1值来评判.

通过10折交叉验证之后得到了4种机器学习方法的训练结果.如表1所示:

表1 正常训练集训练结果

通过对10折交叉验证实验结果的分析可知:在本文所涉及的数据集和检测方法中,随机森林的检测结果优于其他3种机器学习方法.该方法对于正常数据集的训练结果中,准确率达到95.77%,表明良性样本和恶意样本都能正常分类;召回率达到0.953 1,查全率较高;AUC值也达到了0.958 1,模型效果好,F1值为0.959 1,模型的稳健性较好,通过对4项指标的比较,模型对于良性样本和恶意样本的分类能力几乎相同,差异很小,模型的分类能力较强.

图4展示了4种机器学习方法的ROC曲线,从图4可以看出,在10折交叉验证的实验中,随机森林的曲线变化程度要小于其他3种机器学习方法,这进一步说明了随机森林方法对于数据集的变化,其实验结果相对受影响更小一些.相对于其他机器学习方法,随机森林的ROC曲线的敏感性和特异性较高的临界值更接近于坐标轴的左上方,表明恶意样本被正确预测的概率越高,准确性越高.

图4 ROC曲线

3.2.3 混淆训练集

对于混淆训练集,本文选取了决策树、随机森林、卷积神经网络和SVM这4种机器学习方法来进行训练.在10折交叉验证得到训练结果后,本文选取准确率、AUC值、召回率和F1值来进行评价机器学习结果的优劣,如表2所示.

通过比较4种机器学习方法的训练结果,可以看出,对于混淆数据集,随机森林方法要优于决策树、卷积神经网络和SVM,准确率达到0.910 1.混淆数据集的训练结果,由于数据集的数量比正常训练集少以及API调用被混淆,比正常训练集的训练结果的准确率和AUC值都要低.从实验结果来看,准确率为91.01%,模型能较为正确地分类良性和恶意样本;召回率为0.786 3,该值偏低,再结合其他指标来看,表明本实验对良性样本的分类结果比恶意样本要好.F1值是召回率和精确率的结合,该值为0.837 7,表明模型的稳健性较好.

表2 混淆训练集训练结果

图5展示了混淆数据集在经过4种机器学习方法10折交叉验证得到的ROC曲线,从图5可以看出,在10折交叉验证的实验中,4种机器学习方法的曲线变化程度都很大,随机森林方法比其他方法的曲线变化程度都小,则其在10折交叉验证中,随着每一次训练集和测试集的变化,要比其他方法更稳定.随机森林的ROC曲线的敏感性和特异性较高的临界值更接近于坐标轴的左上方,曲线更贴近Y轴,表明恶意样本被正确预测的概率越高,准确性较高.在ROC曲线比较上,经过混淆的ROC曲线的稳定性要明显低于未经过混淆的ROC曲线的稳定性,除去数据集大小的影响外,未混淆的数据集能够更有效利用API调用这一特征,这也表明在之后的研究中可以针对混淆数据集提取更多的特征来提高训练的鲁棒性和有效性.

图5 混淆ROC曲线

结合正常数据集和混淆数据集来说,随机森林的性能要优于决策树、卷积神经网络和SVM.随机森林是决策树的集成方法,SVM方法过于简单,不适用于本实验中检测特征较多的数据集,卷积神经网络存在着过拟合现象,因此,综合来讲,随机森林方法更适用于本实验的数据集;在检测结果上,本文对正常数据集的检测结果准确率达到95.77%,本文对混淆数据集的检测结果准确率达到91.01%,均取得了不错的效果.实验结果表明本文选取的特征可以有效检测Android恶意应用.

4 总 结

在本文中,通过在多台虚拟机中搭建Cuckoodroid实现分布式分析.之后,本文利用分析之后的结果,选取了危险权限、敏感API调用、服务、Intent、Activity等组件信息和短信频率作为检测特征,一共1 305种特征.其中,危险权限和服务等组件信息在混淆前后不发生变化,使得模型能对混淆后的Android应用进行检测.最后使用随机森林、决策树、SVM和卷积神经网络4种机器学习方法分别对未混淆的和经过混淆的数据集进行训练.实验表明,本方法有较高的准确率和AUC值,模型的稳健性较好.此外,在之后的工作中,将继续寻找其他特征来完善本系统,提高系统的分类能力.

猜你喜欢
调用静态组件
无人机智能巡检在光伏电站组件诊断中的应用
最新进展!中老铁路开始静态验收
静态随机存储器在轨自检算法
新型碎边剪刀盘组件
U盾外壳组件注塑模具设计
核电项目物项调用管理的应用研究
LabWindows/CVI下基于ActiveX技术的Excel调用
基于系统调用的恶意软件检测技术研究
风起新一代光伏组件膜层:SSG纳米自清洁膜层
油罐车静态侧倾稳定角的多体仿真计算