基于集成学习的Android恶意软件动态检测系统

本文介绍2018年发表在IEEE Access的一篇文章,题目是《A Novel Dynamic Android Malware Detection System With Ensemble Learning》,DOI信息在这里

在这篇文章中,作者提出一个叫做EnDroid的动态分析框架,目的是基于多个动态行为特征实现高精度的恶意软件检测。EnDroid使用了特征选择算法与集成学习(ensemble learning),将噪声、冗余的特征过滤掉,并综合多个模型的输出结果,以提高分类效果。

摘要

随着Android智能手机的广受欢迎,以Android平台为目标的恶意APP大量增加。提出高效的Android恶意软件检测方法以阻止恶意软件的传播成为一个紧要的问题。通过静态和动态分析提取的各种特征结合机器学习算法,已经成为大规模恶意软件识别的主流。一般来说,静态分析在检测采用加密或动态代码加载等复杂混淆技术的APP时无效。但是,动态分析适合处理这些逃避技术。

在本文中,作者提出一个叫做EnDroid的动态分析框架,其目的是基于多个动态行为特征实现高精度的恶意软件检测。这些特征覆盖了系统级别的行为追溯与应用级别的恶意行为(如个人信息窃取、订阅付费服务与恶意服务通信)。此外,EnDroid使用特征选择算法,移除噪声特征与冗余特征,并提取关键的行为特征。EnDroid通过运行时(runtime)监控提取行为特征,通过集成学习算法区分恶意和良性应用。通过实验,作者在两个数据集上证明了EnDroid的有效性。此外,作者发现Stacking方法取得了最优的分类结果,并在Android恶意软件检测中具有广阔的应用前景。

简介

IDC的统计表明,Android在2017年的第一季度占据智能手机市场的85%。通过来自不同应用市场的百万级别的APP,Android用户能够体验到丰富的功能,例如即时通讯、基于位置的服务、在线购物与游戏。不幸的是,搭载Android操作系统的智能手机越来越多地成为网络犯罪的目标,被恶意APP感染。通过允许从不可信的第三方市场安装APP,Android平台能够轻松被带有恶意软件的APP攻击。McAfee的报告显示,在2017年的第一季度,移动恶意软件的总数超过1.6千万。迫切需要有效、高效的恶意软件检测方法来防止恶意APP的扩散。

Android平台提供了若干种安全机制,以限制恶意软件的功能,其中最突出的是Android权限控制机制。要执行某些敏感操作,如获取联系人信息,APP必须显式声明这些操作所需的权限,并获得用户的同意。然而,这种机制要求开发人员和用户都承担重要的责任。开发人员需要遵循最小特权集原则来指定所请求的权限,用户应该理解授予某些权限的风险。大多数用户通常盲目地向任意APP授予权限,从而破坏了权限机制的效果。因此,权限控制机制难以限制恶意APP的传播。

机器学习技术与程序分析技术相结合,能够自动推断应用程序的行为属性,已成为恶意应用程序识别的主流。这些程序分析技术大致可以分为静态方法和动态方法。静态分析有利于快速扫描和检查恶意应用程序。为了逃避静态分析,许多恶意应用程序采用了一系列变形技术,如字节码加密、反射和本地代码执行。这些转换技术极大地挑战了静态分析方法。与此相反,通过监视应用程序在真实或虚拟环境中的运行时行为来执行动态分析,由于其抵抗代码转换技术的能力而变得很有前途。

在本文中,作者聚焦于运行时监控和分APP的多类型行为特征,并实现高效的恶意软件检测。作者进行了广泛的动态分析,提取了涵盖各种恶意行为的特征,如个人信息窃取、付费服务订阅、恶意服务通信,以及复杂的反分析技术,如恶意代码加密和动态代码加载。文献指出,系统调用在最低层描述设备的行为。此外,APP执行的任何操作最终都将转换为系统调用序列。因此,作者集成了APP的系统调用跟踪来处理对系统或APP造成破坏的恶意行为,如进程跟踪、阻塞进程信号或干扰其他进程的执行。

考虑噪声、无关和冗余特征的存在,文章采用卡方特征选择算法提取关键行为特征。通过集成学习,作者实现了一种新的动态分析系统EnDroid,该系统能够对恶意APP和良性APP进行识别和分类。将多个基机器学习算法的结果进行集成学习,可以有效提高基机器学习算法的分类性能。集成的泛化能力比单个学习者要好得多。EnDroid采用Stacking判断哪些基分类器(base classifier)是可靠的,哪些是不可靠的。Stacking通常通过将不同基分类器构建的模型与元分类器(meta-classifier)相结合来获得最高的泛化精度。通过实验,作者发现Stacking具有最好的性能并在Android恶意软件检测中具有广阔的应用前景。

EnDroid结构

如图所示,EnDroid分为两个阶段:训练阶段与检测阶段。在训练阶段中,EnDroid通过监控良性和恶意APP的操作提取动态行为特征,并为每个处理过的应用程序生成特征向量。EnDroid将生成的良性和恶意APP的特征向量作为输入,训练各种基分类器。基于这些基分类器对每个APP的预测概率,EnDroid采用元分类器来训练最终的分类模型。该分类模型可用于区分良性和恶意APP,并将其交付到检测阶段。在检测阶段,EnDroid为每个未知APP生成特征向量,分类模型可以根据其特征向量判断未知APP属于良性或恶意APP。

EnDroid框架概览图

训练阶段

动态特征提取

在训练阶段的第一步,EnDroid从给定的APP中提取运行时行为信息。为达到此目的,作者使用了开源动态自动分析工具DroidBox。此工具基于TaintDroid提供一个应用沙箱,采用框架层系统挂钩(hook)的动态污染(taint)分析,记录各种应用操作,如文件和网络访问操作、信息泄露、密码学操作等。这一步的过程如下图所示。其中,控制脚本利用MonkeyRunner在DroidBox的监控环境中运行一段时间的APP可执行文件。通过使用strace工具记录与流程和I/O活动相关的系统调用,从而扩展了DroidBox的监视环境。在本文的工作中,作者从APP行为选择了9类,与系统调用一起进行监控。

动态行为提取过程示意图

EnDroid特征集

特征向量生成

在动态特征提取之后,EnDroid得到了一些动态分析日志文件。在实际中,EnDroid将日志文件中提取的每个行为都视为检测到的特征。因此,检测到的特征数等于属性数据库(Attibute Database)的大小。如果属性数据库的大小是$S$,则EnDroid生成$S$维的向量空间。对于每个APP,EnDroid通过将其动态行为日志文件映射到$S$维向量空间来构造一个特征向量,如下图所示。通过将提取的每个特征的维数设置为1,其余维数设置为0来构造APP的特征向量。

特征向量生成过程

EnDroid从给定的应用程序中提取尽可能多的动态行为特征,并通过将行为日志文件映射到向量空间来构造特征向量。注意,特征向量的维数取决于提取的动态行为特征的个数。在动态行为提取中,如果EnDroid提取的动态行为特征过多,就会导致特征向量生成的高维特征向量。然而,其中一些特征是相互关联的,可能包含大量的噪声、无关或冗余信息,从而降低了机器学习算法的性能和效率。为了选择能够有效描述训练数据的特征子集,采用特征选择来降低维数,去除冗余特征,减轻过拟合。

在本文中,作者在EnDroid中采用了知名的过滤方法──卡方(Chi-square)。卡方根据特征与类的相关性去除不相关或冗余的特征。在这个过程之后,作者保留了一个足够对Android应用程序进行分类的原始特征子集。因此,该方法有效地降低了特征向量的维数。

卡方用于度量两个变量的不相关性。令$c$表示一个随机变量,表示APP属于恶意或良性的某个类别。每个APP被分配一个特征向量$F=(f_1, f_2, \ldots, f_i, \ldots)$,其中$f_i$表示第$i$个动态行为特征$b_i$的取值。在本文中,卡方用于测试一个动态行为特征$b_i$是否与类别$c$相关。动态行为特征$b_i$与类别$c$的卡方值$\chi^2$表示为:

$$
\chi^2 = \frac{N \times (D\times U - G \times E)^2}{(D + G)\times (E + U) \times (D + E) \times (G + U)}
$$

其中,$N = D + E + G + U$,$D$和$E$分别表示包含动态行为特征$b_i$的恶意与良性样本数,$G$和$F$分别表示不包含动态行为特征$b_i$的恶意与良性样本数。$b_i$的重要性与$\chi^2$直接成比例。

对于每个动态行为特征$b_i$,其与类别$c$的相关性可以用卡方进行评估。作者关注与$c$密切相关的动态行为特征,因此,将动态行为特征依据$\chi^2$降序排序,并选择前几位用于分类。

学习

在训练阶段,EnDroid利用二分类算法分别从良性和恶意APP中学习动态行为特征。EnDroid利用良性、恶意APP生成的特征向量作为输入,应用监督学习算法,输出能够区分良性、恶意APP特征向量的分类模型。然后将分类模型传输到检测阶段。

为了充分利用不同机器学习算法的优点,进一步提高恶意APP检测的性能,文章在得到这些学习算法的分类结果后,使用一个元分类器集成多个基分类器。以决策树、线性支持向量机、极端随机树、随机森林和增强树作为基本分类器,采用逻辑回归作为元分类器。

Stacking

在Stacking过程中,利用训练数据集对多个基分类器进行训练,并将这些基分类器的输出预测概率发送给元分类器,由元分类器进行训练,最后进行预测。Stacking的性能并不一定比单个分类器好。它取决于分类器的选择和用于组合输出预测概率的函数。下面的算法展示了多分类器的Stacking集成过程。在这个算法中,$M^j_{train}$表示第$j$个训练子集,$M^{-j}{train}$表示除不含第$j$个训练子集外的训练集。$H_i$表示第$i$个基分类算法。$Y^j{H_i}$表示在数据集$M^{-j}{train}$上构造的算法$H_i$的目标函数。$P^{H_i}{M_{train}}$代表算法$H_i$对数据集$M_{train}$的预测概率。$rbind$表示将多个列表按行组合成一个新矩阵。

Stacking集成过程算法

该算法首先将训练数据集分解为$k$个子集,这是$k$折交叉验证的准备步骤。其次,在上述子集上训练基分类器。然后,根据每个APP基于分类器的预测概率构造新的训练和测试数据集。最后,在新的训练数据集上建立最终的分类器。

检测阶段

在检测阶段,EnDroid从未知APP中提取动态行为特征并生成其特征向量。基于该特征向量,分类模型能够判断APP是良性的还是恶意的。

结语

本文是一篇新颖的聚焦于Android平台动态分析的文章。集成学习在恶意代码分析论文中较少出现,但在其他领域已经取得一些成就,在本文中也获得了不错的成绩,值得研究者关注。