目录
摘要
函数调用图存在规模过大、无关信息过多等缺陷。为实现函数调用图的高效分析,对安卓恶意软件的恶意代码模式进行挖掘,提出一种基于图卷积神经网络(GCN
)的敏感 API
调用模式,并设计相应的函数调用图精简方法,以及敏感 API
权重评价方法,有效降低了函数调用图规模,实现对敏感
API
调用模式的挖掘。检测模型综合了安卓恶意软件操作码特征、敏感权限特征、敏感函数调用频度特征,构建了基于多特征融合的安卓恶意软件检测系统,进一步提升了检测精度。数据集测试验证了 API
调用模式特征以及集成检测模型的有效性。
一、引言
本文提出一种
基于函数调用图(FCG)的敏感 API
调用模式特征。
- 该方法首先提取待检测样本的 FCG,通过本文提出的图精简方法对其中的低敏感度 API 节点进行删减,以降低数据处理负荷;
- 基于图卷积神经网络(GCN)对精简后的函数调用图进行分析,提取特征,获取图中每个API 节点的嵌入表示。
本文主要贡献如下:
- 提出一种基于 GCN 的安卓恶意软件敏感 API 调用模式,使用图嵌入实现对恶意代码部分的函数调用结构信息挖掘;
- 提出图精简以及敏感 API 权重计算方法,有效降低检测系统的数据复杂度,提升了检测系统效率;
- 提出多元特征融合的安卓恶意软件检测模型,综合多种特征对安卓恶意软件进行判定,有效提升系统性能;
- 基于大量良性以及恶意安卓软件样本,对单个分类器、分类器联合、特征有效性等进行详尽的验证测试。
二、基础概念与相关工作
基于机器学习的安卓恶意软件检测方法,按照特征类型分为动态检测与静态检测。其中静态监测特征提取开销较小,但易混淆受干扰;动态检测特征提取开销较大。由 smali
中提取出的函数调用图特征属于静态特征的一种。
2.1 静态检测
静态检测主要对
APK
文件进行特征提取,在程序非运行状态下进行恶意程序的特征提取与匹配工作。常用的静态特征包括操作码序列、操作码频度、程序流图等。
2.2 动态检测
动态检测需针对指定的恶意软件样本构造模拟运行环境进行测试与记录。面对海量的恶意程序,该种检测方法开销较大,导致应用场景受限,但可对经过混淆的恶意软件进行特征提取。常用的动态特征包括 API 调用、流量、系统运行分析等。
2.3 图卷积神经网络及函数调用图
2.3.1 函数调用图
函数调用图是控制流图的一种,用于反映程序中各个函数之间的调用关系。函数调用图可表示为:
G
=
(
V,
E
)
- V 表示图中所有顶点的结合,在 APK 的函数调用图中,每个顶点对应一个 Android API;
- E 表示函数之间的调用关系。
- 通过 APK-Tool 或 Androguard 工具对 APK进行反编译后,可从 samli 代码(Android虚拟机的反汇编语言)中提取API 及调用关系,从而形成 APK 的函数调用图。
2.3.2 图卷积神经网络及图嵌入
GCN 可以对任意结构化的数据进行处理。FGG 可使用函数间的调用关系用拓扑图的形式对软件进行表征,而通过重打包获得的安卓恶意软件通常具有相同或相似的恶意代码结构,故可基于GCN 对恶意代码部分的调用模式进行挖掘与表征。
图嵌入可以使用低维向量,表示图中各个节点的邻居节点情况与相对位置信息。在 APK的函数调用图中,由于恶意代码执行逻辑相似,故对应的敏感 API
在图中有相近似的上下文调用关系。
三、基于敏感API调用模式的检测模型
本文检测模型主要使用敏感
API
调用模式特征作为主要特征,同时辅助 Opcode
频度信息、敏感权限特征以及API 调用频度特征作为辅助特征。将所有特征合并送入分类器中以实现高精度的安卓恶意软件检测。检测模型整体结构如图
所示。
3.1 API调用模式特征
调用模式特征提取过程如下图
所示。首先对
APK
进行解包,并从 samli
代码中提取调用关系,形成函数调用图,对函数调用图进行精简后,基于 DGL
计算每个节点的嵌入表示。
3.1.1 基于敏感API的函数调用图精简
敏感
API
列表来自
Rasthofe等
对于敏感
API
的分析工作,包含敏感
API
共
26322个。为在精简函数调用图的同时保留敏感 API
的原始调用结构,避免函数调用图精简过程中对有效数据造成破坏,本文提出一种半保留式精简方法。精简算法的 API
节点删减规则为:
- 若某一节点为非敏感 API 节点,且其邻居节点中不含敏感 API节点,则对该节点进行删除;
- 若某一函数节点为非敏感 API 节点,其邻居节点中含有敏感API,则保留该节点。
以图
3
所示函数调用图为例,深色节点为敏感
API
节点,浅色节点代表一般 API
函数。左侧图形为原始函数调用图,按照上述函数调用图精简规则:由于 4
号节点是非敏感 API
节点,且其邻居节点中不含有敏感
API
节点,故在精简过程中 4
号节点及其相邻的边都被删除。精简后的示例函数调用图如图 3
右侧所示。
3.1.2 基于GCN的敏感API图嵌入
图形嵌入算法可作为降维算法的一种,将复杂高维空间中的图结构映射到低维空间中。
图5
中,n0
~ n
4
表示函数调用图中
5
个
API
节点,每个API 节点对应其状态向量
h
0
~ h4
(
状态向量即
API
节点在函数调用图中的嵌入表示)。在嵌入计算过程中,对各节点的状态向量 h
进行随机初始化,以获取
n
0
节点的新的嵌入表示
为例,f 为非线性变换函数,计算方法如下:
图卷积神经网络中
API
嵌入表示过程就是信息在节点之间不断传播聚合再传播的过程。
- 每个节点的嵌入表示均会获取邻居节点信息并进行更新;
- 在下轮迭代中,携带了远端节点信息的嵌入表示会不断随着节点之间的连接进行传播。
以图 5
为例,n0节点为敏感
API
节点,在迭代更新过程中该节点的嵌入表示将会携带其邻居节点信息,即敏感 API
在函数调用图中的嵌入表示将会携带一定的调用关系信息。
3.1.3 敏感API嵌入权重分配
由于所有
APK
样本中所包含的敏感
API
种类及数目不同,本检测系统基于 TF-IDF
方法对
API
函数的敏感程度进行衡量,并在测试中分别选取前 10
、
15
、
20
、
25
、
30
、
35 个敏感 API
函数的嵌入表示作为
API
调用模式特征,以确定最优的 API
数量。将特征送入分类器进行训练,以达成恶意软件检测目的。通过计算,敏感程度排名前 30
的
API如表 1
所示。
3.2 辅助判定特征
- Opcode 频度特征。首先对 APK 进行反汇编,并从所有 smali 文件中提取对应种类 opcode 数量。本方法以词袋模型为基础,共统计了 256 类 opcode 数量并将其表示为
的特征向量。
- 敏感权限特征。本方法基于 AndroidManifest.xml 文件提取 APK 安装时申请的权限列表作为特征,其中纳入统计范围的共 120 个权限项目,将其表示为长度为120 的特征向量:
。表示方法采用 one-hot 形式,当该 APK 申请了对应权限时,P 取值为 1,无对应权限申请时,取值为 0。
- API 调用频度特征。本检测系统在 API 频度特征提取中,仅对部分敏感 API 进行频度统计,敏感 API 项基于 TF-IDF 计算得出权重排名的前200 项。基于 Androguard 对 APK 进行解包后获取 samli 文件,统计相应敏感 API 项目的调用次数,并将其归一化为频度特征。
3.3 特征及分类器结构
本检测方法对
4
种恶意软件特征进行合并,形成调整矩阵,并使用基于 CNN
的分类模型对
APK
特征数据进行学习训练,最终获得恶意软件检测模型。
敏感 API 项由 TF-IDF
计算权重排名得出,并选取前n 项敏感
API
的嵌入表示作为特征数据来源,每个
API
调用模式特征由 10
维向量表示,对每个待检测样本,特征可被表示为
的特征矩阵。
API
频度特征、操作码频度特征、敏感权限频度 3
种辅助特征,经过
PCA
降维后附于 API
调用模式特征矩阵之后。
分类模型如图
7
所示。
四、实验测试与结果分析
首先基于可视化方法对 API 调用模式特征之间的区分度进行实验观察,随后使用上文提出的特征提取方法以及检测模型进行检测器训练与测试。
4.1 评价标准
准确率
Precision
、召回率
Recall
、
F-score 三个参数。
4.2 数据集及相关环境
- 多特征融合检测模型的运行及测试环境为 CPU Intel (R)E5,16GB 内存,GPU 为 GTX1080,120GB SSD + 4TB HDD,基于 Ubuntu16.04 操作系统。
- 实验数据集中恶意 APK 应用来自于 VirusShare 病毒数据库以及 Drebin 安卓恶意软件检测数据集,良性样本由小米应用商城爬取并经过 VirusTotal 检测,保证良性样本数据集不包含其它 类型样本。
- 良性样本共计 4780 个,恶意样本共计 5600 个,样本总量为 10380。将其按照 9∶1 的比例随机划分为训练集和测试集。
4.3 测试方法
4.4 API调用模式特征有效性分析
4.4.1 敏感API调用模式特征可视化分析
为验证 API
调用模式特征的有效性,本文首先对
TF-IDF 计算得出权重较高的部分
API 调用模式进行可视化,
在三维空间中对良性
/
恶意样本的同一
API
调用模式进行
观察,可视化结果如图
8
所示。
图
8
中蓝色样本点代表良性样本
API
调用模式特征在三维空间中的映射,红色点代表恶意样本对应 API
的调用模式,每个子图均对应一种敏感 API
项。
API
调用模式特征在三维空间中的映射分布,可清晰体现出良性与恶意样本之间对同一敏感 API
存在不同的调用模式,且同一类别 APK
的
API
调用模式之间存在相似性。
但由于同一 API
可能存在多个调用模式,故可能出现如图 8
“
setvalue
()”
API
项特征对应的
API
调用模式分布:蓝色色块分多个区域聚集,说明对于该敏感 API
项,其在良性样本中存在多种调用模式。故在可视化后,在三维空间中存在分区域聚集特性。
4.4.2 基于敏感API调用模式特征的恶意软件检测
测试结果显示,基于敏感
API
调用模式特征的安卓恶意软件检测子模型,可有效对良性/
恶意软件进行区分,最佳检测精度可达到 97.6%
。随着采取敏感
API
数目的不断增长,其检测精度及其它性能均随之提升。采取的敏感API 数目在
30~35
时,检测模型性能有所下降(?)。经分析,检测模型性能下降是由于过多的 API
项目引入了过多无关API 调用模式特征,且对应
API
项在良性
/
恶意
APK
中存在相同或相似的调用模式,给检测模型带来了过多的无关信息,从而对检测模型性能产生了负面影响。
实验结果显示,基于敏感
API
调用模式特征的安卓恶意软件检测模型,最佳 API
数目应在30 项左右,且种类应与表 1
中所列项目相同或相似。
4.5 综合辅助特征的检测测试
为进一步提升检测器性能,本文综合了操作码频度、敏感权限频度、敏感API 调用频度
3
种辅助特征,并将其添加至特征矩阵中。对检测模型进行测试,测试结果如表 3
所示。
为客观评估本文提出的多特征集成检测模型,本文在相同数据集上对其它安卓恶意软件检测工作进行复现,以对比性能差异。
五、结语
- 本文提出了一种新型敏感 API 调用模式特征,该特征基于 GCN 对函数调用图进行 API 节点的嵌入计算,实现对 API 节点在函数调用图中的调用模式表征;针对函数调用图规模较大的问题,提出一种半保留式的函数调用图精简方法,有效降低了对函数调用图进行分析时的数据复杂度;基于卷积神经网络搭建了对应的子分类器,有效实现了安卓恶意软件检测。
- 分析与实验测试结果显示,敏感API 调用模式特征可有效对 APK 中的函数调用模式进行表征,在采用权重排序前 30 的敏感 API 项的调用模式作为特征时,可获得 97.6%的检测精度,相较于其它频度特征可携带更多有效信息,实现高效的安卓恶意软件检测。
- 本检测模型联合了 Opcode 频度特征、API 频度特征、 敏感权限特征,将所有特征集成至同一特征矩阵中,进一 步提升了检测模型性能,检测精度达到 99%。与同类工作进行比较,本文拥有更优的检测性能,验证了基于多种特征融合的安卓恶意软件检测模型的有效性。
- 未来可对本检测模型中的敏感 API 检测机制进行升级,进一步细化 API 的挑选机制,从而减少待分析的 API 数目,达到提升检测效率的目的。