APP下载

基于特征序列的恶意代码静态检测技术

2022-11-15魏利卓石春竹许凤凯张慕榕

网络安全与数据管理 2022年10期
关键词:特征向量灰度准确率

魏利卓,石春竹,许凤凯,张慕榕,郝 娇

(中国电子信息产业集团有限公司第六研究所,北京100083)

0 引言

在网络迅猛发展的今天,恶意代码已经成为网络安全的重要威胁,在网络信息安全中占有一席之地[1]。当开源代码概念出现之后,产生了各种类型的代码,现在即使是新手也可以轻松地使用骇客工具创建恶意代码并发布到网络上,目前这种代码呈指数增长和扩散。现如今,国家网络安全问题受到了前所未有的关注[2]。

日益严重的安全问题,已经渗入到人民日常生活乃至国家层面上,特别是在工业互联网中的网络攻击会给国家的工业造成巨额损失。例如,震网病毒曾于2010年大面积出现,是当今世界上第一个完全根据工业控制环境所产生的毁灭性蠕虫病毒,它在短时期内危及着许多公司的正常运营[3]。伊万诺-弗兰科夫斯克半数以上的家庭受到了停电影响,困扰持续了几个小时[4]。在电站遭到攻击的同时,乌克兰的许多其他能源企业,如煤矿和石化等,也成为网络攻击的目标。

近年来,深度学习技术在人工智能应用领域受到了人们更多的关注。在语音识别、图形视觉效果及自然语言处理等应用领域,深度学习比浅层学习模型在特征提取、分类以及预测准确性方面有许多优势。鉴于其在其他领域的广泛应用,研究人员已经将深度学习用于恶意软件检测系统的开发,已有很好的检测结果,但也存在着不足之处。

比如,通过签名的恶意代码检测技术一般根据模式匹配的思路。2012年,Desnos提出了一种基于相似距离的检测软件之间的相似性和恶意软件的系统,从应用程序中提取签名,可以确定两个应用程序的相似性[5]。基于签名的恶意代码检测方法十分准确,但是对于未知的恶意代码来说却无能为力,因为需要有关人员不断地进行标记、更新病毒库,无法自动标记和更新,否则停歇之后,就会被逐渐淘汰下来,丧失其使用价值。

2020年,Kishore等人提出了一种利用沙盒辅助集成模型分析和检测JavaScript的新技术[6]。使用恶意软件沙箱提取有效载荷,以获得真实的脚本。将提取的脚本进行分析,以定义创建数据集所需的特征。但这种方法开销大,耗费大量的时间,需要保证虚拟环境下不被恶意代码攻击。

所以,针对以上恶意代码检测方法存在无法自动和高效提取恶意代码的问题,本文从纹理特征和操作码特征入手,提出了基于特征序列的恶意代码静态检测方法来实现自动、高效准确的恶意代码检测。

1 方法

1.1 静态特征提取

1.1.1恶意代码灰度图处理

灰度图是每个像素只有灰颜色的图像,这类图像通常显示为白色到黑色,即0到255像素。在恶意代码检测中,同类恶意代码有可以追溯同源的特性。因此,可以在恶意代码灰度图上找到其相似性。现阶段将二进制文件转换成8 bit的灰度图像,这样其中的每个字节都被视为一个值为0至255的像素。如图1所示,可以清楚地观察到同家族灰度图之间有相似的纹理结构,这体现了同一家族的同源性,而不同家族的纹理特征相差就比较明显。

图1 恶意代码家族灰度图像

首先,利用反编译工具IDA Pro对本文使用的恶意代码家族数据集进行反编译,并批量产生asm编译文档,在asm文档中能够获得Opcode序列。经过察验,在asm文档中操作码一般都是出现于以“text”为首的代码段中,利用正则表达式的方法来提取每行的恶意代码序列。这样提取出来的序列是完整的,包括了操作码和操作数的指令。本文利用操作码提取算法[7]进行操作码提取。根据操作码提取算法得到含有“text”的操作码序列,将恶意代码相似性转换成判断操作码序列的相似性。最传统的方式是将两恶意代码的操作码序列进行分词,以获得其相应的特征向量,通过计算特征向量间的汉明距离来确定恶意代码之间的相似性。传统的hash算法可以避免冲突,但是避免冲突几率非常低。即使对于两个相似的输入,散列输出也会大不相同。操作码提取算法如下:

恶意代码序列中相似的hash值其表示内容也是相似的,因此使用双线性插值算法来计算操作码序列的hash值。通过用MD5算法来计算每个操作码的hash值,并把每个序列编码成n位Simhash值。根据序列中的每一个1或0,可以加或减掉操作码的权值,得到新的序列。接下来确定新序列第n位值为1的哈希数量与第n位值为0的哈希值数量关系设置为1或0。这样每个序列就被编码成n位的Simhash值。将处理过的每个Simhash转换为一个像素值。如果比特位为0,那么像素值为0,如果比特位为1,那么像素值为255,之后将n个像素点排列成矩阵,将Simhash值转换成灰度图像。因为存在着不同恶意代码家族所产生的灰度图像尺寸差异的问题,于是在本文中引入了双线性插值算法对图像进行压缩。双线性插值算法所下:

如 图2所 示,P为 插 值 点,Q11、Q12、Q21和Q22是已知的像素点,P(x,y)为所要计算的像素数,假设已知函数f在Q11=(x1,y1)、Q12=(x1,y2)、Q21=(x2,y1)和Q22=(x2,y2)四个点的值。 先在x轴方向进行线性插值,得到R1和R2,然后在y轴方向进行线性插值得到插值点P。公式如下:

图2 双线性插值算法

通过双线性插值算法对灰度图像缩放后,利用图像纹理特征提取算法提取图像的特征,具体流程如图3所示。

图3 提取灰度图特征流程

1.1.2灰度图纹理特征提取

在上小节把二进制文件转换成灰度图片,本节中使用GIST(全局特征)算法对灰度图片进行全部特征的提取,再使用SIFT(尺度不变特征变换)算法对图像进行部分特征的提取。通过比较灰度图片后,可发现恶意代码家族的全局相似性非常高,具体区别在于部分特征上。在获取恶意代码图像全局特征信息的前提条件下突出局部特点,才能最好地表现出恶意代码的家族特征,更有区分性。本节先提取恶意代码灰度图像的全局和局部特征,后再把全局和局部特征加以融合。

GIST是2001年由Olive等人提出的描述图像全局特征的算子,能够识别图像的全局不变性,检索速度快[8]。该特征对不同尺度和方向的Gabor进行改进和拓展。GIST算法把尺寸为m×n的灰度图像f(x,y)切分成nq×nq规格的网格结构,其中网格结构的块数为S。每个网格行标记为Qi(i=1,2,3,…,S)。网格像素的平均大小大小为r×c,其中r=m/np,c=n/np。像素经过kn个通道的Gabor滤波器卷积运算,这样每个网格图像在各自的滤波通道后,级联结果就是GIST特征,如式(4)所示。

其中α和β分别表示滤波器的尺度和朝向,通过GIST算法将图像分成4×4的网格,在灰度通道上采用方向数8、8、4的三种尺度,即提取320维的GIST特征。

SIFT是用来描述图像局部纹理特征的算子[9]。其特征是通过计算图像间不同尺度下高斯对数的拉普拉斯算子(LOG),选择地给出最佳结果的尺度值,就是在图像的不同比例值上计算多个LOG值。但是由于对数计算在某种程度上代价太高,因此在SIFT算法中使用高斯差(DOG)。高斯差是通过使用等式减去图像中两个不同比例(r)的高斯模糊来计算,检测的关键点使用泰勒级数展开进行准确定位。SIFT中的每个关键点都使用128位特征向量来描述,该向量可用于从图像构建模式,如式(5)所示:

高斯模糊使用高斯函数计算模糊模板,将计算后的模板与最初图像信息卷积运算,从而对图像进行模糊处理。n维空间正态分布方程如式(6)所示:

式中,σ是正态分布的标准差,σ值越大,表示处理后的图像效果越模糊(平滑)。r是模糊模板上任一元素到中心的距离。如二维模板尺寸为m×n,则模板上的元素(x,y)对应的高斯计算如式(7)所示:

首先利用SIFT提取恶意软件灰度图像的局部特征,描述图像的边缘和角点。通过特征包(BOF)[10]范式降低密集SIFT描述符的维数。通过BOF方法降低稠密SIFT算子的维数分为四个阶段。在第一阶段,借助密集SIFT检测器从密集网格中提取恶意软件图像的关键特征。在第二阶段,选择密集的SIFT描述符来计算矩形区域的128维局部特征向量,其中每个关键特征由式(8)所示的函数表示。

其中MI表示维度为Dh×Dw的二值图像,Rs表示尺寸调整参数,Ssize表示密集SIFT描述符的大小,Bbounds表示二值图像每个关键点周围的矩形区域。

第三阶段,DSIFTFV用K-means技术进行聚类,这个过程称为字典学习,如式(9)所示:

其中Dsize是字典的大小。

最后,DSIFTFV分配给字典中最接近的视觉特征,这个过程称为描述符量化。每个量化的描述符就会以直方图的形式来表示,直方图出现的值在0至1尺度之间变化,然后通过计算DSIFTFV和DictionaryL之间的最小欧几里德距离来生成基于BOF的密集SIFT描述,如式(10)所示:

其次,通过使用GIST计算恶意软件灰度图像的全局特征,得到图像的纹理和空间布局。通过GIST描述恶意软件图像分为三个阶段。在GIST的第一和第二阶段,恶意软件图像通过不同比例和位置的过滤器过滤,将其分成N个块。第三阶段,用GIST计算每个块的平均值,如式(11)所示:

其中MI表示维度为Dh×Dw的恶意软件图像;Rs表示尺寸调整参数;Nb表示将恶意软件图像分成水平和垂直位置的标准块大小;Bovertap表示重叠参数,用于分离重叠或非重叠块中的二值图像;Fn表示用于过滤二值图像的多个过滤器;Nsq表示统计量的数量,即在计算特征描述时使用的平均值和偏差。

最后,将基于BOF的稠密SIFT与GIST组合,得到的混合的CSGM特征维数。CSGM特征如式(12)所示:

其中w表示加权参数,其值取决于恶意软件分类中的特征值。

1.1.3 基于流程图的操作码

因为恶意代码都是机器识别的二进制文件,所以将其反编译得到研究人员能够识别的汇编文件。由上文可得到IDA Pro反编译的编译文件,并对编译文件用正则表达式的方法得到操作码。在本节中,首先使用IDA Pro将恶意代码程序反编译转换成编译程序。由于恶意代码程序由一些结构体、条件循环等构成,因此在函数调用之间存在着一些联系,可以通过IDA Pro来查看函数的调用关系,如图4所示。这种函数调用关系可以用控制流程图表示,抽象表达一个过程或者程序。根据控制流程图的顺序来提取其对应的操作码:{call,mov,jmp,mov,lea,mov,lea,mov,cmp,jle,call,cmp,jz,mov,call,mov,leave,retn,mov,call}。

图4 函数调用关系

这样提取的操作码无法完成自动化分析,下一节将操作码序列转换成向量。

1.1.4 基于N-garm的Opcode特征

从上一节得到了恶意代码的控制流程图操作序列,但是这个序列不能被模型识别。因此需要对其进行矢量化和数值化的处理,作为神经模型的输入。在这一节,用N-gram方法对操作码序列进行特征提取,这种方法的检测颗粒度较小,与控制流程图相结合会得到代码上下文之间的关联。下面主要介绍将操作码向量化的过程。

假设操作码序列片段为{push,mov,push,call,add,mov,xor,pop},将滑动窗口长度n设为3,会得到子序列集合{(push,mov,push),(mov,push,call),(push,call,add),(call,add,mov),(add,mov,xor),(mov,xor,pop)}。每个二进制文件可以组合所有子序列(v1,v2,v3,…,vn)来生成子序列集合S。如果这个子序列v在集合S中,那么将其设置为1,否则设置为0,最终会得到一个只包含0和1的特征向量,这样形式的特征序列可以被神经网络模型识别。操作码N-gram算法如下:

1.2 恶意代码特征融合

将恶意代码图像纹理特征和操作码特征融合成一个特征向量,作为模型的输入。融合的特征向量可以从不同的维度和层次综合考虑和分析恶意代码。首先读取灰度图像样本和操作码的特征向量,对两种特征向量利用pandas.merge()函数进行融合,生成新的融合特征向量f_s,之后利用pandas.merge()函数把特征向量fusion_s与标签文件labels融合,最终得到融合特征f,特征融合方法下:

1.3 基于LSTM的恶意代码检测模型

操作码序列是按照恶意代码执行逻辑顺序出现的,所以上下文之间存在着一定的关联性,而融合的特征也具备了这一特点,在此特点上,LSTM(长短期记忆网络)具有遗忘机制、保存机制和长时间记忆信息的特点[10],所以LSTM能更好地提取到恶意代码深层次的特征。本小节构建LSTM模型对恶意代码进行检测并分类。

在LSTM训练过程中,通过不同的特征来对模型训练。在前面通过对编译文件进行特征提取,将asm文件通过Simhash算法处理生成灰度图像,并提取恶意代码灰度图像的纹理特征。在汇编文件中,通过控制流程图的方式提取到操作码,之后通过N-gram算法提取操作码。最终把所获取到的灰度图像纹理特性与操作码特性进行特征融合,进而得到一种全新的融合特征,将融合的特征作为LSTM模型的输入。

LSTM是一种特殊的循环神经网络(RNN)。在RNN模型训练中,随着训练时间的延长和网络层的增加,很容易发生梯度爆炸或消失,从而在处理长序列时RNN的效果差强人意[11]。2005年,Graves和Schmidhuber提出了一种双向长短期记忆神经网络(Bi-LSTM),是当前应用最广泛的一种LSTM模型[13]。

LSTM与RNN最大的区别是,RNN有单循环结构的状态,而LSTM的单循环结构(又称细胞)有四种状态。与RNN相比,LSTM循环结构具有一个持续的单位状态进行传播,可以用来判断某些信号要遗忘还是继续传播下去。具有三个连续循环结构的RNN如图5所示,每个循环结构都有一个输出。

图5 连续循环结构的RNN图

具有三个连续循环结构构造的LSTM如图6所示。

图6 循环结构的LSTM的模型图

一层LSTM通常是由单一循环结构组成的,即由输入数据的维度和循环次数确定每一个循环结构需要自我更新几次,而不是由多个单一的循环结构连续组成。当前层LSTM的参数总个数只需要计算每一个循环单元数量就行,不计算几个连续单元的合计数量。

LSTM网络利用同一种门结构对所有细胞状态进行删减或添加信息。LSTM由输入门、遗忘门、输出门和单元状态组成。门由sigmoid层和逐点乘法等运算方式构成,在sigmoid层中输出0到1之间的数值,由门判断各个元素该通过多少,数值为0代表门不让所有内容过,而数值为1代表门让全部内容通过。

输入门:决定当前时刻网络的输入数据有多少需要保存到单元状态。

遗忘门:可以决定在上一时刻的所有单元状态有哪些需要保存到当前时间。

输出门:可以控制对当前单元状态的需要程度,输出到当前的输出值。

首先把上一时刻的输出ht-1与当前的数据输入xt接连通过遗忘门得到ft。

接下来是应用上一个时刻的输出ht-1和当前的数据输入xt,通过输入门得到it,以及通过单元状态得到当前时刻暂时状态

之后应用上一个细胞结构的单元状态Ct-1、遗忘门输出ft、输入门输出it以及单元状态的输出得到当前细胞的状态Ct。

最后通过输出门得到ot,以及结合当前细胞的单元状态Ct和ot得到最终的输出ht。

本节采用的是单层的LSTM单元来构建融合特征的恶意代码检测模型。在构建模型时候,选择具有两个相反方向的结构组成模型,在LSTM模型后连接Softmax分类器,这样可以对恶意代码进行自动提取特征及分类。模型构建完成后,将已处理好的融合特征向量作为LSTM的输入、训练模型。在训练中,通过不断对模型调参来确定恶意代码的输入数据,提高模型的分类能力。

2 实验结果与分析

2.1 数据集

静态恶意代码检测的用的实验数据是微软恶意软件数据集和VirusShare恶意样本数据集,包括了12个恶意家族的11 516恶意代码可执行文件。如表1所示。

表1 静态恶意代码数据集

2.2 评价指标

在实验中,使用统一的统计指标来评估模型的性能,包括准确率、精确率、召回率、F1-Score等。准确率(Accuracy)用来评价恶意代码检测分类模型对恶意代码分类的正确率程度,是一种直接直观的评价指标。精度率(Precision)是评估真正检测到的实例与预测的正确应用数量的比率。召回率(Recall)是计算为正的正样本实例与总样本的比率。F1-score是判断良性还是恶性软件的比较值。

2.3 实验结果

首先对于灰度图像特征提取与传统方法进行比较,之后将融合的特征在前文使用的LSTM模型中进行训练,结果与传统的机器学习模型和其他论文方法进行比较。

在模型构建成功后,为了使得模型能够适应恶意代码融合特征,需要对LSTM模型调整参数,对LSTM的网络结构进行优化。先对模型进行调优,测试迭代次数epoch、学习率lr、隐藏神经元的个数n_hidden等参数设置对特征融合的LSTM恶意代码检测模型的分类结果产生的影响。在N-gram的Opcode特征中,n的取值也会对最终的结果产生影响。最终经过多次实验和不同参数组合下,确定在学习率lr为0.002,迭代次数epoch为15,Dropout设置为0.5,隐藏神经元的个数设置为20的组合下,模型具备较好的分类能力。先对操作码特征与灰度图像特征进行提取和实验,之后把融合后的特征与单一特征进行比较。

在提取操作码特征中将N-gram中的n值设置为1到5,测试不同的n值对实验结果的影响,实验结果如表2所示,可以看出当n=4的时候分类的准确率最高。

表2 操作码特征对比结果

在灰度图像特征提取中,先是用GIST算法获取全局特征,随后再用SIFT算法提取局部特征,再将全局和局部按照上一小节方法进行融合,将三者特征与LSTM模型训练。实验如表3所示。将全局与局部特征融合一起的准确率更高,效果更好。

表3 图像特征对比结果

在对比实验中,利用两种单一特征和特征融合的方法与LSTM模型进行训练实验,对比实验如图7所示。

图7 单一特征与融合特征对比流程

其中LSTM模型的参数在上面已经描述。如表4所示,基于N-gram操作码的分类准确率为93.4%,基于灰度图像特征的分类准确率为97.8%,融合特征的分类准确率为98.3%。可以看出融合特征的分类准确率高于其余两者的准确率,这说明了融合特征从不同维度描述恶意代码的行为特征,提高了对恶意代码检测的准确率,而单一层面的特征是从局部或者全局维度来考虑恶意代码的行为信息,不能完整地描述恶意代码的行为。

表4 与单一特征对比结果

(2)传统机器学习模型进行对比分析

将N-gram中n设置为4的融合特征模型与传统机器学习模型进行对比,验证不同模型对于实验结果的影响,对比实验如图8所示。

图8 融合特征模型与机器学习对比流程

实验分别使用支持向量机(SVM)、逻辑回归(LR)、朴素贝叶斯(NB)和RNN与LSTM模型进行对比,利用Precision、recall、F1-score和Accuracy对 实 验 结 果进行评估,如表5所示。

表5 静态特征与模型对比结果

表5中模型训练10次的准确率如图9所示。

图9 五种模型10次训练准确率折线图

由表5和图9可知,LSTM模型的精度率、召回率和F1-score这三项指标小于和等于其余模型,但是在准确率上面要高于其余四个模型,虽然这四个指标是衡量分类效果的标准,但是准确率更主要地确定模型分类的效果,特征融合的LSTM模型准确率要高于其他模型,说明了模型的分类效果较好。

(3)与其他文献方法进行对比分析

将本文融合特征的模型与其他论文使用相同数据集的模型进行对比,如表6所示。

表6 与其他论文对比结果

融合特征的分类准确率要高于文献[14]所采用的ResNet和GoogleNet模型进行的分类;高于文献[15]将恶意软件映射成彩色图像,利用CNN模型对恶意软件进行的分类;也略高于文献[16]的经典恶意代码可视化方法。实验验证了基于融合特征的静态恶意代码检侧模型的效果。

通过对上述实验分析可知,融合的特征效果要比单一特征效果要好,而且LSTM模型可以通过上下文的联系,能够提取较深层次的恶意代码融合特征,这些特征描述能力较好,能够更好地表现出恶意代码特征,融合特征,使模型有较好的分类能力。

3 结论

本文针对深度学习的恶意代码检测问题进行了相关的研究并提出了一种检测方法,主要如下:

首先,在静态恶意代码分析方面。在提取图像纹理特征上,本文提出一种Simhash处理编译文件转换成灰度图像的方法,该方法利用Simhash算法的特性将恶意代码中相似的二进制值转换成相同大小的相似图像,通过GIST算法和SIFT算法提取灰度图像的全局和局部纹理特征,将全局和局部纹理特征进行融合。在获取操作码的特征上,用控制流程图的顺序反编译恶意代码后得到操作码,之后用N-gram算法获得操作码特征。

其次,因为灰度图像特征和操作码特征分别反映了恶意代码的全局和局部上同类别恶意代码的相似性,所以提出一种将全局和局部特征进行融合的方法,综合考虑到恶意代码的特征,将融合特征作为LSTM模型的输入加以训练、分类,以此增加恶意代码检测的精确度,并经过实验验证,本文提出的方法能够提高恶意代码检测工作的效率和准确率。

猜你喜欢

特征向量灰度准确率
二年制职教本科线性代数课程的几何化教学设计——以特征值和特征向量为例
采用改进导重法的拓扑结构灰度单元过滤技术
克罗内克积的特征向量
乳腺超声检查诊断乳腺肿瘤的特异度及准确率分析
不同序列磁共振成像诊断脊柱损伤的临床准确率比较探讨
天津港智慧工作平台灰度发布系统和流程设计
2015—2017 年宁夏各天气预报参考产品质量检验分析
Bp-MRI灰度直方图在鉴别移行带前列腺癌与良性前列腺增生中的应用价值
颈椎病患者使用X线平片和CT影像诊断的临床准确率比照观察
Arduino小车巡线程序的灰度阈值优化方案