目录
- 摘要
- [1. 引言](#1. 引言)
- [2. 相关工作](#2. 相关工作)
-
- [2.1. 基于重新训练的恶意软件检测](#2.1. 基于重新训练的恶意软件检测)
- [2.2. 基于应用关系图的恶意软件检测](#2.2. 基于应用关系图的恶意软件检测)
- [2.3. 基于异常样本识别的恶意软件检测](#2.3. 基于异常样本识别的恶意软件检测)
- [2.4. 基于API聚类的恶意软件检测](#2.4. 基于API聚类的恶意软件检测)
- [3. AMDASE概述](#3. AMDASE概述)
- [4. 基于语义距离的API聚类](#4. 基于语义距离的API聚类)
-
- [4.1. API特征提取](#4.1. API特征提取)
- [4.2. API句子生成](#4.2. API句子生成)
- [4.3. API句子编码](#4.3. API句子编码)
- 4.4.聚类中心生成
- [5. Android malware detection](#5. Android malware detection)
- [6 实验与分析](#6 实验与分析)
-
- 6.1.实验设置
- 6.2.恶意软件检测性能
- 6.3.不断发展的恶意软件检测性能
- [6.4. API 聚类中方法名称的影响](#6.4. API 聚类中方法名称的影响)
- [6.6 运行时评估](#6.6 运行时评估)
- [6.7 API聚类在语义提取上的能力](#6.7 API聚类在语义提取上的能力)
- [8. 讨论](#8. 讨论)
- [9. 结论](#9. 结论)
[[A novel Android malware detection method with API semantics extraction_2024_Yang et al.pdf]]
AnovelAndroid malware detection method with API semantics extraction
一个新颖的安卓恶意软件检测方法,通过提取 API 语义来实现。
关键词:进化恶意软件检测、模型老化、API语义、函数调用图、机器学习。
摘要
由于Android框架和恶意软件的持续进化,使用过时应用程序训练的传统恶意软件检测方法在有效识别复杂的进化恶意软件方面已不足够。为了解决这个问题,本文提出了一种新颖的安卓恶意软件检测方法,名为API语义提取的安卓恶意软件检测方法(AMDASE),它可以有效识别进化的恶意软件实例。首先,AMDASE 执行API聚类 以获取代表API功能的聚类中心,然后在恶意软件检测之前设计API句子来总结API特征 ,并使用自然语言处理(NLP)工具 获取API句子的嵌入,用于聚类。借助API句子,可以有效地提取包含在诸如方法名称这样的特征中的API语义,这些特征准确地代表了其预期功能,这也使得聚类结果更加准确。其次,AMDASE 从每个应用中提取调用图,并通过移除与未知功能对应的节点来优化调用图,同时确保保留它们的前驱节点和后继节点之间的连通性。优化后的调用图可以提取更健壮的API上下文信息,准确地代表每个应用的行为。第三,为了保持对Android恶意软件进化的抵抗力,AMDASE 从优化的调用图中提取函数调用对,并将函数调用对中的API抽象为API聚类中获得的聚类中心。最后,使用一键映射生成特征向量,并使用机器学习分类器进行恶意软件检测。我们在一个包含42,154个良性和42,450个恶意应用的数据集上评估AMDASE,这些应用是在七年的时间里开发的。实验结果表明,AMDASE 的性能大大超过了现有的最先进方法,并且具有显著较慢的老化速度。
1. 引言
Android平台的广泛普及推动了Android恶意软件的快速扩张。尽管机器学习技术在恶意软件检测方面取得了优异的成果(Qiu等,2020年),但恶意软件的持续进化仍然对检测系统构成了巨大挑战(Jordaney等,2017年)。使用过时应用程序训练的分类器难以有效检测出一段时间后出现的新应用,导致检测性能随时间持续下降,这也被称为模型老化。模型老化是由概念漂移引起的,与计算机视觉或自然语言处理(NLP)不同,恶意软件检测的问题域频繁变化,导致新出现的恶意软件与旧恶意软件之间的特征分布存在差异。恶意软件开发者常通过改变实现方式来逃避检测系统,以保持恶意行为(张等,2020年)。具体来说,进化的恶意软件拥有大量未出现在训练集中的API。目前,大多数恶意软件检测方法都基于API调用信息。基于API频率信息的检测方法(杨等,2014年;Arp等,2014年;冯等,2020年)显示出高误报率,并容易受到恶意攻击。依赖API上下文信息的检测方法(吴等,2019年;艾伦等,2018年)在识别应用程序表现出的恶意行为方面提高了准确性。然而,由于缺乏适当的方法处理调用图中大量未知功能节点,这种方法在有效提取API上下文信息方面面临挑战。此外,这些现有的检测方法未能考虑API的频繁变化,因此在有效识别进化的恶意软件方面面临挑战。API聚类将具有相似功能的API分组到同一类别中。在恶意软件检测过程中,可以用API聚类中心替换特征向量中的API,以增强分类器识别训练阶段未遇到的API的能力。这种方法有可能减缓分类器性能随时间衰减的速度(张等,2020年)。然而,现有的API聚类方法从包名、参数和返回值等特征中提取API语义,而忽略了方法名和权限等关键特征。通过API聚类提升分类器性能的限度可以归因于API语义提取的不足。Mariconti等(2016年)提出了MAMADROID,其中他们采用了一种聚类技术,根据包名对API进行分组。MAMADROID通过将新引入的API抽象为包,显示出对现有包中API的弹性。然而,需要注意的是,同一包中的API不一定表现出相似的功能。此外,MAMADROID无法从新包中捕获任何API信息。Pendlebury等(2019年)发现,在消除时间偏差的实验设置下,MAMADROID的F1-测量值在仅三个月后从90%以上下降到58%。为了解决现有恶意软件检测方法中的上述缺陷,我们提出了一种新颖的Android恶意软件检测方法,即API语义提取的Android恶意软件检测方法(AMDASE),该方法可以有效检测进化的恶意软件。首先,我们进行API聚类,以获得代表API功能的聚类中心。我们设计API句子来总结API特征,并使用NLP工具获取API句子的嵌入,用于聚类。其次,我们从每个应用中提取调用图,并通过移除未知功能节点的同时保留其前驱节点和后继节点之间的连接来优化调用图。第三,我们从优化的调用图中提取函数调用对,并将调用对中的API抽象为API聚类部分获得的聚类中心。最后,使用一键编码生成特征向量,并使用机器学习分类器进行恶意软件检测。我们在一个包含42,154个良性应用和42,450个恶意应用的数据集上评估AMDASE的检测性能,这些应用是在七年的时间里开发的。AMDASE在2012年到2013年的数据上训练,当检测2014年到2018年的样本时,平均F1-测量值达到82.6%。平均F1-测量值比最先进的恶意软件检测方法MAMADROID高出22%。我们的实验结果表明,AMDASE的性能大大超过了现有的检测方法,并且老化速度明显较慢。本文主要做出三个贡献:首先,我们提出了一种基于语义距离的API聚类方法。我们设计API句子来总结API的特征。API句子不仅包含重要的特征,如概述API功能的方法名,还将具有不一致特征数量的API统一映射到固定大小的特征向量中。借助API句子,可以有效地提取API的语义,这使得API聚类结果更加准确。其次,我们引入了一种调用图优化方法。这种方法在保持其前驱节点和后继节点之间的连接的同时,移除了所有未知节点。如果调用图中任意两个API节点(例如,APIx和APIy)之间存在由所有未知功能节点组成的路径,则在优化的调用图中,APIx直接调用APIy。调用图优化使得提取的API上下文信息能更精确地反映应用的行为模式。最后,我们介绍了AMDASE,这是一种新颖的Android恶意软件检测方法,可以有效识别进化的恶意软件,无需任何类型的重新训练。通过将API抽象为聚类中心,AMDASE对Android框架和恶意软件中的API变化具有弹性。
2. 相关工作
机器学习在Android恶意软件检测方面取得了显著进展(Wu等,2023年;Bhat等,2023年;Tarwireyi等,2023年;Yang等,2015年;Zhang等,2014年;Yang等,2014年;Karbab等,2018年;Chen等,2018年;Feng等,2020年;Wang等,2019年,2018年;Liu等,2019年;Lu等,2021b年)。然而,模型老化的问题始终是一个重大挑战。Pendlebury等(2019年)和Jordaney等(2017年)详细说明了概念漂移在Android恶意软件检测中的普遍性。研究人员提出了许多解决方案来应对这一问题,主要可以分为四类:重新训练、应用关系图、异常样本识别和API聚类。
2.1. 基于重新训练的恶意软件检测
"重新训练"一词涉及到利用概念漂移样本及其相应标签重新训练分类器的过程。根据标签的不同来源,重新训练的过程可以分为两种类型:真实标签重新训练和伪标签重新训练。真实标签来自恶意软件专家的手动标注。而"伪标签"指的是由恶意软件分类器生成的推断类标签,通常以其预测的高置信度为特征。Grosse等(2017年)提出了一种自适应且可扩展的Android恶意软件检测方法DroidOL。DroidOL系统利用调用图提取应用的敏感行为特征,并在检测过程中利用误分类样本及其相应的真实标签更新分类器。因此,DroidOL能够适应Android应用的进展。Xu等(2019年)提出了一种基于在线学习的恶意软件检测方法DroidEvolver。DroidEvolver认为,用不同优化器训练的分类器具有不同的老化速度,因此在训练阶段构建了一个由五个线性在线学习算法组成的模型池。在检测阶段,使用其他未老化模型的预测结果更新老化模型。基于重新训练的检测方法通常有以下缺陷:重新训练真实标签需要大量高质量的概念漂移样本,这在有限的时间内难以完成。此外,重新训练真实标签还需要大量人力资源进行概念漂移样本的手动标注。伪标签重新训练免除了人力资源手动标注样本的需要,但伴随着两个固有的限制。首先,一旦预测标签错误,将导致分类器性能急剧下降。另一个缺点是,恶意攻击者可以设计特定样本来利用伪标签重新训练的机制。
2.2. 基于应用关系图的恶意软件检测
应用关系图指的是构建一个以每个应用为主节点的实体关系图,以反映不同应用之间的相似性。Android生态系统经历的是逐渐的进化过程,而不是突变,导致进化的恶意软件保留了与其祖先相似的显著特征。一旦概念漂移应用被误分类,分类器可能会使用该应用与其祖先节点在应用关系图中的相似性,将其拉回到决策边界。Gu和Li(2021年)提出了一种缓解Android恶意软件检测中模型老化的方法。它构建了一个应用关系图来反映应用之间的进化关系,这个图辅助分类器进行恶意软件检测。Hei等(2021年)提出了一种基于异构图注意网络的Android恶意软件检测方法。在训练阶段,构建了一个应用关系图来模拟应用之间的相似性。然后,使用图神经网络学习应用之间的相似性并生成用于恶意软件检测的特征向量。在检测阶段,设计了一种增量聚合方法MsGAT++,使得无需更新整个应用关系图即可快速生成特征向量。基于应用关系图的检测方法通常有以下缺陷:首先,代码重用是软件开发的重要部分,因为它允许开发者将现有代码用于各种目的。然而,值得注意的是,代码重用的做法不仅限于良性应用,恶意行为者也可能在恶意软件开发中使用来自良性应用的重用代码。这给利用应用之间的相似性的恶意软件检测方法带来了严重困难。同时,应用之间的相似性并不反映它们的行为,这对基于应用关系图的检测方法学习恶意软件与良性应用之间行为特征的差异构成了挑战。
2.3. 基于异常样本识别的恶意软件检测
异常样本识别是在检测过程中过滤出概念漂移样本。恶意软件分类器对这些样本的决策通常信心较低,因此需要恶意软件专家的参与,以评估并做出明智的判断。Yuan等(2022年)提出了一种使用双头神经网络进行概念漂移样本识别的方法。这个神经网络有两个平行的输出层,分别输出应用的预测结果。通过这两个输出层之间的差异来识别概念漂移样本。Karbab和Debbabi(2021年)提出了一种自适应的Android恶意软件检测方法。分类器在对概念漂移样本做出决策时通常信心较低,因此在恶意软件检测过程中会过滤掉低信心样本。异常样本识别可以大大提高检测方法的有效性,但它仅限于识别概念漂移样本,而不是进化恶意软件检测。
2.4. 基于API聚类的恶意软件检测
API聚类将具有相似功能的API分组到同一类别中。在恶意软件检测过程中,用API聚类中心替换特征向量中的API,增强了检测方法对API频繁变化的抵抗力。MAMADROID(Mariconti等,2016年)通过包名对API进行聚类。通过将API调用抽象为包,MAMADROID对新引入的API显示出弹性,这些API出现在现有包中。然而,同一包中的API不一定执行相似的功能(Zhang等,2020年)。此外,MAMADROID无法从新包中捕获任何API信息。Zhang等(2020年)提出了APIGRAPH,这是对现有Android恶意软件分类器的一种增强,通过API聚类实现。首先,APIGRAPH从Android官方文档中提取信息以构建实体关系图。然后,使用TransE(Van der Maaten和Hinton,2008年)算法生成实体和关系的嵌入向量。最后,使用k-Means(Syakur等,2018年)算法进行API聚类。作者认为,具有相似参数、相似权限、相似包和相似返回值的API必定具有相似的功能。然而,在API语义提取过程中,包含大量语义信息的API方法名被忽略了。Lei等(2019年)引入了一种使用API标记的API聚类方法。最初,它将调用图中的每个API分割为标记,包括其家族、包名、类名、方法名、返回值和参数。然后,使用doc2vec(Lau和Baldwin,2016年)对每个API进行编码并生成嵌入。最后,使用k-Means算法完成聚类。这种API聚类方法在API语义提取过程中使用了方法名,但忽略了权限和异常等关键特征。权限在Android系统中极为重要(Au等,2012年)。同时,这种方法从训练集而不是API文档中收集API,这使得该方法无法识别测试集中出现的新API。Xu等(2020年)提出了一种使用调用图中API上下文信息的API聚类方法。这种方法认为,展示出相似的调用者和被调用者模式的API很可能具有类似的功能。因此,设计了一个双层神经网络来捕捉API调用及其上下文信息之间的潜在关系。神经网络中的隐藏层用作反映API语义的嵌入,用于聚类。然而,这种方法使用训练数据和测试数据一起训练神经网络,这是一种严重的数据窥探(Quiring等,2022年)行为。在实际场景中,这种方法无法识别测试集中出现的新API。与其他方法相比,API聚类是解决进化恶意软件检测问题最直接和有效的解决方案。然而,现有的聚类方法在API语义提取过程中忽略了方法名和权限等关键特征,导致聚类结果对分类器性能的提升有限。
3. AMDASE概述
AMDASE是一种使用API上下文信息的静态恶意软件检测方法。该系统展示了强大的检测进化恶意软件的能力。图1展示了AMDASE的框架。它由两部分组成:基于语义距离的API聚类和Android恶意软件检测。基于语义距离的API聚类生成代表每个API功能的API聚类中心,在Android恶意软件检测之前完成。基于语义距离的API聚类有四个步骤。首先,从Android官方文档中提取每个API的特征(图1中的步骤a),包括异常、权限、参数、返回值等。其次,根据规定的规则生成API句子(图1中的步骤b)。第三,使用Bert(Jacob等,2019年),一个成熟的NLP模型,对API句子进行编码,获取每个API的嵌入(图1中的步骤c)。最后,我们使用k-Means算法生成代表API功能的聚类中心(图1中的步骤d),并将具有相似语义的API分组在一起。
Android恶意软件检测过程包括五个步骤。首先,使用FlowDroid(Arzt等,2014年),一个静态分析工具,从每个应用中提取函数调用图(图1中的步骤1)。此外,通过消除代表未知功能的节点,同时确保其前驱节点和后继节点之间的连接被保持,优化调用图(图1中的步骤2)。进一步,从调用图中提取函数调用对(图1中的步骤3)。在第四步,最初将函数调用对抽象为API聚类对。接下来,我们继续将剩余方法抽象为其相应的包。最后,使用一键编码生成每个应用的特征向量(图1中的步骤4)。在最后一步,将特征向量输入机器学习分类器,以预测应用是恶意的还是良性的(图1中的步骤5)。
4. 基于语义距离的API聚类
基于语义距离的API聚类包括四个部分:API特征提取、API句子生成、API句子编码和聚类中心生成。
4.1. API特征提取
特征提取是从Android官方文档中提取每个API的特征(Api文档,2023年)。我们研究中使用的特征包括七个不同的类别:包名、类名、方法名、参数、权限、异常和返回值。APIGRAPH的作者提供了收集的Android官方文档和API特征提取的源代码(Apigraph,2023年)。通过复制源代码,我们能够获得所有API及其相应的特征。现有的API聚类方法在API语义提取时忽略了方法名,然而,API的方法名包含大量信息并勾画出API的功能。通过使用NLP模型,可以有效地提取API方法名中嵌入的语义信息,从而提供其预期功能的近似表示。例如,具有方法名如'getDeviceId'或'setWifiEnabled'的API。它们的方法名使我们能够轻松理解它们的功能。表1显示了名为Android.telephony.TelephonyManager.getDeviceId的API的特征提取结果。注意,为了减少一些广泛使用的特征值对API语义提取的影响,我们忽略了如int、boolean、String和float等特征值。表1中显示的API以int为参数并返回String。在特征提取过程中忽略了这两个特征值。除了APIGRAPH中现有的特征提取方法外,我们通过利用它们的驼峰命名(除了第一个词,其余词的首字母都是大写,如'setWifiEnabled'和'sendTextMessage')将方法名和类名分开为单词来修改API特征。表1中显示的API的方法名为'getDeviceID',可以分为三个单词:'get'、'Device'和'ID',用'$'分隔。注意,类名和方法名中的一些词都是大写的,如'SQL'、'URL'和表1中的'ID',这些词是缩写,需要额外处理。
4.2. API句子生成
在特征提取完成后,我们将API转换为能够反映其语义信息的嵌入向量。这部分面临的问题是相同特征的值数量不一致。例如,某些API的方法名可以分解为五个词,而有些API只能分解为三个词。一些API需要调用权限,而其他的则不需要。因此,需要设计一种嵌入方法,该方法不仅能表示API的语义信息,还能将所有具有可变数量特征值的API统一映射为固定大小的特征向量,这些向量最终用于后续聚类中的距离计算。
为解决这个问题,我们首先将每个API及其特征转换为一个句子,称为API句子。根据特征值的数量,API句子的生成分为通用部分和唯一部分。通用部分指的是所有API都具有且仅有一个值的三个共同特征:方法名、类名和包名。通用部分句子生成规则如下:
方法 𝑀𝑒𝑡ℎ𝑜𝑑 来自类 𝐶𝑙𝑎𝑠𝑠 来自包 𝑃𝑎𝑐𝑘
唯一部分包含四种类型的特征:权限、异常、参数和返回值。对于这些唯一特征,每个API都有不同数量的特征值。表2 列出了唯一部分句子生成的规则。算法1 展示了API句子生成的伪代码。输入是APIx的七种类型的特征,输出是APIx的API句子𝑆。第1至3行生成API句子中通用特征的对应部分;第4至7行调用算法2来生成API句子中唯一特征的对应部分;第8行将𝑆中所有大写字母替换为小写字母;第7行将𝑆中的每个'$'、''和'.'替换为空格。
算法2 展示了API句子生成中唯一特征处理的伪代码。算法2 由算法1 的第4至7行调用。输入是唯一特征的特征值列表𝐹𝑒𝑎𝑡𝑢𝑟𝑒𝑠和相应的API句子生成规则𝑅0和𝑅1。输出是对应于唯一特征的API句子部分𝑆𝑃𝑎𝑟𝑡。算法2考虑了特征值数量为0或至少为1的两种情况。
将表1 中显示的API及其特征输入算法1后,我们可以得到以下API句子:"method get device id from class telephony manager from package Android telephony use permission read phone state throw none exception use none parameter return none"。
4.3. API句子编码
在完成API句子生成后,我们使用预训练的Bert模型对每个API句子进行编码,并取CLS的编码输出作为API语义嵌入。CLS的768维特征向量概括了整个句子的语义信息。Bert是一个广泛认可的预训练模型,在自然语言处理(NLP)领域的各种基础任务中表现出色(Bengio等人,2000年)。Bert在输入序列前添加了一个特殊的词向量CLS。CLS是分类的缩写,它可以更全面地融合序列中所有单词的信息。它通常用于各种下游任务,包括文本情感识别。Bert拥有大量的参数。使用在如BooksCorpus和Wikipedia(Jacob等人,2019年)等语料库上预训练的Bert可以大大节省计算资源。API句子不仅包含诸如方法名和权限等重要特征,还能将具有不一致特征数量的API统一映射到固定大小的特征向量中。借助API句子和Bert的嵌入使用,从API中提取语义不仅依赖于包和参数等特征,还依赖于概述API功能的方法名,这使得API聚类结果更加准确。
4.4.聚类中心生成
每个API的特征向量维度为768,通过Bert嵌入获得,这个维度相当大。这在聚类过程中的距离计算上带来了重大负担。为了降低维度,采用了主成分分析(PCA)(Svante等人,1987年),考虑了90%的方差比率。经过降维处理后,每个API获得了一个66维的特征向量。采用肘部方法(Syakur等人,2018年)来确定最优的聚类中心数目,确定为2000个。最后,执行了k-均值聚类算法(Syakur等人,2018年)。当Android官方文档更新时,比如增加新的API或改变现有API的特征,聚类结果需要更新。如图2所示,我们只需要生成新添加或更改的API的句子,并用Bert编码来获得它们的嵌入。在聚类过程中,新的API被分组到最近的聚类中心,并更新这个聚类中心的坐标。然而,APIGRAPH(张等人,2020年)需要更新实体-关系图,并使用TransE算法(Bordes等人,2013年)从头开始训练整个图,这需要重新聚类所有API的嵌入。以从API级别28(A28)更新到API级别29(A29)的聚类结果为例,A28中有58,291个API,而在A29中新增了834个API。在更新聚类结果时,我们的API聚类方法只需要处理834个新API。而APIGraph不仅需要处理这834个新API,还需要处理A28中现有的58219个API。本文提出的API聚类方法的更新成本显著低于APIGRAPH。
5. Android malware detection
在本文中,我们介绍了AMDASE,这是一种新颖的Android恶意软件检测方法,能够有效识别进化的恶意软件。图3展示了AMDASE中Android恶意软件检测的框架。Android恶意软件检测包括四个步骤:(1)调用图提取,使用静态分析工具从每个应用程序中提取调用图。(2)调用图优化,通过删除未知函数节点同时保留它们的前驱节点和后继节点之间的连通性来优化调用图。(3)特征嵌入,将优化后的调用图映射成一个特征向量。最初,从调用图中提取函数调用对。随后,使用聚类中心来替代调用对中的API,同时使用包来替代其他函数。最终,通过使用一键编码生成特征向量。(4)分类,使用训练好的机器学习分类器来预测这个应用是良性的还是恶意的。
5.1.调用图提取
初始步骤中使用了FlowDroid(Arzt等人,2014年),这是一种广泛使用的静态分析工具,用来从每个APK文件中提取调用图。调用图是一种树状结构,表示应用程序中函数调用关系。Android操作系统基于事件驱动模型运行,在这种模型中,Android应用内的代码执行是由多种事件(例如,触摸屏幕、接收网络消息)触发的。与常见的Java和C++代码不同,后者有明确的执行顺序并从特定的main()函数开始,Android应用中的代码根据触发事件的顺序有不同的执行顺序。因此,FlowDroid生成了一个名为dummyMainMethod()的特殊函数作为调用图的根节点,这意味着它是虚拟的主函数(也称为入口函数)。dummyMainMethod()的子节点是对应于不同触发事件的代码。FlowDroid假设这些代码可以按任何可能的顺序执行。
5.2.调用图优化
5.2.1.未知功能引起的问题
API的全名是应用程序编程接口,它是一种特殊的调用方式,实现了系统功能,如网络通信、蓝牙使用、相机操作等。除了API外,应用中还有大量未知函数和相对较少的其他函数。根据代码保护机制(Schulz,2012),未知函数可以分为混淆函数(例如,com.a.b.c.e123)和自定义函数(例如,com.xiaomi.mipush.sdk.pushMessageHandler)。其他函数主要用于类初始化(例如,java.io.FileOutputStream.init)。Android官方文档提供了这些函数所属类的记录。调用图,也称为控制流图,表示应用程序内的调用关系。未知函数、其他函数和API在调用图中都是单独的节点。未知函数节点占调用图的绝大多数。现有的检测方法有两种处理未知函数的方式:统一抽象和全部保留。统一抽象是将所有未知函数节点抽象为一个名为Unknown的节点。这将严重减少调用图的结构信息。在所有未知节点被抽象后,大量API的前驱节点和后继节点在调用图中都是Unknown节点。因此,调用图中API的上下文信息被严重损害。全部保留涉及保留调用图中所有未知函数节点。这将产生大量冗余信息。API的数量有限,每个API的使用更为明确。相比之下,软件开发者有权定义未知函数的名称和用途,这些可以轻易改变。在调用图中保留所有未知函数将严重增加后续检测工作的计算开销,并影响检测方法提取API上下文信息的能力。API上下文信息在准确表示每个应用的行为方面最为有效。本质上,恶意软件检测的主要数据来源是调用图中API调用的局部信息。然而,大量的未知函数节点严重削弱了提取API上下文信息的能力。
5.2.2.调用图优化算法
为了解决提取API上下文信息的严重困难,我们提出了一种调用图优化方法。这种方法移除了几乎无法提取任何有用信息的未知函数节点,同时保留了它们的前驱节点和后继节点之间的连通性。如果在调用图中任意两个API节点(例如,APIx和APIy)之间存在由全部未知函数节点组成的路径,即APIx通过调用几个未知函数来调用APIy。在优化后的调用图中,APIx直接调用APIy。未知函数本身不包含任何信息,或者它包含的信息量很小,几乎无法提取。然而,应该保留其调用关系,因为它反映了应用的行为。在优化后的调用图中只有三种类型的函数:入口函数、API和其他函数。这三种类型的函数之间的调用关系更准确、更稳健地反映了应用的行为。算法3显示了调用图优化的伪代码。该算法的输入是从应用和Android官方文档中提取的调用图。输出是优化后的调用图。
![[202402.通过提取 API 语义来实现的一个新颖的安卓恶意软件检测方法。A novel Android malware detection method with API semantics extraction_image.png]]
第2至7行用于筛选图中的关键函数节点,包括入口函数、API和其他函数。第8至9行用于获取打算移除的未识别节点的前驱节点列表和后继节点列表。第10至14行通过嵌套遍历这两个列表并在调用图中添加由这两个列表中的任意两个节点组成的有向边,以维持未知节点的前驱和后继节点之间的连通性。第15行用于从调用图中移除未知节点。
5.3. Feature embedding
第三步是将优化后的调用图映射成一个特征向量。首先,我们从优化后的调用图中提取函数调用对,包括调用者和被调用者。调用对中的函数可以分为三类:API、入口函数和其他函数。然后,每个API被抽象成第4节中获得的聚类中心。这个过程还涉及将其他函数抽象成各自的包,而入口函数被指定为保留。通过将API抽象成聚类中心,AMDASE能够抵御Android框架和恶意软件中API变化的影响。最后,使用一键编码生成每个应用的特征向量。优化后调用图中的聚类调用对的特征值被映射到第一个组件,而其他组件设置为零。
5.4.分类
在进行分类之前,前一步骤生成的特征向量维度过大,导致在训练和预测过程中产生了显著的计算负担。因此,在分类之前使用PCA(Svante等人,1987年)来降低特征向量的维度。PCA能够消除特征空间中的误导信息,如噪声,使分类器能够捕捉到更稳定和强大的特征。在测试随时间开发的恶意软件时,PCA可以大大提高分类器的性能。Android恶意软件检测的最后一步是使用机器学习分类器进行分类,预测这些应用是良性的还是恶意的。我们选择k-最近邻(KNN)(Fix和Hodges,1952年)、支持向量机(SVM)(Hearst等人,1998年)和随机森林(RF)(Breiman,2001年)作为分类器。这三种算法使用Python库scikitlearn(Scikit-learn,2023年)实现。每个模型通过训练集中应用的特征向量进行训练,并通过测试集中的应用进行测试。我们使用10折交叉验证来评估AMDASE。
6 实验与分析
在本节中,我们对AMDASE进行了全面的评估,包括以下六个实验:
- 恶意软件检测的有效性评估:我们评估了AMDASE在识别和区分恶意软件与良性应用方面的有效性。
检测进化的Android恶意软件的能力研究:我们研究了AMDASE在识别随时间演变的Android恶意软件方面的表现。 - API聚类中方法名称的影响分析:我们探讨了在API聚类过程中方法名称对聚类结果的影响。
- 调用图优化的影响评估:我们衡量了优化调用图对提高检测效率和准确性的作用。
- AMDASE的运行时评估:我们提出了对AMDASE运行时间的评估,以考察其在实际应用中的性能。
- API聚类在API语义提取上的能力评估:通过分析嵌入空间中常用API的紧密程度,我们评估了API聚类在提取API语义方面的能力。
这些实验旨在全面验证AMDASE系统的性能,确保其在各个方面都能达到预期的安全防护效果。
6.1.实验设置
表3总结了我们实验中使用的数据集,包括42,450个恶意应用和42,154个良性应用。我们使用的apk的MD5是由APIGRAPH(张等人,2020年)的作者收集的。我们从三个开放的仓库下载恶意软件,包括AndroZoo(Allix等人,2016年)、VirusTotal(VirusTotal,2023年)和AMD数据集(魏等人,2017年)。所有的恶意应用至少被VirusTotal中的15个杀毒引擎标记为恶意。我们从Google Play商店(2023年)收集良性应用,并借助AndroZoo下载它们。所有的良性应用都被VirusTotal中的每一个杀毒引擎标记为良性。为了评估AMDASE,我们使用收集的数据集进行10折交叉验证。我们设计了以下两个实验场景来评估进化恶意软件的检测能力:
-
场景A:使用2012年到2013年的应用进行十折交叉验证,产生10个训练过的分类器。我们使用这10个分类器来检测2014年到2018年开发的恶意软件,并取检测结果的平均值。
-
场景B:使用2013年到2014年的应用进行十折交叉验证,产生10个训练过的分类器。我们使用这10个分类器来检测2015年到2018年开发的恶意软件,并取检测结果的平均值。
我们选择了以下广泛使用的指标,包括准确率(Accuracy)、精确率(Precision)、召回率(Recall)和F1值(F1-Measure)。准确率的计算公式为: Accuracy = T P + T N T P + T N + F P + F N \text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN} Accuracy=TP+TN+FP+FNTP+TN 。在以下公式中,精确率为: Precision = T P T P + F P \text{Precision} = \frac{TP}{TP + FP} Precision=TP+FPTP ,召回率为: Recall = T P T P + F N \text{Recall} = \frac{TP}{TP + FN} Recall=TP+FNTP 。其中TP和TN分别代表正确分类为恶意和良性的样本数量,FP和FN分别代表错误地识别为恶意和良性的样本数量。
F 1 = 2 × Precision × Recall Precision + Recall F1 = \frac{2 \times \text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} F1=Precision+Recall2×Precision×Recall
6.2.恶意软件检测性能
为了评估AMDASE在恶意软件检测方面的有效性,我们使用同一年开发的样本对AMDASE进行了训练和测试。我们对表3中描述的七个数据集进行了10折交叉验证。表4展示了不同方法在每个数据集上的检测性能。在SVM、RF和KNN中,AMDASE使用RF取得了最佳性能。AMDASE在7年的平均F1值达到了96.7%,比MAMADROID(92.7%)和MALSCAN(90.9%)分别高出4.3%和6.4%;AMDASE的平均准确率为96.7%,比MAMADROID和MALSCAN分别高出4.3%和6.1%;AMDASE的平均精确率为98.5%,比MAMADROID和MALSCAN分别高出5.5%和5.6%;AMDASE的平均召回率为94.8%,比MAMADROID和MALSCAN分别高出3.2%和6.2%;从表4可以看出,MAMADROID的所有指标随时间缓慢增长。MALSCAN(吴等人,2019年)在2012年至2014年间具有较高的精确率和较低的召回率,但在2015年至2018年间精确率较低,召回率较高。这种现象可能与Android框架的变化有关,但AMDASE始终能够在高水平上稳定地维持其检测性能,受时间变化的影响较小。
6.3.不断发展的恶意软件检测性能
为了检验AMDASE在检测进化恶意软件方面的表现如何,我们选择了MAMADROID、AE-MAMADROID(张等人,2020年)、MALSCAN和AE-MALSCAN(张等人,2020年;吴等人,2019年)作为比较方法。AE-MAMADROID和AE-MALSCAN分别代表使用APIGRAPH增强MAMADROID和MALSCAN。在不同的分类器中,AMDASE使用SVM在进化恶意软件检测方面表现最佳。如表5所示,AMDASE的F1值显著高于其他方法。在场景A中,2014年至2018年AMDASE的平均F1值达到了82.6%,比MAMADROID(67.9%)高出22%。在场景B中,2015年至2018年AMDASE的F1值均高于80%。实验结果证明,使用旧样本训练的AMDASE能有效检测进化的恶意软件。与MAMADROID的API聚类方法相比,后者仅将API抽象为其包,AMDASE充分考虑了API的方法名称和权限中包含的丰富语义信息,使得聚类结果更有效。在恶意软件检测阶段,AMDASE可以借助调用图优化提取更稳健的反映应用行为的特征。因此,使用旧软件样本训练的AMDASE能有效检测进化的恶意软件,并且其老化速度显著减慢。APIGRAPH是现有Android恶意软件分类器的一种增强。它通过用APIGRAPH中获得的聚类中心替换特征向量中的API,使检测方法对进化的恶意软件具有弹性。MALSCAN通过使用调用图中敏感API的中心性信息来检测恶意软件。这些敏感API由PScout(Au等人,2012年)收集,大多数在2016年后很少使用,因此MALSCAN在2017年的F1值急剧下降。AE-MALSCAN使用聚类中心的中心性信息替代敏感API。在MALSCAN通过APIGRAPH增强后,其老化速度放缓。相反,MAMADROID在通过APIGRAPH增强后,其老化速度变得更加严重。具体原因将在第6.5节进一步分析。
6.4. API 聚类中方法名称的影响
为了评估API方法名称对API聚类结果的影响,我们设计了三种基于API聚类的恶意软件检测方法。第一种检测方法是使用本文提出的API聚类方法的AMDASE,带有一键编码(ASEOH);第二种检测方法是不考虑方法名称(WMN)。WMN的API聚类方法在生成API句子时忽略方法名称,其他步骤与本文提出的API聚类方法相同;第三种检测方法是使用APIGRAPH提出的聚类方法的APIGraph,带有一键编码(AGOH)。这三种检测方法都使用聚类中心的一键编码生成特征向量,并且都选择了在KNN、RF和SVM中表现最佳的分类器进行恶意软件检测。我们使用场景A和场景B进行十折交叉验证。表6显示了这三种基于API聚类的检测方法的检测结果。在场景A中,2014年至2018年WMN的平均F1值为58.2%,比AGOH高出19.5%;ASEOH的平均F1值为74.6%,比WMN高出28.2%;AMDASE的平均F1值为82.6%,比ASEOH高出10.7%。在场景B中,2014年至2018年WMN的平均F1值为66.9%,比AGOH高出13.4%;ASEOH的平均F1值为79.0%,比WMN高出18.1%;AMDASE的平均F1值为86.5%,比ASEOH高出9.5%。AGOH和WMN在提取API语义时都没有考虑方法名称,因此这两种方法的性能迅速衰减。与AGOH相比,WMN使用Bert挖掘类名和权限等特征中的语义信息,导致其老化速度相对较慢。ASEOH使用的API聚类方法充分利用了方法名称中包含的语义信息,因此ASEOH的性能与AGOH和WMN相比有了很大的提升。当我们使用从优化调用图中提取的聚类调用对的一键编码作为特征向量(AMDASE)时,检测性能进一步提高。实验结果表明,方法名称在API聚类中起着不可或缺的作用。
6.6 运行时评估
在本节中,我们通过使用从表3中随机选取的2000个应用程序来展示MAMADROID、MALSCAN和AMDASE的运行时开销。表9展示了运行时评估的结果。与AMDASE一样,MAMADROID和MALSCAN也是使用调用图中的API上下文信息进行恶意软件检测的方法。因此,这三种方法的运行时间可以分为三个阶段:调用图提取、特征提取和分类。
-
调用图提取:此阶段从APK文件中提取调用图。MAMADROID和AMDASE都使用Soot(Vallée-Rai等人,2010年)进行代码表示,并使用FlowDroid生成调用图,因此这两种方法的时间成本几乎相同(分别为14.345秒和14.297秒)。MALSCAN使用Androguard(Androguard,2023年)生成调用图。与FlowDroid相比,Androguard的时间成本大大降低(3.912秒,约低72.6%)。
-
特征提取:此阶段将调用图转换为特征向量。MALSCAN需要计算调用图中敏感API的中心性信息,时间成本最大(3.293秒)。AMDASE需要在此阶段优化调用图并嵌入特征,时间成本为0.974秒。MAMADROID从调用图中抽象出函数调用对,转换为包调用对,并构建马尔可夫链来模拟转移概率,所需时间最少(0.529秒)。
-
分类:此阶段使用训练好的机器学习分类器预测应用是恶意的还是良性的。MAMADROID使用PCA进行降维并使用RF进行检测,时间成本为0.028秒。AMDASE使用PCA进行降维并使用SVM进行检测,时间成本为0.025秒。MALSCAN在此阶段只需要使用RF进行检测,时间开销最少(0.003秒)。
MALSCAN专注于在应用商店(如Google Play)中快速扫描大量应用程序。因此,MALSCAN所需的时间在这三种方法中最少(7.208秒)。MAMADROID和AMDASE的运行时开销相对较大(分别为14.902秒和15.296秒)。其中,AMDASE的运行时间最长,但考虑到AMDASE的出色检测性能和极其缓慢的老化速度,AMDASE的运行性能是可以接受的。
6.7 API聚类在语义提取上的能力
在本节中,我们通过分析嵌入空间中常用API的紧密程度来评估API聚类在API语义提取上的能力。我们选择了最常用的200个API,并使用t-SNE(Van der Maaten和Hinton,2008年)算法将高维特征向量映射到二维平面。由于空间限制,图4仅显示了部分可视化结果。在图4中,属于同一聚类中心的API用相同的颜色标记。红色节点是与Android活动生命周期相关的API,黄色节点是与线程活动相关的API,深蓝色节点是与输入输出相关的API,橙色节点是与哈希图相关的API,浅蓝色节点是与数组内容操作相关的API。可以看出,属于同一聚类中心的API具有相似的功能,而具有不同功能的API被分组到不同的聚类中心。值得注意的是,浅蓝色节点和黄色节点都属于Android包java.lang。这表明MAMADROID使用的简单将API分组到其包中的聚类方法不足以提取API语义。如图4所示,具有相似功能的API之间的欧几里得距离较短。这证明了我们的API聚类方法在语义提取上的有效性。我们的方法可以生成更准确反映API功能的嵌入,使得后续的k-均值聚类算法能更好地将具有相似功能的API分组到同一聚类中心。
8. 讨论
API句子的规则
在设计API句子生成规则时,我们发现尽管一些具有不同表达方式的规则含义相同,但API聚类结果对AMDASE的检测性能可能会产生一定影响。例如,将规则"不使用任何权限"更改为"不使用权限"或"没有使用权限"会削弱AMDASE检测进化恶意软件的能力。可能是因为Bert能从"none"中提取的信息比"not"或"no"更多。
API聚类
API聚类属于无监督学习。判断API聚类结果的质量没有绝对正确的答案。聚类的有效性只能通过恶意软件检测的性能来反映。本文提出的API聚类方法可以有效延缓分类器的老化速度,使分类器能够抵抗Android框架中API的变化。
混淆技术
恶意软件可能使用诸如打包(Duan等人,2018年;Lu等人,2020年,2021年)、反射和动态代码加载(Falsina等人,2015年)等混淆技术来逃避静态检测。恶意软件开发者可能将API混淆为未知函数。在调用图优化过程中,这些混淆的API会丢失。然而,调用图优化的目的是我们无法从大量未知函数中有效获取有用信息。与良性应用相比,恶意软件在调用图优化过程中通常会添加更多的API调用对。这些调用对大多与线程活动相关。恶意软件经常伪装成良性应用,并通过多线程活动执行恶意行为。
深度学习分类器
深度学习已广泛应用于网络安全。未来,我们将尝试使用DNN或GNN(Wu等人,2020年)作为恶意软件检测的分类器。本文认为简单的机器学习分类器(如SVM和KNN)更适合检测概念漂移样本,而更强大的分类器(如随机森林)容易导致过拟合现象。基于它们自身的特点,这些复杂的算法可以在训练阶段学习到除恶意行为之外的更多相关性,并取得更好的检测结果,这也使它们难以有效检测进化的恶意软件。
运行时间
值得注意的是,在第6.6节中,MAMADROID和AMDASE在第一阶段的时间成本约占总时间的95%。使用Androguard提取调用图可以大大减少恶意软件检测的时间开销,但同时也会丢失一定量的调用图准确性,最终会影响检测性能。如何快速准确地提取Android应用的调用图仍然是未来的重要研究方向。
9. 结论
持续检测进化的恶意软件是一个重大挑战。为了解决这一问题,我们提出了AMDASE,这是一种新颖的Android恶意软件检测方法,具有API语义提取功能。我们设计API句子来总结重要的API特征,并使用Bert提取API的语义。借助API句子,从API中提取语义信息不仅依赖于包和参数等特征,还依赖于概述API功能的方法名称。为了克服调用图中大量未知函数导致的API上下文信息提取困难,我们提出了一种调用图优化方法,该方法在保持其前驱节点和后继节点之间的连接的同时,移除调用图中所有未知节点。同时,我们将优化后的调用图中的API抽象为代表其功能的API聚类中心,这使得检测方法能够抵抗Android框架和恶意软件中频繁的API变化。我们在开发了七年的42.2K良性和42.5K恶意应用的数据集上评估了AMDASE的有效性。实验结果表明,AMDASE在现有最先进的Android恶意软件检测方法中表现出色,同时也显著降低了老化速率。