基于特征选择的恶意Android应用检测方法

2023-11-20 10:58潘建文张志华林高毅崔展齐
计算机工程与应用 2023年21期
关键词:特征选择良性特征

潘建文,张志华,林高毅,崔展齐

北京信息科技大学 计算机学院,北京 100101

随着移动互联网的快速发展,社交通讯、金融证券、游戏娱乐和电子商务等应用逐渐从PC 端转向移动端,使得移动设备数量呈现指数型的增长,成为了人们生活不可或缺的一部分。其中,Android 系统由于其开放性和应用分发平台的多样性受到人们的青睐。据国际数据公司(IDC)调查报告[1],2021年Android手机占84%的市场份额,iPhone仅占16%。

虽然Android 系统广泛应用,但是由于Android 的开源特性和缺乏有效审核的第三方Android 应用市场,使得Android 恶意应用广泛传播。据《2020 年中国互联网网络安全报告》[2],2015—2020年,移动互联网中恶意应用样本数量持续高速增长,仅2020年就新增移动恶意应用样本约303万个,同比增长8.5%,运行于Android平台的恶意应用占100.00%。这些恶意应用使用户的隐私数据和经济利益受到严重侵害。为此,针对恶意Android应用的检测技术引起了学术界和工业界广泛关注。

根据是否运行Android 应用程序,可将现有的恶意Android 应用检测技术分为动态检测和静态检测。其中,动态检测[3-4]需要在模拟器或真实设备中运行应用,并编写测试脚本模拟用户操作,并根据应用运行中的交互、资源访问、系统调研和网络流量等行为特征判断是否为恶意应用。动态检测的优点是可以有效检测使用了代码混淆、加密和反编译对抗等代码保护技术或代码热更新技术的恶意应用[5],缺点是测试脚本难以覆盖应用的全部功能,全面收集应用运行的行为信息也较为困难,导致动态检测耗时较长、漏报率较高。静态检测的优点是代码覆盖率高、效率高、不依赖于运行环境、适用范围较广,缺点是难以准确提取采用了代码保护技术或代码热更新技术的恶意Android应用特征。本文主要关注静态恶意Android应用检测方法。静态检测通常使用静态分析技术提取Android应用的权限(permission)、应用编程接口(application programming interface,API)、意图(Intent)和四大组件等特征,采用随机森林(random forest)、K 近邻(K-nearest neighbor,KNN)、支持向量机(support vector machine,SVM)和决策树等机器学习算法进行检测恶意应用。然而,Android 10 版本(API 等级29)中Android API(Android developer documentation.https://developer.android.com/reference)特征共计33 587个,且随着Android版本的升级,API和权限的数量还在不断增加。这些数以万计的静态特征直接用在机器学习算法中,可能会导致“维度灾难”、模型复杂程度增加、准确率下降和模型训练时间长等问题[6-7]。

针对上述问题,本文提出一种基于特征选择的恶意Android应用检测方法Droid-TF-IDF:首先,通过静态分析分别提取权限、API 和操作码3 类特征,形成特征集;然后,根据良性应用和恶意应用每个特征的TF-IDF 值计算其Droid-TF-IDF值,并进行排名;最后,根据Droid-TF-IDF值进行特征选择,构建恶意Android应用检测模型,以提升检测性能和效率。权限、API 和操作码是静态恶意Android应用检测方法中较为常用的特征[8],这3类特征有较大的差异性,可从不同的角度表征Android应用。因此,Droid-TF-IDF分别使用权限、API和操作码来验证所提出基于特征选择的恶意Android应用检测方法的有效性。在来自Google Play 和VirusShare 的数据集上进行的实验结果表明,使用Droid-TF-IDF 对权限、API和操作码3类特征进行选择,在分别减少60%、80%和30%的特征时F1值最高。

本文的主要贡献总结如下:

(1)提出了一种基于特征选择的恶意Android 应用检测方法Droid-TF-IDF,分别选择在良性应用数据集和恶意应用数据集中TF-IDF差值最大的权限、API和操作码3类特征。

(2)基于Droid-TF-IDF实现了原型工具,并在3 006个应用样本上进行了实验,实验结果表明,本文所提出的方法可以有效减少所需的特征维度,提升恶意Android应用检测的性能和效率。

1 相关工作

根据所使用特征的不同,可将常见的Android 恶意应用静态检测方法分为:基于权限、基于API 和基于操作码的检测方法。

基于权限的恶意Android应用检测方法。恶意应用经常使用危险的权限组合执行恶意行为,为此,Arora等人[9]提出了基于权限对的恶意Android 应用检测方PermPair,提取恶意数据集和良性应用集中的权限对构建权限对图,并设计了权限对图比较算法检测恶意应用。Amer[10]提出了基于权限特征的集成学习投票方法,收集良性应用和恶意应用常使用的特征组合,集成随机森林、多层感知机、AdaBoost、SVM和决策树分类模型,采用多数投票的方法检测恶意应用。Ilham等人[11]使用所有权限作为特征,采用决策树、SVM和随机森林模型进行比较,并使用特征子集评估器、信息增益比率和信息增益特征选择算法选择特征子集,实验结果表明该特征选择方法并没有提升检测准确率。

基于API 的恶意Android 应用检测方法。Scalas 等人[12]提出了基于包、类和函数3种粒度的API检测方法,可有效检测勒索应用及其他恶意应用,其中,使用类和函数粒度的API检测恶意应用准确率更高,并对字符串加密等混淆策略具有更强的鲁棒性。邵舒迪等人[13]提取敏感权限和敏感API,并构建支持向量机和KNN模型进行恶意Android应用检测。该方法所提取的敏感特征只有30个,特征数量偏少,存在遗漏其他重要特征的可能性,影响检测准确率。Zhang 等人[14]提出构建API 关系图的方法APIGraph,关系图中的节点代表API,边代表API间的调用关系,使用API嵌入和图聚类检测恶意应用,该方法实现较为复杂且耗时较长。Xu 等人[15]提出了基于API 语义距离减少模型老化的方法SDAC,首先FlowDroid 提取API 调用路径,通过API 上下文滑动窗口生成语义距离,并聚类形成API 簇特征集,然后在检测阶段识别新的API 语义距离,聚类扩展特征集,最后采用新的特征集和模型检测恶意Android 应用,实验表明该方法可长时间保持较高的检测性能。徐开勇等人[16]采用人工蜂群算法对Android静态和动态特征进行选择,得到了最优的特征序列,实验表明该方法在恶意Android应用检测方面能够有效减少特征维数并提升检测效率和准确率。Peynirci 等人[17]提出基于IDF 值的特征选择方法,计算良性应用和恶意应用权限、API 和字符串(String)3 类特征的逆文档频率(inverse document frequency,IDF)差值,该方法与本文工作相似,但是只计算了特征的IDF 值,而没有考虑到这3类特征在应用中出现的频率,由于缺少特征的词频(term frequency,TF)值,该算法无法有效选出最优的特征子集。

基于操作码的恶意Android 应用检测方法。McLaughlin等人[18]通过静态分析提取操作码序列,并构建操作码嵌入层、卷积层和分类层3层架构的卷积神经网络算法(convolutional neural networks,CNN)检测恶意应用。Xiao[19]以十六进制格式提取操作码序列,范围从00 到FF,对应着十进制格式的0~255,将连续的3 个操作码映射成为单个图片RGB 数值,操作码序列映射成图片颜色矩阵,再构造卷积神经网络模型检测恶意Android应用。Yuan等人[20]将字节码序列转换为马尔可夫图像,并使用深度卷积神经网络检测恶意应用。现有单类型特征表征恶意应用的能力有限,Qiu 等人[21]在操作码特征序列基础上,结合了人工先验知识筛选下的部分权限和API 调用特征,共计149 维,通过深度神经网络对已知恶意应用家族的学习,以识别具有相同功能的恶意Android 应用,其方法在特征选择方面有可提升的空间。

上述恶意Android 应用检测工作中可以看出,特征提取和选择是恶意Android 应用检测的重要步骤,通过覆盖较多的特征或通过Android应用的先验知识筛选特征,可取得较好的检测性能,但是存在部分冗余或遗漏重要特征的情况,可能会影响模型性能。所以有必要对特征进行降维,保留相关性强且具有代表性的特征,以提升模型检测性能并降低时间消耗。为此本文提出基于特征选择的恶意Android 应用检测方法Droid-TFIDF,对Android 应用中提取的权限、API 和操作码3 类特征进行选择,以提升对恶意Android 应用检测性能和检测效率。

2 基于特征选择的恶意Android应用检测方法

本文提出一种基于特征选择的Android应用检测方法Droid-TF-IDF,方法流程如图1所示,主要由3部分组成:特征提取、特征选择和恶意应用检测。首先通过静态分析分别提取权限、API和操作码3种类型的特征,形成特征集;然后分别计算每种类型中每个特征的Droid-TF-IDF值,并进行排名;最后根据Droid-TF-IDF值排名选出前k%的特征,用来构造随机森林、SVM和CNN等模型进行恶意应用检测。

图1 基于特征选择的恶意Android应用检测方法Fig.1 Android malware detection method based on feature selection

2.1 特征提取

本文使用Apktool工具(Apktool,https://ibotpeaches.github.io/Apktool/documentation)反编译Android 可执行文件APK,反编译后的结构如图2 所示。反编译后可以得到AndroidManifest.xml 文件和Smali 等文件,在AndroidManifest.xml 文件中提取权限特征,在Smali 文件集中提取AndroidAPI 和操作码序列,并保存提取后的权限、API和操作码特征。

图2 APK反编译结构Fig.2 APK decompile structure

对采用了加固技术的Android 应用,可使用应用脱壳等技术提取加固的应用特征;对采用代码热更新技术的恶意应用,热更新的部分特征无法提取,会影响到热更新部分的API特征提取,但对权限和操作码特征影响较小。

(1)权限。Android利用权限机制保护用户的隐私,开发人员在AndroidManifest.xml 文件中根据应用的功能向用户申请权限。在权限提取过程中,可以根据文件中的标签属性值提取权限特征。Android在6.0版本(API等级23)中引入了运行时权限,即应用运行过程中由用户决定是否授予敏感权限。由于良性应用和恶意应用可能会申请同样的权限,有较大的误报率,所以基于权限的检测方法只能简单判断是否是恶意应用。例如电话应用,申请了CALL_PHONE(拨打电话)、READ_PHONE_STATE(读取手机状态)、INTERNET(互联网)和READ_CONTACTS(读取联系人)的权限,无法直接判断该应用是否会将个人敏感信息上传至服务器。

(2)API。申请并获取Android 权限后,恶意应用通过调用API 来危害用户的隐私利益。良性应用和恶意应用在API 数量和调用频率方面有着明显差异,这为Droid-TF-IDF 特征选择方法检测恶意应用提供了依据。Smali文件是反汇编语言对虚拟机字节码的一种解释,每个Smali文件代表一个Java类,里面包含了应用程序的API调用和操作码。如图3所示,本文提取包名、类名和方法名为一个API,不考虑方法参数和返回值类型。图4 为拨打电话恶意应用APK 反编译后的部分smali 代码示例,以invoke 开头的操作码表示API 调用,从中提取的API 集合为{android.net.Uri.parse,android.content.Intent.setData}。

图3 API提取示例Fig.3 Example of API extraction

图4 部分Smali代码示例Fig.4 Snippet of Smali code example

(3)操作码。Android APK 运行在Android Runtime虚拟机(前身是Dalvik)中。虚拟机中存在指令集,如数据操作指令、跳转指令和计算指令等,这些指令就是操作码,用来操作虚拟机中的寄存器。除弃用的操作码外,经统计,共计218 类,本文采用文献[18]中所提到的操作码和数字之间的映射关系,提取过程中,将操作码序列转为由0到255的16进制数字序列,以供之后将映射后的数字序列输入到深度卷积神经网络中进行训练。以图4为例,提取后的操作码集合为{new-instance,

const-string,invoke-static,move-result-object,invoke-virtual,move-object,return-void},操作码集合映射后的数字序列为{22,1a,71,0c,6e,07,0e}。

2.2 特征选择

在提取权限、API和操作码3类特征后,计算每种类型中每个特征的Droid-TF-IDF值,并进行排名形成特征集合,根据排名选出Droid-TF-IDF值前k%的特征。

2.2.1 TF-IDF

TF-IDF是一种词频(term frequency)和逆文档频率(inverse document frequency)相结合的统计方法,主要思想是,假设Android 应用数据集包含多个Android 应用,这个数据集中某个应用的某个特征在当前应用出现多次,而在其他应用出现的比较少,则该特征是比较重要的。

TF-IDF 值为TF和IDF的乘积,如果一个特征在整个应用数据集中有较低的频率,但是在一个应用中,有较高的频率,那么这个特征有较高的TF-IDF值,可用于评估各类特征的重要性,应用di的特征ti,j在数据集D中的TF-IDF值如计算公式(3)所示:

2.2.2 Droid-TF-IDF

与传统的TF-IDF 方法不同,本文选择在良性应用和恶意应用中TF-IDF 值相差最大的特征,即良性应用出现频率最高/低而恶意应用出现频率最低/高的特征。由于单个特征在每个应用中TF-IDF 值可能不同,所以首先计算单个特征在良性应用和恶意应用中的TF-IDF平均值,然后对其做差,由于部分特征在恶意应用中的TF-IDF 平均值大于良性应用的TF-IDF 平均值,这部分特征的差值为负数,需对负数取绝对值,最终的结果就是这个特征的Droid-TF-IDF值。

良性应用数据集Db={ }db,1,db,2,…,db,i,… 和恶意应用数据集Dm={ }dm,1,dm,2,…,dm,i,… 中,特征t在良性应用集中的TF-IDF平均值为:

分别对权限、API 和操作码3 类中的每个特征计算Droid-TF-IDF 值并进行排名,然后选择前排名k%的特征作为特征子集输入到模型中。

本文进行特征选择过程分为:首先计算特征集合中每个特征在良性应用和恶意应用中的TF-IDF 值;然后通过特征在数据集中的平均TF-IDF 值计算Droid-TFIDF 值;最后根据Droid-TF-IDF 值排名并选择排名前k%的特征。Droid-TF-IDF特征选择过程如算法1所示,具体解释如下:

(1)计算TF-IDF 值。第1 行,初始化存放特征及对应Droid-TF-IDF 值的MapDTS;第3 行和第7 行,分别遍历良性应用集合Db和恶意应用集合Dm;第4 行和第8行,分别用公式(3)计算特征t在单个良性应用和恶意应用中的TF-IDF值。

(2)计算Droid-TF-IDF 值。第6 行和第10 行,分别计算特征t在良性应用集Db和恶意应用集Dm中的TF-IDF平均值;第11行和第12行,使用公式(4)计算特征t的Droid-TF-IDF值,并加入DTS。

(3)特征选择。第14 行,将DTS中的特征根据Droid-TF-IDF 值进行降序排序,选择排名前k%的特征作为特征子集T′并返回,用于训练恶意应用检测模型。

本文进行特征选择过程分为:计算特征集合中每个特征在良性应用和恶意应用数据集中的TF-IDF 平均值;然后计算每个特征的Droid-TF-IDF 值;最后根据Droid-TF-IDF 值排名并选择排名前k%的特征,具体如算法1所示:

算法1 Droid-TF-IDF特征选择算法

3 实验设计和结果分析

3.1 实验设计

为了验证Droid-TF-IDF 特征选择方法检测恶意Android应用的能力,考虑样本数据类别不平衡的问题,本文参照文献[22]中实验数据集的数量和比例,实验选取了2 004个良性应用和1 002个恶意应用作为数据集。恶意应用来自恶意软件样本库VirusShare(Virushare.https://virusshare.com.)中的恶意Android 应用,随机选择其中的1 002 个用于实验;良性应用通过编写Python爬虫,爬取Google Play 应用市场上多种类别中的Top 200 应用,共计3 958 个良性应用,除去采用应用加固代码保护技术的应用后还剩3 914个,从其中随机选择2 004个用于实验。

在实验中,分别计算权限、API和操作码3类特征的Droid-TF-IDF值,选择前k%的特征作为特征集(k值以10 为步长增长),并使用不同的模型进行恶意应用检测。鉴于文献[11,13,16]随机森林算法和SVM 算法在权限和API 上有较好的效果,所以在本文的权限和API实验中使用Python 中Scikit-learn 工具包下的随机森林算法和支持向量机算法进行10 折交叉验证评估;操作码实验采用文献[18]中的CNN实验参数配置构建模型,CNN模型分为6层:分别是Embedding层、卷积层、卷积层、池化层、全联接层和Softmax层,采用10折交叉验证评估。

实验的硬件环境为Intel®Core™ i7-9750H CPU 2.6 GHz,16 GB RAM;软件环境为MacOS Catalina,Python3.7.4。

3.2 评估指标

本文的评价指标从准确率(Accuracy)、精确率(Precision)、召回率(Recall)和F1值(F1-measure)、模型的检测时间、特征选择时间和总时间7个方面进行评价。前4 个评价指标可以通过混淆矩阵得到,混淆矩阵如表1所示。

表1 混淆矩阵Table 1 Confusion matrix

准确率(Accuracy)代表的是系统对整个样本的检测能力,即将恶意应用检测为恶意应用,将良性应用检测为良性应用的能力,如计算公式(5)所示:

精确率(Precision)代表的是实际为恶意应用个数占检测为恶意应用个数的比例,如计算公式(6)所示:

召回率(Recall)代表的是被正确识别出来的恶意应用个数与测试集中所有恶意应用个数的比值,如计算公式(7)所示:

F1-measure是精确率和召回率的调和平均值,更为平衡地反应算法的精确度,如计算公式(8)所示:

模型的检测时间是构建模型对特征选择后不同比例的特征进行验证评估的时间;特征选择时间是计算各个特征的Droid-TF-IDF 值,并进行排名所消耗的时间;总时间是模型检测时间和特征选择时间之和。

3.3 实验结果及分析

实验提取并计算权限、API和操作码中每个特征的Droid-TF-IDF值,根据Droid-TF-IDF值采用不同比例的特征子集,并构建随机森林、SVM和CNN模型,进行基于权限特征和基于API 特征和基于操作码特征的恶意Android应用检测。

表2 统计了Android 10 版本中的各类特征与实验中提取到的特征对比情况。可以看到,实验中权限特征为125 种,占权限特征总数的80.6%;API 特征为17 752种,占API 特征总数的52.4%;操作码特征为212 种,占操作码特征总数的97.2%。

表2 Android 10版本各类特征与实验中提取的特征对比Table 2 Comparison of features in Android 10 version and experimental subjects

提取权限、API 和操作码特征后,分别计算每类特征的Droid-TF-IDF 值,并进行排名,其中表3 为Droid-TF-IDF 值最高的10 项权限、API 和操作码。权限与文献[13]中的高危权限有5 项重合,分别是SEND_SMS、RECEIVE_SMS、READ_SMS、READ_PHONE_STATE和WAKE_LOCK,前3 项是跟短信有关的权限,这是由于短信权限被恶意应用广泛使用;API 特征中android.content.Context.getPackageName 和android.app.Application.onCreate 是获取应用包名和应用初始化配置,这两个特征更多使用在良性应用中,而android.content.Context.getAssets、android.content.res.AssetManager.open 和android.content.Context.getFilesDir特征与文件和资源相关,常常出现在恶意应用中;操作码则很难通过单一的特征判断某一应用是否是恶意应用。

表3 Droid-TF-IDF值最高的10项权限、API和操作码Table 3 Top 10 permissions,APIs and opcodes in terms of Droid-TF-IDF

在基于权限特征对恶意Android 应用检测实验中,提取权限特征,计算其Droid-TF-IDF 值并进行排名后,分别用随机森林和SVM 模型进行检测,实验结果如表4、表5 所示,黑色加粗文本表示单项结果取得最高值。实验选择100%的特征时,无需进行特征选择,所以特征选择时间消耗为0。在随机森林模型检测中,前40%的权限子集在准确率、精确率、召回率和F1值中均达到最高,并且总时间比不进行特征选择时间减少14.8%;在SVM 模型中,选择前40%和前80%的权限准确率和F1值达到最高,并高于随机森林模型。采用排名前40%的权限时,检测总时间消耗降低了33.7%。在基于权限的恶意应用检测实验中,SVM 模型各项评估指标略优于随机森林模型,对检测恶意应用有更好的效果。

表4 基于权限特征的随机森林模型检测结果Table 4 Detection results of random forest model based on permission

表5 基于权限特征的SVM模型检测结果Table 5 Detection results of SVM model based on permission

在基于API 特征检测恶意Android 应用的实验中,表6、表7 为随机森林和SVM 模型进行检测的实验结果,随机森林模型中选取前20%时精确率和F1值最高;SVM 模型检测结果中,可以看到该方法仅选择前10%时,准确率、精确率、召回率和F1值均达到最高,和不进行特征选择相比,模型取得同样性能的前提下,节省了90.4%的时间消耗。在选择前10%的API 时召回率最高,仅需10%的特征和更少的时间即可在测试集中检测出最多的恶意应用。在选择100%的特征时(17 752 个特征),采用随机森林模型的时间比SVM 模型时间少76.554 s。因此在特征数量庞大的情况下,随机森林模型检测效率更高。

表6 基于API特征的随机森林模型检测结果Table 6 Detection results of random forest model based on API

表7 基于API特征的SVM模型检测结果Table 7 Detection results of SVM model based on API

基于操作码的恶意应用检测实验参照文献[18]的方法和参数配置构建CNN模型。在检测前,对前8 192个操作码进行特征选择,将特征选择后的操作码输入到CNN 模型中的Embedding 层中,最后通过Softmax 层输出检测结果,表8展示了基于操作码的恶意应用检测结果。操作码特征选取前70%四项评估指标均达到最高,准确率和召回率95.7%,精确率和F1 值95.8%,时间开销比未进行特征选择的时间开销多7.5%,这是由于在CNN 模型中,无论是否进行特征选择都需要遍历前8 192个特征。

表8 基于操作码特征的CNN模型检测结果Table 8 Detection results of CNN model based on opcode

表9 展示了基于权限、API 和操作码的恶意应用检测实验得到最高F1值时,F1值、检测时间和特征数量的对比结果。在权限、API 和操作码分别选取前40%(SVM 模型)、20%(随机森林模型)和70%(CNN 模型)的特征时F1 值最高;其中使用API 特征的最高F1 值为98.6%,分别比权限和操作码特征高3.8和2.8个百分点;特征数量分别是62、3 550 和149 个;从检测时间上看,权限特征的检测时间最短,API 的检测时间次之,操作码的检测时间最长。综合上述实验结果,本文的特征选择方法与传统方法相比,权限和API特征可以在特征维度降低前提下,有效地提升恶意Android 应用检测模型的检测性能,并降低时间消耗;操作码经过特征选择后,在CNN 模型中各项评估指标都有所提升,仅时间开销略微增大,本文的方法可以更有效地检测出恶意Android应用。

表9 基于权限、API和操作码特征的检测结果Table 9 Detection results of permission,API and opcode

4 结束语

本文提出了基于特征选择的恶意Android应用检测方法Droid-TF-IDF,可对权限、API和操作码3类静态特征进行特征选择,并基于选择出的特征子集构建随机森林、SVM 和CNN 模型检测恶意Android 应用。实验结果表明,该方法可以有效提升模型的检测性能和降低时间消耗。在本文研究的基础上,下一步将探索结合多类特征进行更加有效的特征选择,并与动态检测方法结合,以进一步提升恶意应用检测的性能和效率。

猜你喜欢
特征选择良性特征
走出睡眠认知误区,建立良性睡眠条件反射
呼伦贝尔沙地实现良性逆转
如何表达“特征”
不忠诚的四个特征
抓住特征巧观察
Kmeans 应用与特征选择
基层良性发展从何入手
联合互信息水下目标特征选择算法
甲状腺良性病变行甲状腺全切除术治疗的效果分析
基于特征选择和RRVPMCD的滚动轴承故障诊断方法