CallN:基于卷积神经网络的Android恶意软件家族分类技术
2021-07-02刘易叶凯
刘易,叶凯
(1.四川大学网络空间安全学院,成都610065;2.棕北中学,成都610041)
0 引言
随着Android手机用户大幅增长,移动终端出现大量Android恶意软件。根据2019年Android恶意软件专题报告显示,360安全中心全年截获移动端新增恶意样本为180.9万个,平均每天截获恶意程序样本0.5万个[1]。Android恶意软件通常采用消耗手机资费、窃取手机隐私、远程控制手机等攻击行为,这使得移动智能终端安全受到严重威胁。现有Android恶意软件检测方法能有效识别已知样本,但不能有效检测改造升级后的新版本Android恶意软件,也不利于对新型恶意软件进行溯源。
当前Android恶意软件特征提取技术主要为动态分析和静态分析,通过获取Android应用程序权限、API以及字节码等信息作为特征。William等人[2]提出污点分析系统TaintDroid,用于检测Android应用中敏感数据泄露。通过修改Android虚拟机解释器,TaintDroid实现系统级别污点追踪,发现大量应用存在地理位置、设备ID、电话号码等数据的泄露。Chen等人[3]监控运行状态下API调用,结合半监督机器学习,准确识别恶意软件。动态分析技术能够应对混淆、加壳等问题;需要的特征体量相对较少,无需频繁更新特征。但是动态分析需要在监控下进行真机的运行[4],耗时、占用过多系统资源特性难以应对大量恶意软件识别。静态分析通过逆向工程分析Android应用信息,这种方式不需要在真机实时运行,能够快速分析大量应用软件。Schmidt等人[5]基于Opcode对恶意样本进行分类,与此类似的有Zhou等人[6]提出了DroidMoss,将Android应用软件的DEX文件反编译为Dalvik字节码,并通过Opcode来计算应用软件的模散列值,结合应用软件的作者信息作为应用软件的“指纹”判定Android应用是否被重打包,以此判定Android应用的恶意性。此类方法能够较为精准地判定Android恶意样本。Fan[7]、Zhang[8]、Yang[9]等人通过频繁调用子图来关联恶意An⁃droid应用。
Suarez-Tangil等人[10]提出基于文本挖掘方法,计算代码结构相似性进行分类。Massarelli等人[11],基于Drebin数据集,采用动态分析、SVM对恶意软件进行家族分类,准确率达到82%。Kim等人[12],基于BitDe⁃fender标记的8个家族中682个样本,采用动态分析和静态分析进行特征提取,通过计算相似性对恶意代码进行聚类,准确率达到97%。Fan等人[13],从功能调用图中提取频繁调用子图,通过计算子图相似性实现恶意软件分类,准确率达到94.2%。Fasano等人[14]基于静态分析,对12个恶意软件家族进行家族分类,平均准确率达到96.1%。Canfora等人[15],分析在编译源代码时生成的Java字节码,并识别每个恶意软件家族的恶意行为,准确率达到97%。Chakraborty等人[16],提出一种既能对样本数量规模大和样本数量规模小的家族进行分类,有效实现分类和聚类。虽然现有的方法在家族分类上取得很好的效果,但是在特征提取的粒度还有待提高,以取得良好的兼容性和可用性。为解决这些问题,本文提出基于拓扑排序的数据预处理过程,使得API调用具有节点依赖的特性,并结合CNN深度学习框架进行分类的方法。
本文采用Androguard分析Android应用,得到API调用图,基于创建的API数据集对API调用图进行剪枝与标记;再将调用图转换为RGB三通道图像;采用本文提出的CallN作为卷积神经网络分类器原型框架;最后根据实际传入图像特征以及分类的需求,对深度卷积神经网络进行微调,以此实现对Android恶意软件分类。将Android应用转换而成的RGB图像与API调用序列的拓扑排序成对应关系。随机提取的特征是一组满足调用顺序的特征序列,使得特征同时满足随机性和有效性。分类器与样本集是相互独立的,这样有效避免分类方法只针对某些样本集有效的情况。
本文的主要工作和贡献如下:
(1)本文提出一种基于API调用图的特征选择方法,基于拓扑排序优化了恶意软件的行为特征提取的随机性、有效性。
(2)基于Res2Net残差连接思想,结合Android恶意软件特征图规模小的特性,本文提出CallN模型以更细粒度提取恶意软件的特征,能有效提高恶意家族分类的准确率。
(3)实现原型系统,在Drebin数据集上对本文提出的模型进行验证,达到99.93%分类准确率,能够有效对Android恶意家族进行准确分类。
1 算法实现
1.1 概述
本文提出的方法主要分为Android恶意软件特征图转换、卷积神经网络两部分。Android恶意软件特征图转换过程包括API数据集构建、静态特征分析、对API调用图进行处理并转换为RGB图像。卷积神经网络部分输入Android恶意软件转换而成的RGB图像,该图像是长为M宽为N的三通道图像。由于CNN卷积神经网络要求输入图像的尺度相同,输入神经网络之前需要对不同大小的图像进行插值式采样转化成一样大小的图像。利用输入图像训练分类模型,网络输出是对各个Android恶意软件类的家族类别的预测。技术架构如图1所示。
图1分类技术架构
图1 表示本文提出的方法技术架构。Android恶意软件特征图转换:将恶意软件进行解压获得Dex文件;利用Androguard分析恶意软件得到API调用图;利用API数据集对API调用图进行剪枝、标记得到用数字标记的API调用图;对标记API调用图进行拓扑排序得到一个由数字组成的队列;将数字队列转换为矩阵从而转换为RGB图像。卷积神经网络:通过转换的图片作为输入,通过卷积计算、提取特征、训练分类器,利用分类器对图像信息进行预测。
1.2 Android恶意软件特征图转换
Android应用程序由资源文件、配置文件、签名文件等所有内容组成的APK文件。因此DEX文件代表一个Android应用的软件的主要特征。本文将DEX文件作为分析对象,利用Androguard分析恶意软件得到API调用图。Android程序软件的API调用图能够表现出程序的主要特征,将API调用图转换为一个图像,可以追踪应用软件的特征。
本文建立一个API数据集,基于此数据集对调用图进行剪枝并且标记。API数据集规则:基于安卓开发者网站官方提供的API1-API29的所有API数据,作为官方提供的API,设置为激活状态;非官方提供的API设置为休眠状态即不使用该API,当处于休眠状态的API在不同的恶意软件中出现,将该API由休眠状态改为激活状态。转换过程如图2所示。
图2 APK转换过程
在图2中,表示一个完整的APK转换为RGB图像的过程,通过静态分析获取调用图,利用API数据集中已标记好的API将API序列转换为一个由数字组成的向量,并且根据API数据集中提供的激活状态API数据进行剪枝。得到的特征序列进行拓扑排序并输出一个数值向量,将向量中每一个数字转换为24位的2进制的数据,得到的2进制向量重构为(n,m,3)的矩阵。选择二维矩阵的宽度和高度(即图像的空间分辨率)主要取决于API序列的长度。矩阵宽度和高度转化过程如表1所示。
表1 矩阵转换规则
图3中表示剪枝过程,基于API数据集将API调用图中处于休眠状态的API删除,将休眠状态的API删除生成新的依赖连接。图3表示删除节点的流程,API B处于休眠状态的API,因此将B删除,使A指向C、D。
图3 API序列剪枝
API调用图是一个有向图,保存的形式为点(Node)、边(Edge)。因此API调用图的剪枝过程就是对点和边进行操作。
剪枝算法的伪代码描述如算法1。
算法1:剪枝算法
1.3 卷积神经网络模型
本文采用卷积神经网络对Android恶意软件进行分析,基于Res2Net[17]残差连接思想对恶意软件进行特征提取。Res2Net用3×3过滤器组,将不同的过滤器组以层级残差式风格连接,可以得到不同数量以及不同感受野大小的输出。例如y2得到3×3的感受野,那么y3就得到5×5的感受野,y4同样会得到更大尺寸如7×7的感受野。最后将这四个输出进行融合并经过一个1×1的卷积。这种先拆分后融合的策略能够使卷积可以更高效更细粒度的处理特征。
基于Res2Net能够高效提取细粒度的特征,同时Android恶意软件的特征图的规格小于普通图像,对Res2Net进行改进。本文实现Res2Net模型以及对Res2Net进行改进,将改进的部分模型命名为CallN,CallN将3×3过滤器改为2×2与3×3的交叉过滤器组提取特征。
CallN输入是由Android恶意软件转换而成的图像,长度和宽度设定为固定大小的图像,采用填充的方法对输入图像的尺寸进行处理。图5为本文提出模型CallN,首先输入t张特征图,对图像进行1×1卷积分为{Xi|0
图5 CallN模型
当一组过滤器对一组特征图提取特征之后,自上一组特征图提取的特征传递到下一组特征图中与下一组的特征图进行特征提取,直至最后一组。得到特征{yi|0
图4 Res2Net模型
2 实验评估
为验证本文提出的恶意软件分类方法是否能够有效检测恶意软件家族。本文基于Drebin[18]数据集,选择Drebin数据集中家族规模前20的恶意软件家族进行分类实验,卷积神经网络部分采用本文提出的CallN模型以及Res2Net模型。
2.1 实验数据集及实验环境
Drebin作为Android恶意软件家族分类模型的样本集,Drebin数据集包含来自179个Android恶意软件家族的5560个样本。实验选择家族规模前20的恶意软件家族共计4728个恶意软件,训练集、验证集和测试集的比例为8:1:1。
本次实验是在64位Windows10环境下进行,实验配置如表2所示。
表2 实验环境
2.2 实验结果与分析
在图5中表示基于CallN模型对20个家族分类训练结果,在图5(a)表示训练分类准确率,以及验证分类准确率,其中红色曲线为训练集准确率,蓝色曲线为验证集准确率。图5(b)表示训练集损失值和验证集损失值。在图5(a)第一时期(epoch)训练集准确率为68.81%,验证集准确率为69.35%。在前150时期中,batch_size设置过低导致训练结果呈现轻微震荡,在本实验中设置batch_size为8。随着训练时期的增加,随后的训练中曲线较为平滑并且呈收敛趋势。根据图6的数据表明,随着训练时期增加,准确率呈上升趋势,损失呈减少趋势。通过300时期的训练,分类模型的训练准确率达到99.99%,验证准确率达到99.93%。
图6 20个恶意家族分类实验结果
为验证CallN的有效性,本文采用预先划分并且未参与训练的457个恶意软件对建立的模型进行交叉验证。图7为分类结果的混淆矩阵,预测结果表明所有的家族样本能够被准确分类。
图7 分类结果热力图
在表3中计算20个恶意家族的精确率、召回率、F1-score。其中能够对18个恶意家族进行准确分类,FakeRun中一个恶意软件被分为GinMaster。
表3 20个恶意家族分类结果
在与已有相关工作对比过程中,本文采用Drebin中20个恶意家族的恶意样本进行分类实验,与Drebin方法以及Jiang Jianguo等人的研究进行对比。如表4所示。
表4 其他工作对比
结果表明,本文提出的CallN对恶意家族的分类准确率是优于现有的方法,达到99.93%。对比Res2Net结合本文的数据预处理方法的分类效果,CallN针对Android恶意软件特征图的分类效果更为理想。
3 结语
本文提出一种基于卷积神经网络(CNN)的An⁃droid恶意软件检测与分类的方法。首先将Android恶意软件样本转换成RGB图像,然后训练一个分类模型对RGB图像进行分类,以此实现对Android恶意软件的分类。本文在Drebin样本集上进行分类,在20个恶意家族进行分类实验,取得99.93%的分类准确率。后续会寻找更多的数据集进行测试,取得更多的实验数据,提升本方法的实用性。