APP下载

基于动态分析与深度学习的恶意程序检测方法

2021-06-16刘金鑫黄玮范文庆巩微董航

电子技术与软件工程 2021年4期
关键词:沙箱调用准确率

刘金鑫 黄玮 范文庆 巩微 董航

(1.中国传媒大学计算机与网络空间安全学院 北京市 100024)

(2.中国移动通信集团公司信息安全管理与运行中心 北京市 100053)

1 引言

根据国家互联网应急中心(CNCERT)发布的《2019年我国互联网网络安全态势综述》显示,2019年全国发现恶意程序的数目超过6200 万个,单日平均传播次数高达 824 万余次,涉及 66 个恶意程序家族,致使我国约 582 万台主机遭受感染。恶意程序的不断传播严重威胁着我国的网络空间安全,因此如何高效准确检测恶意程序是一项亟待解决的问题。

恶意程序的检测方法可以分为静态检测方法和动态检测方法,静态检测方法是指在不运行恶意程序的情况下直接分析恶意程序,通常使用的静态特征包括字符串特征、函数特征和字节码特征[1]等,但是静态检测方法在面对采用混淆技术的恶意程序时,检测的准确率会下降,因此众多学者将目光转向动态检测方法。

动态检测方法是指使用虚拟机或者沙箱对计算机的真实环境进行模拟,然后将恶意程序放入构建好的虚拟环境中运行,借助搭建在虚拟环境中的行为监控工具对样本的行为信息进行捕获,进而获得动态特征[2]。目前恶意程序的动态特征通常以API 函数名组成的调用序列为主[3],然而仅使用 API 函数名描述恶意程序行为特征并不全面,需要结合API 参数才能真正反映出一个程序是否具有恶意性,将API 函数名与参数相结合可以更好地理解 API 调用序列之间的关系。因此,本文提出了一种基于动态分析和深度学习相结合的恶意程序检测方法,通过搭建自动化分析沙箱,从沙箱的分析报告中提取恶意程序的API 调用序列,在此基础上,基于卷积神经网络构建恶意程序检测模型,本文的主要工作概括如下:

(1)构建Cuckoo 沙箱模拟恶意程序运行环境,通过沙箱提供的json 格式分析报告获取恶意程序运行时的API 调用序列;

(2)改进API 调用序列提取方法,提取恶意程序运行时的API 类型、API 函数名和参数,从而全面获取恶意程序的行为特征;

图1:恶意程序检测框架

图2:卷积神经网络结构图

图3:引入参数特征的准确率曲线

图4:引入参数特征和未引入参数特征的结果对比

(3)对提取的API 调用序列进行预处理,将API 调用序列视为单词,提出了基于词嵌入的方法,将API 调用序列转换为词向量;

(4)针对于获得的特征向量,构建卷积神经网络检测模型实现对恶意程序的检测,并与未考虑参数特征的检测结果进行对比。

2 恶意程序检测框架设计

2.1 检测框架总体设计

本文设计的基于动态分析与深度学习结合的恶意程序检测框架如图1 所示,在动态分析阶段,将由良性程序与恶意程序组成的样本数据集上传至Cuckoo 沙箱[4]进行动态分析后,得到被检测程序的分析报告。在特征提取与预处理阶段,从沙箱提供的分析报告中提取API 序列特征,具体包括API 函数的类型、API 函数名和API参数,把参数中的特殊字符去除后,将API 调用序列看作单词,使用Word2vec 模型[5]将API 调用序列转化为词向量作为检测模型的输入。在模型训练与检测阶段,本文选择使用卷积神经网络来构建恶意程序检测模型,将动态分析提取的样本数据对模型进行训练和测试,验证该检测框架的有效性。

2.2 数据预处理与词向量生成

应用程序在Cuckoo 沙箱内分析完成后沙箱会提供json 格式的动态分析报告,良性程序和恶意程序运行时的行为特点可以从API函数调用上进行体现,由于分析报告的信息量巨大,因此需要对分析报告进行预处理,由于分析报告的内容高度格式化,预处理的重点是提取运行过程中的所有API 调用包括API 类型、API 名称以及API 参数,通过对分析报告的结构和各字段的含义进行研究总结,API 调用情况在分析报告中的“/behavior/processes/calls/”字段下展开,其中字段“category”为API 的类型,主要包含了网络(network),进程(process),文件(file),注册表(registry),服务(services)和资源(resource)6 大类,字段“api”表示API 的名称,字段“arguments”为API 的参数,而程序运行时进程之间的调用关系可以在 “/behavior/processtree”字段下找到,依据“processtree”字段可以掌握进程之间的调用关系,再结合“/behavior/processes/calls/”下的“api”字段,可以得到某一进程下的API 调用序列,再根据进程调用的时间先后顺序对所有的API 调用序列进行排列和记录。

对于API 函数的类别和API 函数名称均为独立的单词,但是对于提取到的API 的参数来说,则存在多种类型例如文件路径,URL链接,注册表键值等,因此需要通过正则表达式对参数中的特殊字符进行处理,将参数分割成单词的形式。对于文件路径来说,通常以盘符开头,以“\”符号将路径完整串联起来,因此在处理的时候需要将盘符和“\”符号进行删除,对于URL 链接,通常以“http://”或者“https://”开头,以“.”进行连接,以“/”符号结尾,因此也需要删除这四个部分,对于注册表键值通常以“HKEY_”开头以“”进行连接,需要将“_”和“”符号进行删除,此外对于文件的扩展名,例如“.exe”、“.ini”等,本文的处理方法是将“.”去除,保留扩展名。通过对恶意程序API 调用序列进行处理之后,就将所有的API 调用信息转变成了独立的单词,也就便于后续借助自然语言处理方法,从语义层面对API 调用进行分析,挖掘区分恶意程序与良性程序的行为模式。

在基于卷积神经网络的检测模型中,需将从Cuckoo 沙箱分析报告中提取的API 调用记录转换成特征向量作为算法的输入,API调用记录经过预处理后由单词组成,而将单词或者是词语映射成的数字向量被称为词向量,因此本文考虑使用Word2vec 词向量模型,模型的原理是通过从一段无标注的自然文本中统计词频和词的搭配来建立一个语言模型,Word2vec 的本质是简单的神经网络模型,由输入层、隐藏层和输出层组成,经过训练学习之后得到的词向量模型,包含了输入文本的语义和语法信息。具体做法是将预处理阶段处理好的API 调用信息构成语料库作为训练数据来训练Word2vec 模型。利用训练出的词向量模型,对API 调用中的每一个单词元素进行向量化处理,得到一个float 型数组,这样将所有单词转换成向量之后,也就得到了由完整API 调用序列转换成的特征矩阵,进而输入卷积神经网络模型进行分类。

2.3 基于卷积神经网络的恶意程序检测模型

卷积神经网络(Convolutional Neural Network,CNN)是深度学习算法之一,广泛应用于文本分类,语音识别,图像处理等领域[6],由于本文提取的API 调用序列可以视为文本信息,因此可以借助卷积神经网络将恶意程序检测问题转变为文本分类问题,本文设计的网络模型结构如图2 所示:输入层是由API 调用序列经过Word2vec 模型训练得到的特征向量矩阵,将其作为卷积神经网络的输入,在本文的网络设计中,对于卷积层与池化层层数的设计需要考虑恶意代码的API 调用数目,如果卷积池化的操作过少会出现模型难以提取到高阶特征的情况,但是如果卷积池化的操作过多,会造成设计的网络冗余,耗费计算资源。综合考虑,本文选择设计三层卷积层和三层池化层,即连续进行三次卷积和池化的操作来不断迭代高阶特征,卷积核的大小按照卷积层层数的增加逐层递增,第一层卷积层使用16 个3*3 的卷积核,第二层卷积层使用32 个4*4 的卷积核,第三层使用64 个5*5 的卷积核。

关于激活函数的选择,由于ReLU 函数相较于Sigmoid 函数和Tanh 函数具备收敛快,计算量小,可以降低参数间的耦合关系的优势,因此本文选择ReLU 函数。

关于池化层的设计,本文将池化窗口大小设置为2*2,在池化方法的选择上考虑到传统的最大池化方法的缺点在于会丢失特征项频次信息和位置信息,因为最大池化方法只保留最大值,而在本文的研究内容中,API 的调用次数和API 调用出现的先后顺序对于判别程序的恶意性是有一定影响的。因此选用K-max-pooling 池化方法,在本文中K 设置为2,即保留特征值排名第一和第二的特征,选择这种池化方式的目的是为了尽可能多地保留特征的频次和位置信息,并且综合考虑时间和空间消耗,这种池化方式对模型的检测效率并无太大影响。

在经过三次卷积和池化处理后接入一个丢弃层,目的是为了防止出现过拟合的情况,丢弃层的参数通常设置为0.5,最后连接一层softmax 全连接层给出分类的结果,关于全连接层的损失函数的选择,由于本文的研究问题是对未知程序进行二分类,即最后的分类结果只有正例(恶意样本)和负例(良性样本),并且两者预测概率之和为1,因此损失函数选择交叉熵函数。

3 实验

3.1 数据集与实验环境

为了验证本文提出的恶意程序检测模型的有效性,本文使用公开数据集对检测模型进行评估,数据集包含恶意程序和良性程序,恶意程序选取自免费恶意样本网站VirusShare,恶意程序样本数为3270 个,良性程序选取自PortableFreeware,良性程序样本数为1890 个,共计5160 个。本文选择Cuckoo Sandbox 2.0.7 作为驱动恶意程序动态分析的基础环境,Cuckoo 沙箱主机端部署在硬件环境为Ubuntu 服务器的物理机器上,操作系统为Ubuntu 16.04 LTS(64位)。Cuckoo 沙箱客户端部署在硬件环境为基于Virtualbox 搭建的Windows 主机上,操作系统为Windows7 专业版(64 位)。算法模型验证环境搭建在基于Windows10(64 位)的个人PC 中,算法实现部分基于Python3.7、Tensorflow 1.14.0 和Keras 2.4.3 进行构建。

3.2 实验结果与分析

为了验证本模型的检测效果,本文使用3.1 中介绍的数据集进行实验,算法执行时将80%的样本数据作为训练集,20%的样本数据作为测试集,训练集与测试集的准确率的变化趋势如图3 所示。

通过观察曲线变化规律可以发现,在训练初期阶段,模型在训练集上的准确率已经达到了98%,随着训练次数的增加,训练集的准确率在96%至99%之间浮动,训练集上的平均准确率为99.08%。模型在测试集上的准确率通过曲线可知,在测试初期阶段达到了92%,而后准确率趋于稳定,模型在测试集上的平均准确率为94.19%,说明本文提出的卷积神经网络模型能有效检测恶意程序。同时为了验证本文提出的结合API 参数的恶意程序检测方法要优于只提取API 函数名的检测方法,本文进行了对照实验,即使用2.2 节介绍的提取方法只提取API 的函数名作为特征,使用相同的卷积神经网络模型进行实验,两种方法的准确率的对比结果如图4所示。

通过观察曲线可以发现,在仅使用API 函数名作为特征的情况下,模型在训练集上的准确率的变化幅度较大,检测准确率不稳定,而模型在测试集上的准确率根据图中曲线变化规律可知,在测试阶段初期其准确率与增加参数特征的准确率差距不大,但是随着测试次数的增加,不增加参数特征的模型的准确率开始低于增加参数特征的模型的准确率,平均准确率为92.63%,因此证明了引入API参数特征的检测方法能提高对恶意程序的识别率。同时由于两种特征模型的平均准确率均达到了92%以上也证明了本文提出的将动态分析与深度学习相结合的恶意程序检测方法是行之有效的。

4 结束语

本文提出了一种基于动态分析和深度学习相结合的恶意程序检测方法,改进了只提取API 函数名的特征提取方式,从Cuckoo 沙箱提供的分析报告中提取API 函数类型、API 函数名以及API 参数,力求全面刻画恶意程序行为特征。对API 序列进行预处理后,将API 调用序列转换为单词,使用Word2vec 模型将单词转变为词向量输入至卷积神经网络中。为了评估检测模型的有效性,本文收集了5160 个样本数据用于模型的训练与验证,在测试集上的平均准确率达到了94.19%。同时为了验证改进的特征提取方法的检测效果,本文仅使用API 函数名作为特征,进行同样的实验,在测试集上的平均准确率为92.63%,证明了本文提出的改进方法能提高对恶意程序检测的准确率。

猜你喜欢

沙箱调用准确率
不同序列磁共振成像诊断脊柱损伤的临床准确率比较探讨
核电项目物项调用管理的应用研究
LabWindows/CVI下基于ActiveX技术的Excel调用
Removing a stone
高速公路车牌识别标识站准确率验证法
巧用沙箱检测文件安全
基于系统调用的恶意软件检测技术研究
基于函数注入的沙箱拦截识别方法
基于多安全机制的 Linux 应用沙箱的设计与实现
利用RFC技术实现SAP系统接口通信