GSEDroid:GNN-based Android malware detection framework using lightweight semantic embedding

摘要

目前,安卓恶意软件的流行程度依然相当高。恶意程序越来越多地采用先进的混淆技术,这给安全专业人员带来了更大的挑战,因为它们具有更强的伪装能力、变种增多以及检测难度不断上升。利用语义特征为解决这些挑战提供了一个有前景的途径。嵌入在操作码和 API 调用图中的丰富语义信息已被确定为区分良性与恶意应用程序的关键所在。因此,诸如 Word2vec 等各种自然语言处理(NLP)技术被用于对 Dalvik 操作码序列的特征进行编码,从而产生嵌入表示。鉴于恶意软件开发者往往选择语义相似的 API 来实现类似的功能,因此可以推测此类 API 的操作码嵌入应具有相似的特征。然而,仅提取统计信息的简单 NLP 模型不足以理解混淆后的恶意软件的行为模式,因为它们无法提供全面的语义洞察。为了弥合这一差距,我们提出了一种基于 CodeBERT 和 TextCNN 的新型轻量级嵌入模型。该模型旨在高效且精确地对指令序列进行表示。因此,我们引入了 GSEDroid,这是一个 Android 恶意软件检测框架,它使用带有权限和指令语义特征的 API 调用图来描述 APK。这种方法将检测挑战转化为通过图神经网络算法执行的图分类任务。我们方法的有效性已通过与其他技术的比较分析得到了验证。实验结果表明,我们的 GraphSage + SAGPooling 模型达到了 99.47% 的准确率和 99.44% 的 F1 值,突显了其在 Android 恶意软件检测中的有效性。

介绍

随着全球范围内安卓设备的广泛普及,庞大的用户群体构成了一个巨大的攻击面。根据 Statcounter 于 2023 年发布的《全球操作系统市场份额报告》(GlobalStats,2023),截至 2023 年 2 月,安卓操作系统在全球市场的占有率高达 43.88%。尽管安卓操作系统的开放性和可定制性为用户提供了更多的选择和灵活性,但也为其恶意软件的传播和安装提供了便利。安卓恶意软件攻击者利用各种策略进行盈利,包括窃取敏感信息、展示广告和勒索要求。当前的网络犯罪趋势表明,攻击者的关注重点已转向安卓恶意软件的质量而非数量。G DATA 移动安全报告(CyberDefence General Dynamics,2023)指出,在 2022 年上半年,攻击者的恶意软件感染应用程序的发布频率呈持续下降趋势,从之前的平均每分钟发布五个降至两到三个。尽管攻击的频率有所下降,但其质量却明显提高。中国国家互联网应急中心(CNCERT)发布的《2020 年中国互联网网络安全形势概述》(2020 年)显示,当年共发现约 303 万个新的移动互联网恶意程序,较上年增长 8.5%。然而,从 2014 年到 2020 年,被移除的恶意应用程序数量每年都有所下降。这种情况凸显了控制恶意安卓应用程序源头传播的迫切需求,需要有效切断传播渠道并提高恶意软件检测的准确性。这些挑战增加了对安卓恶意软件检测技术的需求,需要更复杂和有效的方法来应对不断变化的网络威胁环境。

当前针对安卓恶意软件检测的研究广泛采用数据挖掘和机器学习方法来开发有效的检测机制。这些方法大致可分为两类。第一类采用多种机器学习算法,例如支持向量机(SVM)、随机森林和 XGBoost 等。这种方法涉及从安卓应用程序包(APK)中提取代码、资源、配置以及其他关键元素,以形成特征向量。然后使用由机器学习算法构建的分类器对这些向量进行处理,以区分良性软件和恶意软件。然而,传统的机器学习算法通常更适合解决相对简单的问题,并且在处理大规模数据和复杂模式方面可能表现不佳(LeCun 等人,2015 年;赵等人,2021 年 b)。第二类则标志着深度学习算法在安卓恶意软件检测领域的应用。将深度学习技术应用于特定场景已成为一种主流趋势,其中图神经网络(GNNs)成为了深度学习领域的一个焦点研究方向。越来越多的研究人员正在采用来自不同领域的技术来开发安卓恶意软件检测方法。创新之处包括源自图像分析(Yadav 等人,2022 年)、音频(Tarwireyi 等人,2023 年)、网络流量(Wang 等人,2018 年)和日志(Meng 等人,2021 年)的方法。早期的研究主要集中在语法特征上,例如请求的权限(Arora 等人,2020 年)、意图行为、组件间通信(ICCs)(Cai 等人,2019 年)和系统调用(Bhat 等人,2023 年)。最近,图深度学习技术的迅速发展引起了广泛关注。这些技术擅长学习高质量的图表示,从而能够高效地在图上完成各种任务。因此,嵌入在图数据中的语义特征,如函数调用图(FCGs),变得越来越关键。研究人员目前正构建图表以分析和检测恶意软件。例如,GDroid(Gao 等人,2021 年)基于调用关系和 API 使用模式将 APK 和 API 映射到一个大型异构图上,将原始问题转化为节点分类任务。这种方法利用图卷积网络(GCN)为 Android 恶意软件检测和家族分类引入了一种新颖的方法。此外,PermPair(Arora 等人,2020 年)提出了一种通过从清单文件中提取权限对构建图来检测恶意应用程序的新方法。先前的研究(Khan 等人,2021 年;Pekta ̧ s 和 Acarman,2020 年;Zhang 等人,2018 年)表明,可执行文件中的指令码可能包含潜在的信息。鉴于它们能够精细地表示程序的行为模式,Dalvik 指令码被认为是区分良性与恶意 Android 软件的最常见静态特征之一。然而,目前缺乏处理这些特征的标准化方法。人工设计的特征提取过程在资源和时间方面具有显著的代价。为了实现这一过程的自动化,并有效地识别潜在信息并提取深层特征,构建一个能够有效表示指令操作码序列的恰当嵌入模型至关重要。指令操作码序列与文本数据的相似性以及它们与英语单词的紧密相似性,使得它们成为适合用自然语言处理技术处理的合适对象。近年来,已有若干研究提出了使用 N-gram、Word2vec 等方法来处理指令操作码序列。然而,这些方法并非毫无局限性。对于这些自然语言处理模型在指令操作码序列嵌入表示中的有效性,缺乏对比评估和合理的解释。这种评估对于确定这些模型在准确捕捉指令操作码序列的语义本质方面的适用性和有效性至关重要。

为了解决将操作码序列转换为向量嵌入这一难题,我们采用了创新的方法,将预训练模型 CodeBERT 的强大功能与 TextCNN 模型相结合。这种融合方式精准地将 API 的操作码序列映射为嵌入向量。CodeBERT 为我们提供了丰富的上下文信息以及捕捉长距离依赖关系的能力,而 TextCNN 则擅长自主识别和提取有价值的局部特征。此外,我们还进一步整合了权限特征,以实现对 API 节点特征的更全面描述。这种方法使我们能够构建一个融入复杂语义层次的 API 调用图,其中每个图都独特地代表一个 APK。在此基础上,我们引入了两种图神经网络技术:GraphSage 和 SAGPooling。利用 GraphSage 的基于采样的归纳学习框架,我们从相邻节点中聚合信息并捕捉局部邻域结构,从而能够有效地从 API 调用图中学习节点表示,并增强我们对 API 调用模式的理解。此外,我们利用 SAGPooling 的自注意力机制在池化过程中保留最具有信息量的节点,这有助于模型准确捕捉调用图的关键结构特征。这一方面对于恶意软件检测至关重要,因为恶意行为可能在 APK 的特定部分有所体现。这些技术的整合为我们的 Android 恶意软件检测框架 GSEDroid 提供了强大的学习基础设施。这使我们能够深入理解并识别 API 调用图中隐藏的复杂模式,显著增强了我们检测恶意软件的能力。总之,本文的贡献有三个方面:1. 我们引入了一种用于表示 Dalvik 操作码序列的新嵌入模型,利用预训练的 CodeBERT 和 TextCNN 模型的综合优势,以实现对 API 的高效语义嵌入。2. 我们将诸如 APK 的权限属性、API 调用图的结构特征以及 Dalvik 操作码序列的语义特征等各种特性进行整合。这促成了 GSEDroid 的开发,这是一个利用先进的图分类算法来检测 Android 恶意软件的框架。3. GSEDroid 的有效性通过大量的对比实验得到了证实。GraphSage 和 SAGPooling 组合的图模型在公开数据集上的检测准确率达到了 99.47%。本文的其余部分组织如下:第 2 节概述了相关工作。第 3 节描述了所提出的 Android 恶意软件检测框架 GSEDroid。第 4 节描述了我们的实验数据集、实验设置、结果分析以及与其他检测方法的比较。第 5 节提供了对未来工作的见解,第 6 节总结了本文。


相关工作

建议的方法

如图1所示,GSEDORID的总体框架包括原始功能提取和功能处理,构建具有节点属性特征以表示APK的API调用图,并使用图形神经网络将Android恶意软件检测问题转换为图形分类任务。算法1展示具有节点属性特征的API调用图的生成算法。

GSEDroid:GNN-based Android malware detection framework using lightweight semantic embedding_image.png
GSEDroid:GNN-based Android malware detection framework using lightweight semantic embedding_image-3.png GSEDroid:GNN-based Android malware detection framework using lightweight semantic embedding_image-5.png

3.1 功能处理模块

在 Android 系统中,权限主要分为两类:AOSP(Android 开源项目)权限和第三方权限。AOSP 权限是 Android 操作系统固有的,由 Android 的开发者和维护者定义。这些权限控制着应用程序对设备和系统资源的访问权限。另一方面,第三方权限是由独立的开发者或组织创建的,并由第三方应用程序请求,获得用户授权后才会生效。该数据集包含约 12,000 个第三方权限(确切数量为 12,564 个)。由于 APK 中的大多数 API 方法都需要 AOSP 相关权限,并且考虑到恶意软件对 Android 基本权限的常见滥用,我们从数据集中提取了 334 个 AOSP 权限。从中,我们根据请求频率选择了前 64 个权限。本研究通过解析 Manifest 文件中的标签来收集表 1 中详细列出的与权限相关的信息。提取的请求权限的存在被用作构建权限特征向量的基础。由于某些 API 是第三方库中的方法,其没有可访问的指令序列,而另一些则通过 JNI 与原生代码链接,这些代码通常用 C/C++ 等语言编写,因此我们旨在对输入到模型中的指令类型进行标准化。此外,为了使 API 调用图中的节点数量与具有可获取特征的节点数量相匹配,我们使用并改编了 Androguard 工具(Desnos 和 Gueguen,2012),这是一个用于反编译和分析应用程序文件的开源 Python 库。在构建 API 调用图时,我们排除了 DalvikVMObject 中未定义的方法,包括某些第三方库的方法。这些方法可能包含各种代码类型,例如静态 Java 字节码、动态加载的运行时代码以及通过 JNI 链接的 C/C++ 等原生语言的方法(.so 文件)(Qiu 等人,2022 年)。我们还自动过滤掉孤立节点,即既不调用其他 API 也不被其他 API 调用的节点。这种对调用图的修剪旨在降低其复杂性,同时尽可能多地保留恶意软件中常见的敏感 API。随后,我们使用 Python 脚本对 API 操作码序列的语义特征进行了分析。大约有 218 种不同的 Dalvik 操作码。图 2 展示了每个 API 包含的操作码数量。大多数 API 包含的操作码数量少于 250 个。为了帮助 CodeBERT 识别 Dalvik 操作码并将其纳入词汇表,我们对操作码进行了映射操作,如表 2 所示。
GSEDroid:GNN-based Android malware detection framework using lightweight semantic embedding_image-2.png
GSEDroid:GNN-based Android malware detection framework using lightweight semantic embedding_image-1.png

3.2. 构建包含节点特征的 API 调用图的模块
图 3 展示了用于处理操作码序列的嵌入模型流程。如算法 1 所述,API 的操作码序列被输入到预训练的 CodeBERT-base 模型中。通过一系列 12 个堆叠的 Transformer 编码器块,我们获得了 CodeBERT 输出中每个标记的向量表示,形成了维度为 (N*768) 的词向量矩阵。对于表 2 中的操作码,如“add-double”,我们将它们分解并映射为两个标记:“add”和“double”。这种方法旨在最大限度地利用嵌入在预训练模型 CodeBERT 中的先验知识。要做到这一点,确保从操作码映射出的所有标记都包含在 CodeBERT 的词汇表中至关重要。因此,这里的“N”并不表示操作码序列的数量,而是表示映射的操作码序列所对应的标记数量。然后,这些序列由 TextCNN 层处理。为了确保向量长度一致,根据前面提到的操作码数量范围执行填充或截断操作。使用不同大小的卷积核进行卷积运算,并以 ReLU 作为激活函数。每个卷积核的大小均采用 64 个滤波器来表示,正如 Zhang 和 Wallace(2016 年)所指出的那样,他们提到采用相同大小的多个滤波器旨在从同一窗口中学习互补特征。随后的 K-Max 池化(其中 k 设为 1)从每个特征向量中选择前 K 个特征,然后将它们连接起来形成一个复合向量表示。随后,一个线性层将这些特征压缩到固定维度 32、64、96、128。提取的权限特征向量和操作码特征向量与 API 调用图进行连接和合并,从而创建 APK 的图表示。将预训练的 CodeBERT 模型与 TextCNN 模型相结合,用于从 Dalvik 操作码序列中提取特征向量,具有整合多层语义信息的优势。

CodeBERT 由于其自注意力机制,能够捕捉序列中的长距离依赖关系和复杂的上下文信息。该模型在预训练期间从自然语言和编程语言数据中学习了大量的先验知识,能够捕捉丰富的语义表示,尤其是由于 Dalvik 操作码与编程语言和自然语言非常相似。这意味着该模型更能够理解指令与数据流之间的关系。另一方面,TextCNN(文本卷积神经网络)通过将特征提取层与不同滤波器大小相结合进一步提取局部特征,从而从各种粒度的信息中获取特征。操作码序列可能包含特定的语法结构或模式,TextCNN 可以通过卷积操作捕获这些特征,有助于从操作码序列中提取关键特征。这两种方法的结合提供了强大的特征提取机制,从不同角度分析输入序列,增强了模型对 Dalvik 操作码序列的理解,有效地提高了特征提取的质量,并更全面地捕捉语义信息。将这两种方法相结合,能够将嵌入向量压缩为维度更小的向量,从而提高模型的训练速度并降低计算成本。对 CodeBERT 进行微调通常需要相对较多的时间,因为这需要大量的数据集和多次训练迭代;然而,对 TextCNN 进行微调所需的时间则较少,这是因为该模型体积较小、训练速度更快且计算成本更高。在资源受限的环境中,单独使用 CodeBERT 可能效率不高。TextCNN 是一种轻量级的卷积神经网络,能够在保持性能的同时降低计算需求。

3.3 基于GNN的检测模块

在我们的最终阶段,这些图被输入到图神经网络(GNN)中用于图分类任务。我们所采用的 GNN 框架包含三个主要组成部分:过滤层、激活层和图池化层。在这个框架内,过滤层和激活层的功能是生成增强的 API 节点特征,而图池化层则将这些节点特征聚合起来,以生成能够捕捉调用图完整信息的高级特征。这一过程产生了具有更抽象和更高层次节点特征的粗化图。图 4 中我们的 GNN 结构由几个由过滤层、激活层和正则化组成的块组成,随后是图池化和读出层,最终形成一个通过全连接层处理的图级别表示,以产生输出。选择合适的过滤层和图池化层在 GNN 构建中至关重要,因为它们的设计直接影响模型的性能及其理解图结构的能力。

GSEDroid:GNN-based Android malware detection framework using lightweight semantic embedding_image-4.png