[论文翻译]SFCGDroid:基于敏感函数调用图的 android恶意软件检测

摘要:

        安卓系统因其开源的特性,目前已成为全球最流行的操作系统之一,因此黑客制作恶意软件的门槛也越来越低,越来越多的恶意软件开始威胁人们的生活。图用来表示程序的语法和语义结构,可以自然地表示恶意行为,因此我们提出了一种名为SFCGDroid的恶意软件检测方法,它基于敏感函数调用图。首先,我们对安卓应用程序进行反编译,生成函数调用图(FCG),并在FCG上提取敏感函数调用图(SFCG)。其次,我们提取两类特征:(1)使用 Skip-gram 模型获得函数嵌入;(2)将 SFCG 视为社交网络,提取敏感 API 的三元组属性。这两类特征结合起来作为 SFCG 的特征表示,并输入图卷积网络(GCN)进行恶意软件检测。在对 26939 个安卓软件数据集的实验中,本文中的 SFCGDroid 可以达到 98.22% 的准确率和 98.20% 的 F1 分数

3 方法

        SFCGDroid 的整体结构如图 1 所示。APK 经过反编译后提取 FCG,再从 FCG 中提取 SFCG,然后将函数语义特征与敏感的API 三元组表示特征相结合,发送给 GCN 进行检测。

3.1 SFCG 提取

        SFCG 的要求是从 APK 文件中提取 FCG。我们使用 apktool [29] 和 androguard [30] 工具进行反编译以获得 FCG。我们根据 FCG 提取 SFCG,提取过程如算法 1 所示。

        我们需要输入 APK 文件、敏感 API 列表和订单号。敏感 API 列表来自 [7](Gong, L., Li, Z., Qian, F., Zhang, Z., Chen, Q.A., Qian, Z., Liu, Y.:
Experiences oflanding machine learning ontomarket-scale mobile
malware detection. In: Proceedings of the Fifteenth European Con-
ference on Computer Systems, pp. 1–14 (2020))。敏感 API 是指某些 API 可以执行敏感操作,如读取短信、读写文件等,而且敏感 API 与恶意软件关联度很高。目前,Android SDK 提供了 50,000 多个 API,其中执行敏感操作的敏感 API 有 426 个,而敏感 API 只占其中很小一部分。阶次参数表示敏感 API 节点到达其他节点的距离,需要将 FCG 转换为无向图。

在算法 1 中,第 2 行中的函数 getFCG() 获取 APK 文件的 FCG,第 3 行中的函数 toUndirected() 获取 FCG 的无向图 UnFCG,第 4 行中的函数 getSAPIsOfFCG() 获取 FCG 的敏感 API。第 5 行中的 Si 表示敏感 API 列表中的每个敏感 API,第 6 行中的函数 getNeiOrder() 是为了获取无向图 UnFCG 中与敏感 API 节点距离小于或等于阶参数值的一些节点,因此集合 N 中既有敏感 API 节点,也有非敏感 API 节点。第 8-15 行查找集合 N 中的节点之间是否存在边连接,然后在 FCG 中获取这些节点之间的边,从而构建 SFCG。由于 SFCG 中的节点和边都来自 FCG,因此 SFCG 是 FCG 的诱导子图。最后,根据找到的节点和边构建 SFCG。(有个问题,这个产生的子图的节点之间都会有边连接吗,有没有连接上的吗)

3.2 功能语义特征

        在获得 SFCG 之后,我们还需要获得函数语义特征。独热编码是一种简单的方案,但它无法捕捉到函数语义之间的关联,而且会产生很大的稀疏维度。本文采用 Mikolov 等人提出的 Skip-gram 模型[31,32],该模型基于语义相似的词也具有相似的上下文语义这一假设。训练完成后,每个词都可以得到一个低维向量,它是词在语义空间中的映射,能够表达词的语义之间的关联。

        由于 SFCG 是基于敏感 API 节点构建的,因此 SFCG 中包含与敏感 API 节点相关联的敏感 API 节点和非敏感 API 节点,受 Skip-gram 模型的启发,我们将敏感 API 节点视为中心词,将通过敏感 API 节点获得的其他节点视为上下文词。最终,我们将 SFCG 中的所有节点都视为词,并在使用 Skip-gram 模型进行训练后获得每个节点的语义属性 E f。

        图 2 显示了利用 Skip-gram 模型训练提取函数语义特征的架构。首先,收集 SFCG 中的所有函数以构建语料库,然后将语料库中的每个函数视为一个词,并使用 Skip-gram 模型训练将函数转换为 N 维向量。在训练过程中,每个函数都以单次编码形式编码为 V 维向量,V 代表语料库的大小。所有输入共享权重W_{ V*N},N 是隐藏层的维度大小,也是训练完成后获得的每个函数向量的维度大小。对于一系列函数 f1、f2、......、fT,跳格模型的训练目标是最大化预测目标词的上下文词的概率。

        跳格模型使用对数函数,以防止梯度爆炸并提高计算效率,2d + 1 指的是滑动窗口大小。 定义为

 e_{f0}e_{f1}是 fO 和 fI 的向量表示,exp 函数称为指数函数。P(f_{t+j}|f_{t})是由 softmax 函数定义的,计算成本非常高,因为\Sigma _{i=1}^{V}exp(e_{i}^{T}e_{fI}) 需要对整个语料库求和,所以我们使用负采样技术[31]来简化和加快训练。

3.3 敏感 API 的三元组特征

        我们可以将 SFCG 作为一个社会网络来分析,而社会网络的一个重要特征就是三元组 [33]。三元组指的是社交网络中三个节点之间的关系,共有 16 种不同的结构。(在DAPASA中也用到了motif)。恶意 Android 应用程序依靠敏感 API 实现攻击,而敏感 API 的三元组结构会产生不同的分布。基于这一假设,我们从 Androzoo[34]中随机选取了 500 个良性应用程序和 500 个恶意应用程序来提取 SFCG,并将 SFCG 的 "order "参数设置为 2,因为我们只探索节点间有边缘连接的情况。

        我们选择了四种类型的三元组,如表 1 所示。SFCG中有敏感API节点和非敏感API节点。如果三元组中至少有一个敏感API节点,则认为该三元组是敏感API三元组;如果三元组中没有敏感API节点,则认为该三元组是正常三元组,我们计算敏感API三元组在同类型三元组中的比例。如图 3 所示,四类敏感 API 三元组的分布在良性应用和恶意应用之间存在显著差异。其中,021D 和 021C 正式恶意应用程序的比例多于良性应用程序,而 111U 和 030T 良性应用程序的比例多于恶意应用程序。图 3 显示,敏感 API 三元组特征可以捕捉图结构所隐含的部分信息。

        对于 SFCG 中的每个节点,我们用 T_{f}^{\tau }表示每个节点的 4 种三元组比率,T_{f}^{\tau }的计算公式为 3

        其中,τ 表示四种三元组类型 {021D、021C、111U、030T},δ(SG,τ) 表示敏感函数调用图 SG 中类型为 τ 的三元组之和,φ( f,τ, SG) 表示敏感函数调用图 SG 中敏感 API f 的三元组 τ 的数量。

        每个节点的三元组特征由公式 4 得出,最后将语义特征 E f 和三元组特征 Tf 连接起来,就得到了 SFCG 的每个节点特征。

3.4 GCN

        在提取出 SFCG 和 SFCG 中每个节点的特征后,我们需要为分类模型提供训练。我们的分类模型受到了 [35,36] 的启发。如图 4 所示,一层 GCN 和一层图池被视为一个区块,模型存在两个相同的区块,每个区块的输出通过读出层求和最后进入 MLP 进行分类。对于 GCN 的输入,首先需要邻接矩阵 A 作为 SFCG 结构的表示,然后是由所有节点的特征向量组成的特征矩阵 X。

        其中\hat{A} = A + I,I 是单位矩阵,\hat{A} 是添加自连接的邻接矩阵的表示,σ 是激活函数,我们使用 ReLu 作为激活函数。基于频谱域[37],多层图卷积层如下所示

        \hat{D} 是第 l 层的度矩阵,Wl 是第 l 层的训练权重矩阵。分类模型中的池化层我们使用了 SAGPool [35],这是一种自我关注机制,它更关注更重要的信息,并将应删除的节点分离出来。SAGPool 层如图 5 所示。自我关注分数的计算方法如下

        θatt 是 SAGPool 的唯一参数。池化比率 k∈ (0, 1) 是一个超参数,用于决定保留多少节点。根据 Z 的值选择前 kN 个节点。

top-rank 是排序后的前 kN 个值的索引。X 是掩码后的特征,与 Zmask 相乘得到池化特征矩阵,Aout 是特征矩阵对应的邻接矩阵。

最后,通过读出层,读出层汇总节点特征,生成固定大小的表示。读出层的定义如公式 11 所示。

 其中,N 是汇集后的节点数,xi 是节点的特征向量。最后,通过两个全连接层获得分类结果。

4 实验

4.1 实验步骤

        实现 SFCGDroid 所使用的硬件设备和软件包如表 2 所示。

4.1.1 数据集

        我们收集了 26,939 个应用程序,包括 13,463 个良性样本和 13,476 个恶意样本。良性样本来自 Androzoo [34],每个样本都经过 VirusTotal [41]扫描,如果所有反病毒引擎都通过扫描,则视为良性样本;恶意样本来自 CICMalDroid2020 [42] 和 VirusShare [43]。上述所有样本均可成功反编译,更多详细信息见表 3

 4.1.2 衡量标准

        为了评估 SFCFDroid 的有效性,我们使用了五倍交叉验证方法将数据集随机分为5个相同数量的子集,其中四个用于模型训练,其余一个用于验证模型,并循环训练五次。为了量化分类器的性能,我们使用了以下指标:准确率(ACC)、精确率(P)、召回率(R)和 F1 分数

4.2 SFCG order

        为了证明 SFCG 的有效性,我们需要调整生成 SFCG 的超参数顺序,不同的超参数会生成不同大小的 SFCG。我们将阶数设置为 1、2 和 3,选择阶数参数 1、2 和 3 有两个原因:一方面,这是敏感 API 三元组特征的限制,三元组中节点之间的最大距离为 2;另一方面,我们没有将阶数设置为 4,因为有限的内存不允许进行训练。对于特征,我们使用 gensim 的默认设置,窗口大小为 5,向量维数为 100。表 4 列出了不同阶数下的最终实验结果。

        如表 4 所示,不同阶次的最差结果也达到了 97.79% 的准确率和 97.77% 的 F1 分数,这表明在减少 FCG 生成 SFCG 的过程中仍然可以期待良好的性能。证明恶意软件通过调用本地敏感 API 来执行恶意行为,我们在将阶数设置为 2 时获得了最佳性能,证明恶意软件的行为信息在敏感 API 的 2 阶邻域中得到了最佳体现。

4.3 向量维度

        在实验过程中,我们发现不同的向量维度会影响最终的分类结果。为了达到最佳的分类效果,我们将特征中的词向量维度设置为 50 到 100 之间。实验结果如图 6 所示,证明了函数词向量语义的有效性,最差的 Acc 达到了 97.67%。而且我们可以观察到,向量维度在 60 时性能最好,Acc 达到 98.04%,F1 达到 97.99%。

4.4 不同特征的比较

        我们比较了两种特征以及两种特征组合的效果。对于功能语义特征,我们选择 60 作为功能语义特征的维度大小。如表 5 所示,两种特征的组合被证明能有效提高模型检测性能,这可能是由于敏感的 API 三元组特征能够补充图结构中的功能语义。

        此外,根据图 7,两种特征的组合具有较高的 TPR 和较低的 FPR,AUC 为 0.999。因为 Skip-gram 模型可以捕捉节点的功能语义信息,而三元组可以捕捉敏感 API 的图形结构信息,将这两种特征结合起来具有很好的性能。

        最后,我们还对 ML/DLclassifier 的不同特征进行了比较,我们选择了permission、意图和 API 三种特征。许可来自 [44],意图来自 AndroDialysis [12],API 来自 Pscout [45]。我们的特征指的是图节点的特征,而不是样本或整个图的特征,因此 SFCGDroid 提出的特征不能用于其他分类器。表 6 显示,我们使用的方法具有更好的性能。

4.5 不同方法的比较

        我们在同一数据集上与其他一些最先进的方法进行了比较,并选择了六种具有代表性的恶意检测方法,即 Drebin [46]、DeepMalDet [47]、MalDetGCN [48]、MalScan [49] 和 NATICUSdroid [50]。如表 7 所示,之所以选择这些方法,是因为这些项目都是开源的或有详细记录的。这些方法的区别在于使用了不同的特征集。Drebin 从 AndroidManifest.xml 中收集关键信息作为特征,DeepMalDet 使用操作码序列作为特征,MalDetGCN 选择操作码集和 API 包作为特征,NATICUSdroid 使用本地权限和自定义权限作为特征,MalScan 使用社交网络中心性作为特征,与我这里的工作最相似的是 MalDetGCN,但 MalDetGCN 特征不包括语义信息。

        表 8 显示了六种方法的检测结果,SFCGDroid 的准确率高于 98.22%,F1 分数高达 98.20%。在六种方法中,SFCGDroid 的召回率最高,但也牺牲了一些精确度。SFCGDroid 很少产生假阴性,因为恶意软件检测的目的就是尽可能多地检测出恶意软件,防止其进入应用市场。

5 结论和未来工作

        本文提出了SFCGDroid,利用基于SFCG的GCN检测安卓恶意软件,提取函数语义和敏感API三元组特征。通过识别敏感API并提取基于FCG的SFCG,Skip-gram获取图中每个节点的语义信息,并将SFCG视为社交网络,从而获得敏感API三元组的比例。我们使用直接在图上运行的 GCN 模型来学习每个节点的特征,最终将恶意软件分类任务转化为图分类任务。

        实验表明,我们的方法达到了 98.22%,优于其他最先进的检测方法。然而,我们的方法依赖于敏感 API 的选择,而敏感 API 会受到不同 Android 版本的影响,从而影响最终的检测结果;生成 SFCG 会受到第三方库的影响,一些恶意第三方库是恶意软件的源头。因此,在今后的研究中,我们将优化生成 SFCG 的方法,并探索第三方库对 Android 软件的影响。考虑使用一些新特征来表示节点中蕴含的信息,如使用权限来改进我们的方法,以达到更好的检测效果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值