[论文翻译]结合权限和应用程序接口调用序列预测安卓恶意软件

陈欣 杭州电子科技大学计算机科学与技术学院,中国杭州 310018

摘要

恶意软件检测是软件维护中的一项重要任务。它能有效保护用户信息免受恶意开发者的攻击。现有研究主要侧重于利用权限信息和 API 调用信息来识别恶意软件。然而,许多研究只关注了 API 调用,却没有考虑 API 调用序列的作用。在本研究中,我们提出了一种结合权限信息和 API 调用序列信息来区分恶意应用程序和良性应用程序的新方法。首先,我们使用反编译工具提取权限和 API 调用序列的特征。然后,采用单次编码和 Word2Vec 分别表示每个应用程序的权限特征和 API 调用序列特征。在此基础上,我们利用随机森林(RF)和卷积神经网络(CNN)分别训练基于权限的分类器和基于 API 调用序列的分类器。最后,我们设计了一种线性策略,结合这两种分类器的输出来预测新到达应用程序的标签。通过对 15198 个恶意应用程序和 15129 个良性应用程序的评估,我们的方法平均精确度达到 98.84%,召回率达到 98.17%,F1 分数达到 98.50%,准确率达到 98.52%,分别比最先进的方法 Malscan 高出 2.12%、0.27%、1.20% 和 1.24%。此外,我们还证明了结合两种特征的方法比基于单一特征的方法取得了更好的性能。

关键词

Android 恶意软件 - 恶意软件检测 - 权限 - API 调用序列 - CNN

1 引言

        随着移动设备的迅猛发展,移动应用在我们的日常生活和工作中变得越来越重要,功能也越来越强大。2020 年第一季度,Google Play1 和 Apple Store2 上可供下载的应用程序数量分别约为 256 万和 185 万。由于开源的特性,安卓系统吸引了众多移动终端供应商和开发者,成为移动设备的主流操作系统。然而,在强大的商业利益驱使下,部分开发者为谋取经济利益或其他动机,试图开发恶意应用程序窃取用户信息。G DATA 的报告显示,2017 年第一季度发现了约 75 万个新的恶意安卓应用程序3。此外,在2020年第一季度,卡巴斯基的移动产品和技术检测到1,152,662个恶意安装包,比上一季度多出171,669个4。可以预见,大量恶意应用程序将继续被开发和传播,从而在安卓设备上引发各种网络犯罪。然而,由于安卓恶意软件的隐蔽性,智能手机用户很难区分恶意应用程序和良性应用程序。

最近,研究人员开发了许多检测安卓恶意软件的方法。在现有研究中,权限特征被广泛用于安卓恶意软件检测(Alazab 等人,2020;Arp 等人,2014;Peiravian & Zhu,2013;Wang 等人,2014)。由于安卓系统采用权限机制来控制敏感资源的访问,一些研究人员采用源代码分析工具来提取权限特征,并建立分类器来判断应用程序是否为恶意软件。然而,由于权限特征缺乏语义信息和程序行为的上下文信息,这些方法很容易被混淆所规避。为了克服这一难题,一些研究人员采用了安卓 API 调用序列特征来检测恶意软件(Jerbi 等人,2020;Pektaş & Acarman,2020;Wu 等人,2012)。一般来说,他们利用一些工具反编译应用程序以提取 API 调用序列信息,并分析 API 调用序列中包含的潜在恶意模式。然后对这些特征进行编码,训练分类器来预测每个新应用程序的标签。总之,这些研究采用权限特征或API调用序列特征来检测Android恶意软件,性能并不乐观。

本文提出了一种基于权限特征和 API 调用序列特征的新方法。首先,我们从安装包中包含的清单文件中提取权限列表,并通过反编译工具从源代码文件中提取 API 调用序列。然后,考虑到权限和 API 调用序列之间的巨大差异,我们采用了两种策略来表示这两种特征。对于权限特征,我们采用单点向量来表示每个权限。对于 API 调用序列特征,我们利用 Word2Vec 技术将每个 API 转换为低维向量。然后,应用随机森林(RF)算法和卷积神经网络(CNN)算法分别训练基于权限的分类器和基于 API 调用序列的分类器。最后,设计出一种线性策略,结合两个分类器的输出来预测新到达应用程序的标签。

在本文中,我们做出了以下贡献:

- 在本文中,我们尝试结合权限信息和 API 调用序列信息来解决恶意软件检测问题。

- 我们构建了一个基于权限的分类器和一个基于 API 调用序列的分类器,并设计了一种线性策略来整合这些分类器的输出,从而预测每个新应用程序的标签。

- 我们在公共可用数据集上进行了大量实验,以评估所提出方法的性能。实验结果表明,我们的方法比基线方法取得了更好的性能。

本文的其余部分安排如下。第 2 节介绍了本文的背景和写作动机。第 3 节详细介绍了我们的方法。3.第 4 节和第 5 节分别介绍了实验装置和实验结果。第 6 节讨论了有效性面临的威胁,第 7 节回顾了相关工作。最后,我们在第 8 节总结本文并概述未来工作。

2 背景和动机

在本节中,我们将详细介绍安卓恶意软件的背景,并解释开展这项工作的动机。

恶意软件是一种故意设计的软件,会破坏计算机、服务器、客户端或计算机网络(Nash,2005)。安卓恶意软件旨在攻击安卓系统,包含多种恶意软件类型,包括间谍软件(Herley et al.,2015)、勒索软件(Young & Yung,1996)和木马(Landwehr et al.,1994)。例如,间谍软件通过非法记录语音通话、聊天信息和其他个人信息来监控特定用户。因此,用户的隐私和秘密会被这些恶意程序泄露。勒索软件可以非法加密用户的重要数据。如果用户不知道秘钥,就无法获取加密信息。通过这种方式,攻击者可以威胁用户支付赎金。因此,这些恶意应用程序严重破坏了信息安全。事实上,大多数新的恶意应用程序都是已知恶意软件的变种,它们重复使用恶意组件。Zhou和Jiang(2012)发现,86%的安卓恶意应用程序是通过将合法应用程序与恶意组件重新打包而产生的。一般来说,恶意开发者会从 Google Play 下载并反编译一些流行的良性应用程序。在这些应用程序中注入恶意组件或代码后,开发者采用混淆工具逃避检测,最后重新打包并上传到第三方市场以吸引用户。

为防止恶意攻击,安卓系统通常会提供多层保护。其中最重要的是权限控制策略,它是安卓安全机制的核心设计点之一。它可以通过限制一些特殊操作来有效保护用户隐私(Alazab et al.在安卓应用程序的开发阶段,开发人员会在一个清单文件(即 AndroidManifest.xml)中声明权限请求。安装应用程序时,系统会显示一个对话框,显示所请求的权限列表,并询问用户是否可以授予这些相关权限。根据经验,不同的权限会对应用程序产生不同的影响。谷歌根据权限的风险程度将权限分为三个等级,即正常权限、签名权限和危险权限5。正常权限对用户隐私或其他应用程序的运行风险很小,而危险权限则有可能损坏用户的一些重要文件或数据。表 1 列出了一些权限和相应的保护级别。例如,ACCESS_NETWORKST_ATE 权限的保护级别为普通,允许应用程序访问网络信息。

图 1 显示了我们的数据集上请求权限数量不同的应用程序的分布情况。我们可以发现,50% 以上的良性应用程序请求的权限少于 5 个。此外,与良性应用程序相比,恶意应用程序通常会请求额外的权限,这可以有效支持它们的恶意行为。因此,许多研究人员倾向于利用权限来识别恶意软件(Alazab 等人,2020;Arp 等人,2014;Peiravian & Zhu,2013;Wang 等人,2014)。虽然这些研究证明权限功能有助于安卓恶意软件的检测,但基于权限的方法也存在一些局限性。例如,应用程序可能会在清单文件中声明所需的权限,但这些权限在实际中根本不会被使用。这将提供误导性的权限信息,从而影响检测结果。此外,Shao 等人(2016)还发现,有些应用程序在没有权限的情况下仍能访问敏感资源,因此基于权限的方法很难识别这些应用程序。

因此,一些研究利用 API 调用信息来区分恶意应用程序和良性应用程序(Alazab 等人,2020 年;Peiravian & Zhu,2013 年)。在安卓平台中,API 用于与底层安卓系统交互,应用程序可通过调用不同的 API 实现其功能。因此,研究人员可以通过 API 调用信息分析应用程序的恶意行为,从而识别恶意软件。然而,这些方法大多只是提取 API 调用信息,却忽略了 API 调用之间的序列信息。因此,这些方法很难识别一些恶意应用程序,而这些恶意应用程序在良性应用程序中也有类似的 API 调用。图 2 显示了一个恶意应用程序的反编译片段,这是一个 SMS 间谍软件。该片段有序地调用了一些应用程序接口,即[init, init, getLastScan,..., query, getColumnIndex, ...]。在这个片段中,当前操作基于前一个操作,并影响下一个操作。通过按顺序调用这些 API,恶意程序可以获取短信列表。因此,分析 API 调用序列有助于了解应用程序的意图,提高检测恶意软件的准确性。

基于上述背景,我们尝试探索一种新的分类方法,结合权限特征和 API 调用序列特征来检测恶意应用程序。

3 方法

在本节中,我们将系统地描述我们的方法的整个流程。如图 3 所示,我们的方法将安卓应用文件的相应向量作为输入,然后输出应用的类别标签,即恶意软件和良性应用。更具体地说,我们首先从反编译应用程序中提取权限和 API 调用序列。然后,在向量表示阶段,我们采用两种不同的策略分别表示权限和 API 调用序列。然后,应用 RF 训练基于权限的分类器,同时应用 CNN 训练基于 API 调用序列的分类器。最后,我们使用线性策略结合这两种分类器的结果来预测新到达应用程序的标签。

3.1 特征提取

通常,一个 Android 应用程序包包括一个清单文件和一个 dex 文件。清单文件描述了应用程序的基本信息,而 dex 文件则包含应用程序的所有代码。在我们的方法中,我们利用 Androguard(Mercaldo 等人,2016 年)分别从清单文件和 dex 文件中提取权限特征和 API 调用序列特征,Androguard 是一款广泛用于安卓应用程序逆向工程的 python 工具。

对于权限功能,我们使用 Androguard 反编译安卓应用程序,并返回一个 apk 对象,其中包含该应用程序的一些信息,如权限、反编译指令和活动。因此,我们可以直接从该 apk 对象中获取权限列表。

 针对 API 调用序列功能,我们可以收集 API 调用,并通过反编译指令将其有序组织起来,形成 API 调用序列。如图 2 所示,正常的 API 调用指令格式如下:

操作码是 invoke-direct,调用的 API 是 java/util/ArrayList;-><init>()V。一般来说,用于调用的操作码包括 invoke-direct、invoke-static、invokeinterface;java/util 是该 API 的包名,ArrayList 是类名,init 是函数名。调用该 API 是为了初始化数组对象。因此,通过检查操作码的类型,我们可以判别这些指令是否用于调用 API。受 Karbab 等人(2018)的启发,Android 应用程序的 API 调用序列是通过按顺序合并该应用程序中每个基本块的 API 调用序列生成的。假设以 d 表示的反编译应用程序由 n 个基本区块组成,d = {b1, b2, ..., bn} 。每个基本模块都由一系列指令组成。因此,基本程序块的 API 调用序列是通过记录所选指令的操作数生成的。对于整个应用程序,我们忽略基本程序块之间的关系,将每个基本程序块的 API 调用序列有序合并为整个应用程序的 API 调用序列。

3.2 预处理

提取特征后,我们对权限特征和 API 调用序列特征进行预处理,过滤掉无用信息,如自定义权限和用户自定义函数。

对于权限功能,我们建立了一个字典,其中包含官方定义的权限。给定一个应用程序,我们首先提取所有权限。然后,如果某个权限与字典中的任何权限不匹配,就会被删除。最后,保留的权限就是官方定义的权限。事实上,谷歌在每个版本的 API 级别中都会不断更新权限,增加一些权限或删除一些权限。因此,不同 API 级别的权限数量是不同的。例如,最新的安卓版本(2020 年发布的 API 级别 30)包含 166 个权限,而最早的安卓版本(API 级别 1)包含 76 个权限。考虑到我们数据集中的应用程序是从 2011 年到 2018 年的,我们收集了 API 级别 1 到 28 中官方定义的权限,并删除了重复的权限,形成了最终的权限字典。

通过对 API 调用的调查,我们发现存在一些第三方库,包括 API 调用和用户自定义函数调用,由于这些调用通常由混合符号或单词组成,因此被视为 API 调用序列中的噪声,从而妨碍了分类结果。因此,我们需要过滤掉噪声数据。我们识别每个 API 调用的软件包名称。如果 API 调用涉及官方软件包,包括 android、org、java、dalvik、javax 和 junit,我们就保留这些 API 调用。与此同时,其他所有 API 调用都会被过滤掉。

3.3 向量表示法

特征提取后,主要任务是表示每个样本的特征信息。在本研究中,我们提取了两种类型的特征。它们之间存在差异。首先,API 的数量远远超过权限的数量。因此,我们需要采用两种不同的策略来表示这两类特征。其次,API 调用序列特征包含语义信息。因此,API 调用序列的策略应有效反映语义信息和上下文信息。

3.3.1 权限矢量表示法

对于权限特征,我们采用单次编码法。更具体地说,每个权限可以用一个 N 维向量来表示,其中 N 是权限的数量。该向量由所有单元格中的 0 组成,只有单元格中的单个 1 除外,用于唯一标识相应权限(Harris & Harris,2010 年)。例如,有三个权限 a、b、c。[1, 0, 0] 表示 a,[0, 1, 0] 表示 b,[0, 0, 1] 表示 c。因此,如果应用程序请求权限 a 和 b,其向量表示为 [1, 1, 0]。

3.3.2 API 调用序列的矢量表示法

与权限不同,API 的数量非常大。单次编码不适合表示 API 调用序列,因为维数过高可能会导致维数诅咒问题。因此,我们尝试采用神经网络方法来表示 API 调用序列的向量,如 Word2Vec 和 Auto-Encoder。由于我们需要考虑 API 调用序列中包含的语义信息,因此我们使用 Word2Vec 技术来表示 API 调用序列因为 Word2Vec 可以将每个 API 调用序列转换为低维向量,同时保留每个向量的特定上下文信息。

Word2Vec 是一种广泛应用于自然语言处理(NLP)的技术。它最初的设计目的是将单词序列中的每个单词转化为低维向量。一般来说,Word2Vec 包括连续词袋(CBOW)(Mikolov 等人,2013a)和连续跳格(Skip-gram)(Mikolov 等人,2013b)。CBOW 模型根据上下文预测当前单词,而 Skip-gram 模型旨在根据给定的输入单词预测上下文。考虑到 Skip-gram 模型在语义任务上的效果比 CBOW 模型好得多(Mikolov 等人,2013a),我们选择 Skip-gram 模型来表示我们的方法中的 API 调用序列。图 4 显示了 Skipgram 模型的框架,并举例说明了其工作原理。在图 4a 中,Skip-gram 模型包含三层:输入层、隐藏层和输出层。它的目的是获得输入层和隐藏层之间的权重参数矩阵 WV×N,其中 V 是训练集的词汇量,N 是隐藏层的大小。在输入层,单词由一个单击向量表示,向量长度也是 V。基于 WV×N,Skip-gram 将输入传播到隐层 h,其定义如下:

其中,x 是词汇表中第 k 个单词的向量表示。由于 x 是一个向量,对于所有 k′ ≠ k,xk = 1,xk� = 0,因此 h 的输出是 WV×N 的第 k 行,即 W(k,)。

然后,隐层的输出继续向前传播。图中,输入词为 wx,上下文长度设为 2d + 1。输出层输出 2d 多叉分布,每个输出由具有相同参数矩阵的 softmax 函数计算。根据 wx 的输入,Skip-gram 尝试预测 wx 的上下文词,概率计算公式如下:

其中 wi,j 是输出层第 i 个面板上的第 j 个单词,wO,j 是第 j 个单词的实际上下文单词,ui,j 是输出层第 i 个面板上第 j 个单元的值。跳过图模型的目标是最大化实际输出[wx-d, ..., wx-1, wx+1, ..., wx+d ]的概率,损失函数转化为

通过反向传播,Skip-gram 通过调整参数矩阵 WV×N 来优化输出。经过训练后,我们得到了 WV×N 矩阵,因此每个 API 调用序列都可以用一个低维向量来表示。在图 4b 中,我们选择文本 "an example for the skip-gram model "来预测中心词 "the "的周围上下文。当 d = 2 时,以单击向量 [0, 0, 0, 1, 0, 0, 0] 作为输入,模型会输出另一个向量 [0.13, 0.15, 0.13, 0.16, 0.15, 0.14, 0.14],该向量与目标向量 [0, 1, 1, 0, 1, 0] 相差很大。在这项工作中,我们利用 python 工具 Gensim(Srinivasa-Desikan,2018),这是一个用于无监督主题建模和 NLP 的开源库,用于训练 Skip-gram 模型。

3.4分类器

同样,鉴于向量表示方法的特点,我们在本研究中分别采用了随机森林(RF)和卷积神经网络(CNN)这两种不同的方法来训练分类器。

3.4.1 随机森林

 RF 是 Breiman 等人(2001 年)开发的一种分类和回归算法。它是在缩小的训练集上学习的一组决策树的集合,这些决策树相互独立。缩小的训练集由样本和特征随机抽样构成。为了确定测试样本的类别,所有决策树的输出都要进行投票,以确定最终输出。由于每棵决策树都是未经修剪且充分生长的,因此具有低偏差的特点(Zhu 等人,2018)。同时,由于这两种操作的随机性,RF 可以纠正决策树的过拟合问题。最终的预测结果是根据这些决策树的预测结果确定的。

在本研究中,我们采用 RF 技术来构建基于权限的分类器,以区分恶意应用程序和良性应用程序。具体来说,我们利用机器学习的 python 库 scikit-learn (Pedregosa 等人,2011 年)来实现 RF 分类器。min_samples_leaf 指的是叶节点所需的最小样本数,n_estimators 指的是森林中树的数量。为了优化分类器,我们通过网格搜索来调整这些参数(LeCun 等人,1998a)。

3.4.2 CNN

许多研究已经证明了深度学习在分类和回归方面的良好性能。在我们的方法中,我们采用 CNN(Hui 等人,2021 年)来实现基于 API 调用序列的分类器。CNN 模型的神经网络架构概览如图 5 所示。

1.输入层和嵌入层:首先,将每个应用程序表示为一个 API 调用序列 d =(API1, API2, ..., APIn),并将其输入输入层。然后,在嵌入层中,通过 Word2Vec 生成字典,并将每个 API 转换为 d 维向量。因此,每个应用程序可以用一个矩阵 d =(v1, v2, ..., vn)来表示,其中 vi 是第 i 个 API 调用的向量。

2.卷积层:卷积层包含一组需要学习参数的滤波器。在我们的方法中,我们采用了三种大小的卷积核,即 3、4 和 5,来从输入层提取不同的特征。此外,我们还使用 ReLU 作为激活函数,其定义如下:

 

 其中,w 是卷积核,x 是输入向量,b 是模型训练过程中需要学习的偏移量。

3.池化层:池化层用于减少卷积层输出的冗余。在这一层中,我们采用了最大池化,它可以将输入划分为不重叠的区域,并选择每个区域的最大值作为输出

4.全连接层和输出层:全连接层将池化层的每个输出合并为一个特征向量。然后,特征向量作为输入被转发到输出层。输出层通过 softmax 函数预测每个类别(即恶意或良性)的概率。

5.模型训练:在该模型的训练过程中,我们采用自适应学习率方法 Adam(Kingma & Ba,2014),该方法是随机梯度下降算法(Bottou,1998)的扩展,用于优化模型。通过这种方法,我们可以在训练过程中有效地更新模型参数。

3.5 分类器融合

这一步是整合这两个分类器,每个分类器都对最终结果有贡献。一般来说,有两种方法可以合并不同分类器的输出结果。一种是计算所有分类器输出的平均值。不过,这种方法无法反映不同特征的重要性。另一种方法是计算每个分类器的加权结果。这种方法可以有效反映不同特征的重要性,但需要设置一个额外的参数。在本研究中,由于每个分类器对最终结果的贡献不同,我们计算每个分类器的加权结果,其定义如下:

 其中,α 是反映不同分类器贡献的参数,RRF 是基于 RF 的分类器的结果,RCNN 是基于 CNN 的分类器的结果,R 是轮值,0 表示良性,1 表示恶意。

4 实验设置

在本节中,我们将详细介绍实验设置。首先,我们提出研究问题(RQs)。然后,我们解释本研究中使用的数据集。然后,我们介绍基线方法。最后,我们将介绍实验平台和参数设置。

4.1 研究问题

在本文中,我们主要研究以下五个问题,从不同方面验证我们方法的有效性。

- 问题 1:我们的方法能否优于基线方法?

- 问题 2: 结合这两个特征的效果如何?

- 问题 3: 参数α如何影响我们方法的有效性?

- 问题 4: 当训练集和测试集属于不同年份时,我们的方法性能如何?

- 问题 5: 识别恶意软件最重要的权限和 API 调用子序列是什么?

问题 1 旨在通过与基线方法进行比较,评估我们方法的有效性

问题 2 旨在研究基于这两种特征组合的方法是否优于基于单一特征的方法。

问题 3 旨在研究不同的α 对分类结果的影响。

问题 4 的目的是测试当测试集和训练集属于不同年份时我们的方法的鲁棒性。

问题 5 旨在研究识别恶意软件最重要的权限和 API 调用子序列。

4.2 数据集

在文献中,Wu 等人(2019)通过抓取 Andrzoo(Allix 等人,2016)中的 apk 创建了一个数据集,该数据集目前包含超过 1 200 万个 apk,其中每个 apk 都经过数十种不同反病毒产品的检测,以确定其是否为恶意。在本研究中,我们还根据 Wu 等人(2019)提供的 apk 列表从 Andrzoo 抓取 apk,并删除了 388 个损坏的 apk 文件。最终,数据集由 30,327 个样本组成,包括 15,129 个良性应用和 15,198 个恶意应用。

为了更好地评估我们方法的有效性,我们将数据集按年份划分为子数据集。表 2 显示了数据集的摘要信息。我们可以看到,数据集由 8 个子数据集构成,每个子数据集的应用程序都来自同一年,如 2011 年和 2012 年。如表所示,每个子数据集中良性应用和恶意应用的数量都很接近。例如,2011 年的良性应用和恶意应用数量分别为 1 919 和 1 916。同时,良性应用和恶意应用的总数接近 1:1。

值得注意的是,我们只是按照 Wu 等人(2019 年)提供的列表抓取数据,并没有执行额外的操作来保持这种平衡。Wu 等人之所以保持平衡,可能是因为这有利于分类器的训练。此外,我们还可以发现,2013 年至 2018 年的 apk 平均大小约为 7MB,而 2011 年和 2012 年的 apk 平均大小分别为 2.48MB 和 3.70MB。原因可能是 2011 年和 2012 年的移动应用数量较少。移动设备的配置很难运行复杂的应用程序,而且用户对移动应用程序没有期望。

4.3 衡量标准

在我们的研究中,我们的目标是从原始应用程序中检测恶意软件,这可以被视为一个二元分类问题。在许多关于二元分类的研究中,精确度、召回率、F1-分数(F1)和准确度经常被用来评估自动化技术的有效性。因此,我们也采用这四个指标来评估我们方法的有效性。

让 TP 表示正确分类的恶意样本数,TN 表示正确分类的良性样本数,FP 表示错误分类的恶意样本数,FN 表示错误分类的良性样本数。

精度评估预测结果的正确程度。精度计算公式如下

 召回率反映了预测结果与基本事实之间的一致程度。召回率的计算公式如下。

F1 分数是精确度和召回率之间的权衡。F1 分数的计算公式如下。

准确度是指所有类别的预测结果与基本真实值之间的正确程度。准确度的计算公式如下。

 

4.4 评估方法

为了减少过拟合和选择偏差的影响,研究人员通常采用十倍交叉验证来评估他们的方法(Kohavi 等人,1995 年)。因此,在本研究中,我们也采用十倍交叉验证来评估我们的方法。更具体地说,我们将数据集随机分成 10 个褶皱,每个褶皱包含相同数量的样本。在每次运行中,使用 9 个折叠作为训练集来训练模型;然后,通过剩余的折叠来评估训练好的模型。我们对每个数据集运行 10 次实验并测量指标。然后计算这些指标的平均值作为最终结果。

4.5 基准

为了评估我们的方法,我们选择了两种经典方法和两种最先进的方法进行比较。

Drebin(Arp 等人,2014 年)是一种经典的安卓恶意软件检测方法,它进行了广泛的分析,从 apk 中提取尽可能多的特征,如权限、URL 和意图。将这些特征嵌入向量后,他们训练了一个基于 SVM(Vapnik,2013 年)的模型来检测恶意软件。

DroidAPIMiner(Aafer 等人,2013 年) 一种经典的安卓恶意软件检测方法,它利用权限、API 调用和 API 的参数来表示应用程序。然后,他们采用 k 近邻算法来识别恶意软件。

Malscan(Wu 等人,2019) 一种最先进的安卓恶意软件检测方法,它将安卓应用程序的函数调用图视为社交网络,并进行基于社交网络的中心性分析,以提取语义特征来检测恶意软件。

MalDozer(Karbab等人,2018) 一种最先进的安卓恶意软件检测方法,它提取API调用序列作为特征。将 API 嵌入低维向量空间后,他们采用了基于 CNN 的模型来识别恶意软件。

4.6 实验平台和参数设置

在本文中,所有实验均使用 Python 3.7 进行,由 Pycharm 2019.2 编译,并在装有 64 位 Ubuntu 16.04、英特尔酷睿 (TM) i9-7900X CPU 和 GeForce GTX 1080Ti GPU 的 PC 上运行。

RF和 CNN 包含一系列参数,这些参数对我们方法的性能有很大影响。因此,为了实现良好的性能,参数设置如下。在RF模型中,我们通过实验来确定这两个参数。

 最终,树的数量设为 131,叶节点的最小数量设为 1。同时,其他参数均为默认值。表 3 列出了 CNN 模型的参数设置。CNN 涉及六个超参数。我们利用梯度搜索法(LeCun 等人,1998b)来获得超参数的合适值。历元数是训练模型的历元数。批量大小是每次梯度更新的样本数。Dropout rate 是指输入单元的下降率。嵌入大小是嵌入层中 API 调用向量的维度。卷积滤波器数量是指卷积层中卷积滤波器的数量。卷积滤波器大小是指卷积核的大小。

5 实验结果

本节旨在评估我们提出的方法,并回答前面提到的问题。

5.1 对问题 1 的调查

问题 1:我们的方法能否优于基线方法?

动机 本文提出了一种结合权限特征和 API 调用序列特征来检测安卓恶意软件的新方法。目前,已有许多方法被采用来解决这一问题。为了评估我们的方法的有效性,我们选择了两种经典方法(DroidAPIMiner(Aafer 等人,2013 年)和 Drebin(Arp 等人,2014 年))和两种最先进的方法(Malscan(Wu 等人,2019 年)和 MalDozer(Karbab 等人,2018 年))作为比较基准。在本研究问答中,我们将研究我们的方法能否在检测安卓恶意软件方面优于基线方法。

方法 我们使用包含恶意应用程序和良性应用程序的数据集来训练 RF 分类器和 CNN 分类器。在本研究中,我们按照十倍交叉验证法将每年的样本分为 10 个等效褶皱,每个褶皱都包括恶意应用和良性应用。每年,我们使用 9 个折叠样本创建训练集。剩下的 1 份样本用于评估这两个分类器在检测恶意软件方面的有效性。我们对 10 个褶皱中的每个褶皱重复这一过程,每个褶皱对 9 个褶皱进行训练,对剩余的 1 个褶皱进行测试。计算每年 10 次运行的平均结果。

由于这四种方法只采用了本文所使用的部分指标来评估其方法的有效性,且实验中使用的数据集与本研究不同,因此我们无法直接照搬其研究中的实验结果来验证我们方法的有效性。因此,在本实验中,我们完全按照他们的研究描述重现了这四种方法。首先,我们利用相同的 python 工具来提取这四种基线方法中使用的特征。然后,我们根据研究中使用的评估方法(Aafer 等人,2013 年;Arp 等人,2014 年;Wu 等人,2019 年;Karbab 等人,2018 年)创建训练集和测试集。最后,我们通过训练集训练分类器,并预测测试集的标签,以评估这四种方法的有效性。

结果 表 4 列出了我们的方法和基线方法分别在精确度、召回率、F1 分数和准确率方面的实验结果。在表中,我们使用 "P"、"R"、"F1 "和 "A "分别代表精确度、召回率、F1-分数和准确率。此外,每个子数据集上的最佳结果以粗体标出。

如表 4 所示,我们的方法在每个子数据集上都能获得最高的 F1 分数。平均而言,我们的方法获得了 98.50% 的 F1 分数,分别比 Malscan、MalDozer、DroidAPIMiner 和 Drebin 高出 1.21%、4.71%、2.29% 和 2.32%。同时,在这些子数据集上,我们的方法在精确度和准确度方面也取得了最佳结果。潜在原因是我们的方法结合了权限特征和 API 调用序列特征的优势,可以全面检测恶意软件。不过,在某些子数据集上,一些基准方法的召回率略高于我们的方法。例如,2018 年,Malscan 的召回率达到 98.58%,比我们的方法高出 1.03%。这可能是由于我们的方法是通过将两个分类器的输出结果与权重相结合来进行分类的,当选择不同的权重值时,可能会对最终结果产生影响。也就是说,在该子数据集上,当参数α设置为另一个不同值时,我们的方法可能会取得更好的结果。此外,从表 4 中可以看出,我们的方法在所有子数据集上获得的精确度都高于召回率。这表明,我们的方法可能会在牺牲召回率的情况下获得更高的精确度。我们将在问题 3 中介绍我们的方法在不同权重下的结果,从而回答这个问题。

在这些基线方法中,Malscan 和 MalDozer 都采用单一特征来检测恶意软件。与 MalDozer 相比,Malscan 在大多数子数据集上都取得了更好的 F1 分数。潜在原因是 Malscan 可以提取敏感 API 的结构语义来检测恶意软件。同样,DroidAPIMiner 和 Drebin 应用权限和 API 调用来检测恶意软件。他们只关注语法信息,即只考虑是否调用了某些 API,而忽略了 API 调用的序列信息的作用。除了语法信息,我们还考虑了API调用的序列信息来检测恶意软件,因此我们的方法比DroidAPIMiner和Drebin有更好的性能。

总之,我们的方法在精确度、召回率、F1 分数和准确率方面的平均成绩分别为 98.84%、98.17%、98.50% 和 98.52%,优于这些基线方法。

5.2 对问题 2 的调查

问题 2: 结合这两个特征的效果如何?

现有方法通常采用权限特征或 API 调用序列特征来检测恶意软件。在本研究中,考虑到这两个特征各自的优势,我们尝试结合这两个特征来检测恶意软件。但是,我们并不承认两种特征的组合在恶意软件检测中是否优于单一特征。

在本研究问答中,我们主要侧重于研究这两种特征组合的有效性。

方法 在本 RQ 中,我们将我们的方法与我们方法的两个变体(即基于权限的方法和基于 API 调用序列的方法)进行比较。在本实验中,我们删除了一个分类器,保留了另一个分类器。此外,在模型训练过程中,我们保持其他步骤不变,以验证其检测效果。值得注意的是,我们对这两种变体采用了不同的向量表示方法,因为实验证明单次编码更适合基于权限的方法,而跳格模型更适合基于 API 调用序列的方法。

        结果 表 5 显示了我们的方法和这两种变体在精确度、召回率、F1 分数和准确率方面的实验结果。如表所示,我们的方法在精确度、召回率、F1 分数和准确率方面的平均成绩分别为 98.84%、98.17%、98.50% 和 98.52%,优于基于权限的方法和基于 API 调用序列的方法。此外,在所有子数据集上,我们的方法和基于 API 调用序列的方法在精确度、召回率、F1 分数和准确率方面都优于基于权限的方法。潜在原因可能是 API 调用序列的维度远高于权限的维度。维数越高,API 调用序列传达的信息就越多。此外,API 调用序列特征还包含一些语义信息,如程序行为信息,这可以提高分类性能。

        此外,我们还发现,我们的方法在过去五年中取得了较高的 F1 分数,但在前三年中却略低。可能的原因是前几年的安卓应用相对简单,规模较小。如表 2 所示,2011 年、2012 年和 2013 年安卓应用程序的平均规模低于后五年。一般来说,随着安卓应用程序规模的扩大,这些应用程序的复杂性也会相应增加,这可能会影响基于 API 调用序列方法的检测性能。与基于 API 调用序列的方法相比,我们的方法还结合了权限特征来检测恶意软件,因此在这几年取得了更好的检测性能。

总之,与基于单一特征的方法相比,我们结合权限和 API 调用序列的方法在检测恶意软件方面能取得更好的性能。

5.3 对问题 3 的调查

问题 3: 参数α如何影响我们方法的有效性?

        动机 在我们的方法中,我们分别采用权限信息和 API 调用序列信息来构建分类器。考虑到这两个分类器的输出有助于得出测试集中样本的预测结果,我们设计了一种线性策略来整合分类器的输出,通过设置参数 α 来确定最终结果。直观地说, α对我们的方法识别恶意软件的效果有重要影响。在本研究问答中,我们将进行实验来研究 α 对我们方法的影响,并寻求一个合适的 α值,以便在这些子数据集上取得良好的效果。

        方法 在本实验中,我们将 α 的值从 0 变为 1。同时,我们将步长设置为 0.1。我们选择两个子数据集进行实验,以确定 α 的最佳值,并在其他子数据集上展示我们的方法的结果,以分析所选参数值是否适用于其他子数据集。具体来说,我们选择所有年份的中间部分(即 2014 年和 2015 年)作为调整子数据集。由于 F1 分数是精确度和召回率之间的权衡,因此我们选择 F1 分数作为主要评估指标,以确定 α 的最佳值。

        结果 表 6 显示了我们的方法在不同 α 条件下的 F1 分数实验结果。在图 6 中,我们用两个子图来展示 훼 在 0 到 1 之间变化时的调整结果。如图 6a 所示,2014 年,当 훼 为 0 时,我们的方法取得了最低的 F1 分数。随着 훼 的增加,我们的方法获得的 F1 分数也在增加,当 훼 设为 0.6 时达到峰值。此后,我们的方法获得的 F1 分数保持相对稳定,略低于最大值。同样,在 2015 年,当α 等于 0.6 时,我们的方法也取得了最佳的 F1 分数。此外,在这两年中,当 훼 = 0.6 时,我们的方法在准确度方面也取得了最佳结果。因此,我们选择 0.6 作为훼的默认参数值,因为我们的方法可以在恶意软件检测中取得相对较好的性能。

        在其他年份,我们也进行了不同 α 的实验,以验证当 훼 设置为默认值 0.6 时,我们的方法是否能取得良好的性能。图 7 用六个子图展示了我们方法的实验结果。在这些子图中,我们的方法随着 훼 的变化呈现出基本相似的趋势。例如,如图 7f 所示,随着 훼 在 2018 年的持续增长,我们的方法在 F1 分数方面取得的结果从 79.76% 上升到 98.10%,然后又从 98.10% 略微下降到 97.55%。从表 6 中可以看出,当 훼 设置为 0.6 时,我们的方法在所有年份都能获得最大或近似最大的 F1 分数。

        总之,在不同的 α 条件下,我们的方法在精确度、召回率、F1 分数和准确度方面获得了不同的结果。当 α 设为 0.6 时,我们的方法可以获得最佳结果或近似最佳结果。因此,我们选择 0.6 作为 α 的默认值。

5.4 对问题 4 的调查

当训练集和测试集属于不同年份时,我们的方法性能如何?

动机 如上所述,我们采用十倍交叉验证来训练分类器。这样,训练集和测试集可能属于同一年。然而,在实际场景中,我们实际上需要通过历史样本来预测新到达样本的标签。在特征方面,训练集(历史样本)和测试集(新到达样本)之间一定存在差距。因此,我们的方法的有效性可能会受到影响。在本研究问题中,我们试图通过模拟真实场景来研究我们方法的有效性。

方法 在本实验中,为了模拟真实场景,我们利用上一年的样本来预测下一年样本的标签。如表 2 所示,数据集中每一年的详细信息都已显示。因此,我们可以直接使用去年的样本来构建分类器。例如,如果我们选择 2017 年的样本作为训练集,那么 2018 年的样本将成为测试集。在其他年份,我们重复这种方式来选择训练集和测试集。值得注意的是,由于没有 2010 年的样本,我们没有报告 2011 年样本的结果。同时,我们将我们的方法与基线方法的结果进行比较。

结果 表 7 列出了我们的方法和基线方法分别在精确度、召回率、F1 分数和准确度方面的实验结果。

        从表中可以看出,在大多数子数据集(即 2013、2014、2016 和 2018 年)上,我们的方法获得的 F1 分数都高于所有基线方法。这可能是由于每个训练集中的样本数量较少。具体来说,我们采用基于 CNN 的模型来实现基于 API 调用序列的分类器。由于基于 CNN 的模型通常需要大量样本进行训练,因此我们的方法在某些子数据集上表现不佳,如 2012 年。众所周知,在解决软件工程问题时,提高一个指标的结果可能会牺牲另一个指标。例如,在大多数子数据集上,MalDozer 的召回率最高,但精度却很低,尤其是在 2014 年,MalDozer 的召回率达到 100.00%,但精度却只有 72.75%。相反,从表中我们可以看到,我们的方法在大多数子数据集上实现了较高的精确度,但 1 3 我们的方法实现的召回率相对较低。不过,如前所述,α 会影响我们方法的最终结果,也就是说,在不同的 α 条件下,我们的方法在召回率方面会取得不同的结果。因此,如果我们采用一个合适的 α ,我们的方法可能会在召回率方面取得很好的结果。

        此外,我们还可以观察到,我们的方法、Malscan、MalDozer 和 Drebin 在所有子数据集上取得的 F1 分数都高于 62%,但 DroidAPIMiner 取得的 F1 分数在 42.38% 到 90.01% 之间变化。这表明我们的方法、Malscan、MalDozer 和 Drebin 比 DroidAPIMiner 更加稳定。可能的原因是,我们的方法、Malscan 和 MalDozer 利用 API 调用序列中包含的语义信息来检测恶意软件,而这些语义信息在不同年份可能会略有不同。虽然 Drebin 和 DroidAPIMiner 都使用权限和 API 调用特征来检测恶意软件,但它们忽略了 API 调用中序列信息的作用。

        总之,与基线方法相比,我们的方法在利用历史样本识别新到达样本方面具有相对较好的性能

5.5 对问题 5 的调查

识别恶意软件最重要的权限和 API 调用子序列是什么?

动机 在本研究中,我们使用权限和 API 调用序列特征来检测恶意软件,并进行实验来验证我们的方法在之前的 RQ 中的有效性。为了进一步理解和解释我们的方法的分类结果,在本 RQ 中,我们试图研究识别恶意软件最重要的权限和 API 调用子序列

方法 首先,我们合并所有子数据集,创建一个数据集,用于训练基于权限的分类器和基于 API 调用序列的分类器。然后,我们使用这些分类器分别获得最重要的权限和 API 调用子序列。具体来说,在基于权限的分类器中,特征向量的每个维度都对应一个权限。因此,我们使用 RF 分类器中每个权限的权重来表示该权限的重要性。对于基于 API 调用序列的分类器,我们尝试通过去卷积提取关键子序列。正如第 3.4.2 节中所述,我们的 CNI 可用于提取关键子序列。3.4.2 节中提到,我们的 CNN 模型应用卷积层和最大池化层从应用程序的 API 调用序列中提取特征,并根据这些特征对应用程序进行分类。在这些层中,可以对特征进行回溯,找到相应的子序列。同时,我们将该特征属于恶意软件类别的可能性视为子序列的重要性。最后,我们可以选出前 10 个重要权限和 API 调用子序列。

        结果表 8 列出了整个数据集中排名前十的重要权限和 API 调用子序列。值得注意的是,"THIRD_PART "权限指的是非官方权限,如自定义权限。

        该表显示,"READ_PHONE_STATE "是识别恶意软件最重要的权限。原因可能是恶意程序通常会请求 "READ_ PHONE_STATE "来访问手机信息,而手机信息是恶意程序的主要目标之一。此外,我们还可以发现,这些排名前十的权限大多与访问个人信息有关。例如,"GET_TASKS "允许应用程序获取当前或最近正在运行的任务信息,"ACCESS_COARSE_LOCATION "和 "ACCESS_FINE_LOCATION "分别允许应用程序获取大致和精确的位置信息。这表明许多恶意程序都试图访问和窃取这些个人信息,因此这些权限对分类结果的影响较大,需要开发人员多加注意。

6 对有效性的威胁

        本文结合 API 调用序列和权限特征,将 Android 应用程序分为恶意和良性两种。虽然实验结果表明,所提出的方法在解决这一问题方面具有良好的性能,但仍存在以下几个方面的局限性。

        外部有效性 外部有效性的主要威胁可能是应用程序接口版本之间的差异,因为在应用程序接口版本的迭代过程中,一些应用程序接口会发生变化。例如,一些应用程序接口可能会被修改、替换或删除,同时还会添加新的应用程序接口。在我们的方法中,我们采用 Word2Vec 技术来表示 API,每个 API 都可以转化为包含语义信息的向量。通过这种方法,一些功能相似的 API 在向量空间中可能彼此接近。此外,与所有 API 相比,变更 API 的数量相对较少。因此,这种偏差可以降到最低。

        内部效度 内部效度的潜在威胁可能是훼 的影响。如前所述,훼 会影响最终预测结果。由于我们的方法可能会在不同数据集上根据不同的 훼 参数值获得最佳结果。因此,这会对我们方法的可扩展性造成偏差。在我们的方法中,我们选择两个子数据集来确定最优 훼 ,并使用其余的子数据集来验证其有效性。实验结果表明,当 훼 设为 0.6 时,我们的方法可以获得最佳或近似最佳结果。因此,这种威胁可以被大大削弱。

7 相关工作

        现有研究提出了许多安卓恶意软件检测方法。总的来说,它们可分为静态、动态和混合方法。

        静态检测是直接分析源代码或反编译代码进行特征提取和恶意软件检测。例如,Arp 等人(2014)从反编译后的 dex 文件和 manifest 文件中提取了 8 个特征,然后采用 SVM 算法训练分类器来检测 Android 恶意软件。同样,Peiravian 等人(2013 年)利用 SVM、决策树(Quinlan,1986 年)和 Bagging(Burguera 等人,2011 年)等分类方法,结合每个应用程序的权限和 API 调用特征,训练分类器来检测恶意软件。此外,Alazab等人(2020)提出了一种分组策略,将API调用分为模糊组、风险组和破坏组,然后选择最有价值的API调用,以最大限度地识别安卓恶意应用程序。与上述研究不同,Wang 等人(2014)仅使用权限特征进行恶意软件检测。他们通过循环前向选择和主成分分析进行了深入研究。他们分析了不同权限的风险性,并选择了前 k 个权限作为检测恶意软件的特征。最近,一些研究人员结合其他领域的知识来检测安卓恶意软件。例如,Wu 等人(2019)结合社交网络的概念开发了一个安卓恶意软件检测系统(Malscan)。Malscan将API调用图转化为社交网络,然后通过基于社交网络的中心性分析作为语义特征,构建了基于SVM的分类器。

        尽管静态检测方法被广泛使用并证明了其有效性,但由于这些方法没有考虑到特征中包含的语义信息,因此准确率相对较低。为了解决这一难题,一些研究人员尝试设计动态方法,通过运行应用程序来捕捉运行时信息。例如,Han 等人(2014)通过在虚拟环境中运行程序来收集执行痕迹。从主要执行块中提取指令序列后,他们将指令序列转换为矩阵图像。然后,他们采用相似性计算来区分恶意程序和良性程序。此外,Karbab 等人(2016 年)开发了一种动态恶意软件检测系统,该系统基于对与现有已知恶意软件相关的恶意软件样本的动态分析生成摘要。同时,他们利用 NLP 解决了代码动态变化的问题。虽然动态方法可以捕捉运行时特征来帮助检测恶意软件,但它们通常存在一些不可避免的问题,如覆盖率低和计算成本高。

        此外,一些研究人员提出了混合检测算法,将静态检测和动态检测结合起来,综合发挥各自的优势。例如,Xu 等人(2016)利用动态分析记录系统调用序列作为动态特征,并结合一些静态特征。然后将这些特征用向量表示,并利用 SVM 算法训练分类器进行恶意软件检测。此外,Garg 等人(2019)也使用混合分析来检测恶意软件。他们分别使用静态和动态特征训练了多个分类器,并基于不同的集合技术实现了最终分类。

        最近,研究人员提出了一些基于神经网络的恶意软件检测方法。例如,MalDozer(Karbab等人,2018)基于API调用序列,通过Word2Vec将每个API调用转化为向量,并采用基于CNN的模型进行分类。此外,Vasan 等人(2020)尝试将原始恶意二进制代码直接转换为彩色图像,并训练了一个基于 CNN 的模型来区分恶意应用程序和良性应用程序。本文提出了一种结合 API 调用序列和权限特征的新型静态检测方法。但与现有研究不同的是,我们分别训练了基于 API 调用序列的分类器和基于权限的分类器,然后设计了一种线性策略来结合这两种分类器来区分恶意应用程序和良性应用程序。

8 结论和未来工作

        本文提出了一种基于权限和API调用序列特征的有效安卓恶意软件检测方法。具体来说,我们首先利用反编译工具提取权限特征和API调用序列特征。经过预处理后,我们采用两种方法分别将权限和 API 调用转化为向量。然后,我们应用 RF 和 CNN 分别学习基于权限的分类器和基于 API 调用序列的分类器。最后,我们线性结合这两个分类器的输出来预测新应用程序的标签。为了评估我们的方法,我们进行了实验,并将实验结果与四种基线方法进行了比较。实验结果表明,我们的方法可以有效地检测恶意软件,并优于基线方法。此外,当训练样本和测试样本属于不同年份时,我们的方法也能取得相对较好的检测性能。

        今后,我们将收集更多的数据集来评估我们方法的有效性和普适性,并尝试设计新的方法来改进分类结果。此外,本文研究的问题是二元分类问题,即我们只预测应用程序是否是恶意的。今后,我们将设计一个多分类模型,以检测恶意软件属于哪个恶意软件家族。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值