[论文翻译](word2vec)从增强函数调用图中学习特征用于Android恶意软件检测(Minghui Cai)

Learning features from enhanced function call graphs for Android malware detection


摘要:       

        分析Android应用程序的运行行为对于恶意软件检测至关重要。在本文中,我们尝试从函数调用中学习应用程序的行为级特征。这个任务的挑战有两方面。首先,缺乏函数属性阻碍了对应用程序行为的理解。其次,函数调用的图形表示不能直接由传统的机器学习算法处理。在本文中,我们开发了两种方法来克服这些挑战。基于函数嵌入,我们首先提出了增强函数调用图(E-FCGs)的概念,以描述应用程序的运行行为。然后,我们开发了一种基于图卷积网络(GCN)的算法,以获得E-FCGs的向量表示。大量实验证明,我们的方法学到的特征在各种分类器上(例如,LR、DT、SVM、KNN、RF、MLP和CNN)上可以取得令人惊讶的高检测性能,明显优于传统的静态特征。

© 2020 Elsevier B.V. 保留所有权利。


1. 引言

        Android是97%移动恶意软件的主要目标[1],几乎每天都会发现大约8400个新的Android恶意软件实例[2]。到目前为止,已经开发了各种基于机器学习的检测方法来应对Android恶意软件。这些方法基于提取的特征,使用分类器来判断一个应用是否是恶意的。在实践中,恶意软件检测的性能在很大程度上取决于这些特征

        用于Android恶意软件检测的现有特征可分为两类:动态特征[3,4]和静态特征[5–9]。动态特征能够反映应用程序的运行行为,因此为恶意软件检测提供了重要线索。然而,提取动态特征需要监视应用的执行,这会导致开销和不便。相反,静态特征不需要执行应用程序,只需分析应用安装文件,即Android应用程序包(APK)。在现有文献中(例如,[5–9]),通常将权限要求、意图操作和函数调用(即API调用)用作恶意软件检测的静态特征。然而,这些静态特征不能准确描述应用程序的运行行为。为解决这个问题,我们提出从函数调用中学习行为级特征

        函数调用通常表示为二进制向量或有向图,即函数调用图(FCG)[10]。在FCG中,每个节点表示一个函数,每条边表示一个函数调用。与向量表示相比,图表示提供了有关应用程序工作方式的更多信息,更有助于恶意软件检测。以说明,我们考虑一个包含onReceive()和startService()之间边的FCG。通过分析这个FCG,我们意识到该应用调用onReceive()接收系统广播BOOT COMPLETE,然后调用startService()启动服务组件以进行私人用户数据收集。这种行为表明该应用可能是恶意的。

        然而,将FCG应用于Android恶意软件检测存在两个主要障碍。首先,FCG不能告诉我们有关节点/函数属性的信息,例如函数的含义。不幸的是,函数属性对于恶意软件检测至关重要。例如,如果不了解startService()的含义,我们就无法理解应用程序的行为。其次,由于FCG具有非欧几里德结构[11],经典的机器学习算法无法直接处理FCG。在本文中,我们使用两种技术来克服上述挑战,即1)函数嵌入和2)基于图卷积网络(GCN)的特征学习。

        (1) **函数嵌入**。直观上,应用程序中的函数类似于文档中的单词。借鉴词嵌入的思想,我们将函数嵌入到一个低维向量空间中。这个空间中的每个向量表示一个函数的属性,可以表征函数的行为、函数之间的功能相似性以及与其他函数的关系。因此,我们通过为FCG中的每个节点分配函数属性,创建了增强函数调用图(E-FCGs)。

        (2) **基于GCN的特征学习**。FCGs和E-FCGs都不能直接由分类器处理。受到图嵌入的启发[12],我们开发了一种基于图卷积网络(GCN)的算法,从E-FCGs中学习行为级特征。我们算法得到的有用且密集的向量表示可以被各种分类器用于恶意软件检测,如图1所示。

        我们的主要贡献总结如下。首先,我们提出了E-FCGs的概念,可以准确刻画应用程序的运行行为。其次,我们开发了一种有效的算法从E-FCGs中提取行为级特征,即BLFE(行为级特征提取算法)。据我们所知,我们是第一个引入GCN来学习Android恶意软件检测特征的研究。大量实验证明我们的特征优于传统的静态特征在各种分类器上显著提高了检测性能(例如,LR、DT、SVM、KNN、RF、MLP和CNN)。本文的其余部分组织如下。在第2节中,我们讨论了与静态特征和函数嵌入相关的相关工作。第3节展示了如何构建E-FCGs。第4节提出了从E-FCGs中学习特征的BLFE算法。在第5节进行实验证明了我们提出的方法,随后在第6节进行了结论性的讨论。

2. 相关工作

        2.1 **静态特征**

        作为最常见的静态特征,权限需求、意图操作和函数调用已被广泛用于Android恶意软件识别[5–8]。权限需求指示应用需要访问的敏感用户数据(例如联系人和短信)。意图操作告诉Android可以执行哪些标准操作活动。至于函数调用,它们指示应用调用了哪些函数。在[5,6]中,函数调用与权限和意图操作一起被用作检测特征,然后馈入浅层学习和深度学习模型。在[7,8]中,权限和函数调用被选为检测特征,分别由SVM模型和深度学习模型进一步处理。在许多文献中,函数调用被简单地表示为一个二进制向量,其中每个元素指示相应的函数是否被调用。尽管向量表示揭示了有关应用的一些信息,但它们不描述函数之间的相互作用,因此无法准确刻画应用程序的行为。更好地利用函数调用的方法是构建一个FCG。FCG提供了可以用来推断应用程序运行行为的拓扑信息。然而,FCG不提供节点属性(即函数属性),这对于理解应用程序行为至关重要。此外,FCG属于图数据的范畴。因此,它们不能直接由传统的分类器处理。

        2.2 **图嵌入**

         图嵌入[12]的目标是学习一种将节点或(子)图嵌入到低维向量空间的映射。学到的嵌入可以用作下游分类任务的特征输入,例如Android恶意软件检测。DeepWalk [13] 和 node2vec [14] 是两种经典的图嵌入方法。DeepWalk是第一种基于深度学习的图嵌入方法,它利用图上的随机游走来获得节点表示。Node2vec通过引入有偏的随机游走过程扩展了DeepWalk。然而,这两种方法和其他无监督的图嵌入方法(例如,LINE [16])仅利用拓扑信息,不能考虑节点属性[14] [13]。[15] 探讨了node2vec、Deepwalk和其他方法对FCG嵌入的影响,但他们没有考虑图的节点属性。对于我们的应用程序分类任务,节点属性对于理解应用程序的运行行为非常重要。为了利用拓扑信息和节点属性,我们引入GCN来从E-FCGs中获取向量表示。GCN扩展了现有的卷积神经网络(CNNs)以处理图数据。它们迭代地聚合节点邻居的嵌入,并使用获得的嵌入及其先前的嵌入的函数来获得新的嵌入。通过将GCNs应用于E-FCGs,我们可以得到应用程序的向量表示,可用于高准确度的Android恶意软件检测。

3. **构建E-FCGs**

        对于Android应用程序,可以通过处理其classes.dex文件来获取函数调用的信息。因此,可以为应用程序构建一个FCG。在接下来的部分,我们研究如何为FCG获取函数属性一个简单的解决方案是使用一个独热编码向量作为函数属性。然而,独热编码向量无法衡量任意两个函数之间的相似性,因此在应用程序行为分析中提供的信息较少。

        意识到程序中的函数类似于文档中的单词,我们使用了一种类似于词嵌入的方法来获取函数属性。这种方法在本文中称为函数嵌入,旨在将每个函数转换为一个密集的向量表示。因此,在嵌入空间中,具有相似属性的函数可以占据相邻的空间位置。

        函数嵌入的主要步骤如下描述。对于数据集中的每个应用程序,

        1.我们首先创建一个文件(即函数调用记录)来存储函数调用的顺序

        2.然后,通过汇总所有函数调用记录来构建一个语料库。按照CBOW(Continuous Bag Of Words)[17]的方法,我们训练一个具有一个隐藏层的全连接神经网络,将一个函数转换为一个N维向量。   

        我们的函数嵌入方法如图2所示。正如图中左侧所示,神经网络一次处理C个函数的独热编码向量。所有这些函数共享相同的权重,W_{V*N}表示,其中V是语料库中出现的函数数。为了训练这个神经网络,我们反复用来自语料库的函数序列进行馈送,并引导它预测函数Ft。更具体地说,我们最大化式(1)中的值,

        其中C = 2k,P(B|A)表示在给定函数序列A的情况下预测函数B的概率。有关模型训练的更多细节可以在[17]中找到。当训练阶段结束时,我们可以使用权重W_{V*N}为每个函数导出一个N维向量表示,如图2右侧所示。

4. **从E-FCGs学习特征**

        传统的分类模型(例如,SVM和CNN)无法处理E-FCGs,因为E-FCGs是非欧几里德的,属于图数据的范畴。为了解决这个问题,我们建议使用GCN从E-FCGs中学习特征。GCNs可以直接在图上操作并利用它们的结构信息。

        给定一个E-FCG,GCN的输入为:

        1)一个特征矩阵X,其中每一行是一个节点的向量表示(即特征),以及

        2)表示图结构的邻接矩阵A。

        在每一层,使用传播规则将特征聚合形成下一层的特征。因此,每个隐藏层(如l)可以表示为H^{l}=f(H^{(l-1)},A),其中H^{0}=X。这样,每个连续层的特征变得越来越抽象。遵循[18]中给出的广泛使用的谱传播规则,我们有
   

         其中,\sigma是激活函数(例如,ReLU).\widetilde{D}是度矩阵,W^{l}是第l层的权重矩阵。在此,\widetilde{A}=A+I_{N}被引入去聚合节点特征,以使节点的聚合表示包含其自身的特征,其中I_{N}是单位矩阵[18]。(如果这里不考虑I_{N},那么与A相乘就意味着,对于每个节点,我们将所有相邻节点的特征向量相加,而不是节点本身。为了将节点本身考虑进去,我们简单地将身份矩阵I_{N}加到A上。)

          从(2)中可以看出,节点的聚合特征对应于邻居特征的加权和。在为节点聚合特征时,我们仅选择由该节点指向的邻居。也就是说,在评估一个函数时,我们仅考虑它调用了谁。请注意,谱传播规则主要设计用于无向图。为了将其应用于我们的EFCGs,我们将对角矩阵\widetilde{D}计算为(d_{ii} = \sum_j a_{ij}),其中d_{ii}\widetilde{D}的对角元素,a_{ij}是矩阵\tilde{A}的元素。

        现在我们开发一个算法来从E-FCGs中学习行为级特征称为BLFE。在训练阶段,BLFE试图使用两个组件训练模型:1)特征提取器和2)分类器。特征提取器由若干图卷积层和一个ReadOut层组成,而分类器由一个全连接神经网络实现。在ReadOut层中,我们获取最后一个图卷积层的输出,并计算矩阵中每一列的和,这是行为级特征向量,如式(3)所示。
   

        在训练过程中,通过最小化以下损失函数来迭代更新整个模型:

   

其中,y_{i}^{'}表示地面真实值,_{}y_{i}表示预测值,w_{i}是要学习的权重。在(4)中,第一项是二元交叉熵,第二项用于缓解过拟合。在测试阶段,BLFE处理E-FCGs并告知相应的应用程序是否是恶意的。BLFE的详细信息如算法1所示,其中w_{m}表示模型中的权重,\eta是学习率。

        一旦模型训练好,特征提取器就可以用来从E-FCG中学习行为级特征。使用这些特征,可以将它们馈送到任何分类器(例如,SVM和KNN)或一些高级的恶意软件检测方法(例如[19,20])中进行应用程序分类。

5. **性能评估**

        在这里,我们进行了大量实验,以评估函数嵌入的有效性BLFE的收敛性以及由BLFE学到的特征的有效性。

5.1 **数据集和设置**

        在我们的实验中,我们使用了一个包含43,310个样本的大型数据集,其中7,362个样本是恶意的,其余是良性的^{3}。(3根据现实生活中Android恶意软件的比例,将恶意样本数量与总样本数量的比例设定为17 %。)我们实验中的应用程序来自Androzoo数据库[21]、Google应用商店、VirusShare [22]等。

        为了提取权限需求、意图操作和API调用等静态特征,我们将每个apk文件解压缩为两个文件:AndroidManifest.xml和classes.dex。然后,我们通过解析AndroidManifest.xml来提取权限需求和意图操作。

        将classes.dex反编译为一系列smali文件后,我们获得有关函数调用的信息。要构建FCG,我们只需要创建一个邻接矩阵,其中每个元素 a[ i , j ] 为1,表示函数 i 调用函数 j ,否则为0。使用第3节提出的方法,我们获得节点属性,然后通过将节点属性分配给相应的FCG来构建E-FCG。

        在我们的实验中,每个函数的向量表示为100维GCN模型有三个卷积层,分别包含100、100和60个神经元。因此,行为级特征的向量表示为60维

        为了实现BLFE算法,我们构建了一个具有两个隐藏层的全连接神经网络,它充当分类器,并与基于GCN的特征提取器连接。

5.2 **函数嵌入的效果**

        为了展示函数嵌入的效果(在我们的实验中,我们的函数嵌入采用尽可能多的函数。对于那些未被采用的函数,它们的特征向量被设置为所有元素的向量1。由于未被采用的函数数量较少,它们不会显著影响我们的函数嵌入方法。),我们首先将实验中的函数嵌入到一个二维空间中,然后在图4中展示三个函数的表示。

        函数getLongitude()和getLatitude()都用于获取位置,并且它们在应用中经常一起调用。因此,它们在嵌入空间中占据相邻的位置。

        函数setHomeActionContentDescription()用于为主页/向上操作设置替代描述,这与getLongitude()和getLatitude()完全不同。因此,它在嵌入空间中的位置远离getLongitude()和getLatitude()的位置,且与setHomeActionContentDescription()对应的向量与getLongitude()(或getLatitude())的向量之间的角度较大。

5.3 **BLFE算法的收敛性**

        

        BLFE是一个迭代算法,我们通过实验证实了其收敛性。为了说明,图5展示了某个实验中损失函数(4)的迭代情况。为了方便绘制,图5的垂直轴提供了损失在20次迭代中的平均值。因此,水平轴上的每个点代表20次迭代。从该图中可以看出,在训练期间,损失迅速下降。从水平轴的第100个点开始,损失持续接近零,BLFE算法收敛。

5.4 **检测性能**

        为了评估我们方法得到的特征,我们将它们应用于七个主流的分类器:决策树(DT)、k最近邻(KNN)、逻辑回归(LR)、随机森林(RF)、支持向量机(SVM)、多层感知机(MLP)和卷积神经网络(CNN)。

        为了比较,我们还考虑了三种传统的静态特征,包括:(1)106个敏感API调用(在表1中用A表示),(2)147个权限和126个意图操作的组合(用B表示),以及(3)106个敏感API调用、147个权限和126个意图操作的组合(用C表示)。这些静态特征的效果在现有文献中已经得到验证(例如,[5,6,8])。表1中还给出了这些静态特征的实验结果。值得注意的是,我们使用了5折交叉验证来准确评估我们的特征以及特征组A、B和C的性能。

        从表1中,我们可以得出以下结论。首先,特征组A、B和C对于恶意软件检测是有效的,但是我们提出的特征在所有指标上明显优于它们。在这些特征组中,A是最接近我们的,因为它基于函数调用的信息。与A相比,我们的特征在所有分类器上的检测准确率提高了至少34个百分点。在特征组A、B和C中,大多数情况下最好的是C。这是因为特征组C利用了最多的信息,包括权限需求、函数调用和意图操作。

        我们的特征在所有分类器上的性能均优于特征组C,即使我们的特征仅使用函数调用的信息。以分类器CNN为例。与C相比,我们的特征在CNN上将F1分数提高了至少14个百分点,如表1的最后两行所示。

6. **结论**

        分析Android应用程序的运行时行为有助于恶意软件检测。由于在实践中监视应用程序的执行是昂贵的,因此我们提出从函数调用的信息中提取或学习行为级特征,这可以在应用程序执行之前获得。为此,我们首先提出了一个准确刻画应用程序运行时行为的新概念——E-FCGs,基于我们提出的函数嵌入方法。然后,我们开发了一个基于GCN的算法,从E-FCGs中学习行为级特征。实验证明,我们方法获得的特征在七个主要分类器上取得了令人满意的性能,显著超过传统的静态特征。

         **贡献声明** - **Minghui Cai:** 概念化,方法学,验证,调查,撰写 - 原始草稿。 - **Yuan Jiang:** 数据整理,调查,方法学,撰写 - 原始草稿。 - **Cuiying Gao:** 调查,撰写 - 审查和编辑,验证。 - **Heng Li:** 概念化,方法学。 - **Wei Yuan:** 撰写 - 原始草稿,概念化,方法学,项目管理,资金获取。 **竞争利益声明** 作者声明他们没有已知的竞争性财务利益或可能影响本文报告的个人关系。 **致谢** 本工作得到了中国国家自然科学基金(Grant 61571205 和 61772220)的支持。

  • 14
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值