作者
杨秀璋
来源
CSDN博客
头图
视觉中国
这篇文章将介绍基于机器学习的恶意代码检测技术,主要参考郑师兄的视频总结,包括机器学习概述与算法举例、基于机器学习方法的恶意代码检测、机器学习算法在工业界的应用。同时,我再结合自己的经验进行扩充,详细分享了基于机器学习的恶意代码检测技术,基础性文章,希望对您有所帮助~
声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。
随着互联网的繁荣,现阶段的恶意代码也呈现出快速发展的趋势,主要表现为变种数量多、传播速度快、影响范围广。在这样的形势下,传统的恶意代码检测方法已经无法满足人们对恶意代码检测的要求。比如基于签名特征码的恶意代码检测,这种方法收集已知的恶意代码,以一种固定的方式生成特定的签名,维护这样的签名库,当有新的检测任务时,通过在签名库中检索匹配的方法进行检测。暂且不说更新、维护签名库的过程需要耗费大量的人力物力,恶意代码编写者仅仅通过混淆、压缩、加壳等简单的变种方式便可绕过这样的检测机制。
为了应对上面的问题,基于机器学习的恶意代码检测方法一直是学界研究的热点。由于机器学习算法可以挖掘输入特征之间更深层次的联系,更加充分地利用恶意代码的信息,因此基于机器学习的恶意代码检测往往表现出较高的准确率,并且一定程度上可以对未知的恶意代码实现自动化的分析。下面让我们开始进行系统的介绍吧~
机器学习概述与算法举例
1.机器学习概念
首先介绍下机器学习的基本概念,如下图所示,往分类模型中输入某个样本特征,分类模型输出一个分类结果。这就是一个标准的机器学习检测流程。机器学习技术主要研究的就是如何构建中间的分类模型,如何构造一组参数、构建一个分类方法,通过训练得到模型与参数,让它在部署后能够预测一个正确的结果。
训练是迭代样本与标签对的过程,如数学表达式y=f(x),x表示输入的样本特征向量,y表示标签结果,使用(x,y)对f进行一个拟合的操作,不断迭代减小y’和y的误差,使得在下次遇到待测样本x时输出一致的结果。该过程也称为学习的过程。
构造分类方法
构造分类方法是机器学习中比较重要的知识,如何设计一种分类模型将f(x)表达出来。比如:
超平面(SVM)在二维坐标轴中,可以设计一条直线将空间内分布的散点区分开来,如下图所示。softmax另外一种方法是构造类别概率输出(softmax),比如归一化处理得到A+B=1,最后看A和B的概率,谁的概率大就属于哪一类,该方法广泛使用于神经网络的最后结果计算中。
2.机器学习算法举例
作者之前Python系列分享过非常多的机器学习算法知识,也推荐大家去学习:机器学习系列文章(共48篇)。
(1)支持向量机(SVM)
首先存在很多训练数据点,包括直线上方和下方两个簇,支持向量机的方法是寻找这两个簇分类的超平面。如何寻找这个超平面呢?支持向量机先求解每个簇离对面最近的点,然后通过拟合方法计算出两边簇的边界,最终计算出中间的平面,其基本思路就是这样,而这些点就是支持向量。支持向量机往往用来处理超高维的问题,也不一定是类似直线的平面,也可能是圆形的分类边界。
(2)神经网络(NeuralNetwork)
神经网络基本网络结构如下图所示,包括三个常用层:输入层、隐藏层、输出层。在神经网络中,最基本的单位是人工神经元,其基本原理是将输入乘以一个权重,然后将结果相加进行激活,最后得到一个概率的输出,其输出结果谁大就预测为对应的结果。
(3)深度卷积神经网络
普通的神经网络通常只包括一个隐藏层,当超出之后可以称为深度神经网络。现在比较流行的包括CNN、RNN、RCNN、GRU、LSTM、BiLSTM、Attention等等。其中,卷积神经网络常用于处理图片,应用了卷积技术、池化技术,降低图片维度得到很好的结果。
如上图所示,将手写数字“3”(32x32个像素)预测为最终的数字0-9的结果。模型首先使用了6个卷积核,对原始图片进行固定的计算,如下5x5的图像卷积操作后变成了3x3的图像。其原理是将特征提取的过程放至神经网络中训练,从而得到比较好的分类结果。卷积之后进行了一个2x2的下采样过程,将图片进一步变小(14x14),接着降维处理,一般采用平均池化或最大池化实现,选定一个固定区域,求取该区域的平均值或最大值,然后将向量进行组合,得到一个全连接网络,最终完成分类任务。
深度神经网络是深度学习中模型,它主要的一个特点是将特征提取的过程放入到真个训练中,之前对于图片问题是采用手工特征,而CNN让在训练中得到最优的特征提取。
3.特征工程-特征选取与设计
上面介绍了机器学习和深度学习方法,但是这些方法往往是该研究领域的学者所提出,而在恶意代码检测中,往往我们的主要工作量是一些特征的提取和特征的设计,这里面涉及一个特征工程的概念。
特征工程:选取特征,设计特征的过程。
例如,在路边预测一个人是否是学生,假设我们不能去询问,只能通过外表去预测他是否是一个学生,包括:年龄(低于15岁就是学生)、性别(不影响学生)、衣着(穿着活泼年轻的可能是学生,如果穿着西装可能性就小)等等,然后根据这些特征输入机器学习模型,从而判断是否是学生。
在这些特征中,显然有些特征是非常重要的,比如年龄和衣着。数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限,所以如何选取特征是机器学习的一个关键性因素。再比如淘宝的推荐系统,购买电脑推荐鼠标、键盘等。
当然,上面仅仅是一个比较简单的问题,当我们推广到恶意代码检测等复杂问题时,如果不了解这个领域,可能就会导致模型的结果不理想。
特征设计——人脸识别
局部二值特征(LocalBinaryPattern),再举一个人脸识别例子,深度学习出来之前,图片分类都是使用一些特征算子提取特征的。比如存在一个3x3的窗口,我们取阈值5,比5小的窗口置为0,其他的置为1,然后顺时针转换为一个8位的二进制数字,对应的十进制就是19。显然,LBP特征进行了一个降维的操作,左边的图片显示了人脸识别不应该受光照影响,不同光照的图片进行LBP特征提取后,显示结果都一样。
该部分的最后,作者也推荐一些书籍供大家学习。
《统计学习方法》李航,数学理论较多《机器学习》周志华,西瓜书,较通俗透彻《DeepLearning》IanGoodfellow,花书,深度学习内容全面《精通特征工程》结合恶意代码特征学习,包括如何向量化
再看看我的桌面,这些都是作者最近看的一些安全、AI类书籍,希望也您喜欢~
基于机器学习方法的恶意代码检测
1.恶意代码的静态动态检测
(1)特征种类
首先,特征种类如果按照恶意代码是否在用户环境或仿真环境中运行,可以划分为静态特征和动态特征。
静态特征:没有真实运行的特征字节码:二进制代码转换成了字节码,比较原始的一种特征,没有进行任何处理IAT表:PE结构中比较重要的部分,声明了一些函数及所在位置,便于程序执行时导入,表和功能比较相关Android权限表:如果你的APP声明了一些功能用不到的权限,可能存在恶意目的,如手机信息可打印字符:将二进制代码转换为ASCII码,进行相关统计IDA反汇编跳转块:IDA工具调试时的跳转块,对其进行处理作为序列数据或图数据
动态特征:相当于静态特征更耗时,它要真正去执行代码API调用关系:比较明显的特征,调用了哪些API,表述对应的功能控制流图:软件工程中比较常用,机器学习将其表示成向量,从而进行分类数据流图:软件工程中比较常用,机器学习将其表示成向量,从而进行分类
举一个简单的控制流图(ControlFlowGraph,CFG)示例。
if(xy){y=0;x=x+1;}else{x=y;}
(2)常见算法
普通机器学习方法和深度学习方法的区别是,普通机器学习方法的参数比较少,相对计算量较小。
普通机器学习方法(SVM支持向量机、RF随机森林、NB朴素贝叶斯)深度神经网络(DeepNeuralNetwork)卷积神经网络(ConvolutionNeuralNetwork)长短时记忆网络(LongShort-TermMemoryNetwork针对序列模型进行建模,包含上下文依赖关系,比如“我是一名大学生”中的“我”和“是”前后出现的条件概率更高。广泛应用于文本分类、语音识别中,同样适用于恶意代码检测。图卷积网络(GraphConvolutionNetwork)比较新兴的方法,将卷积应用到图领域,图这种数据类型比较通用,非图数据比较容易转换成图数据,CCF论文中也已经应用到恶意代码检测中。
2.静态特征设计举例
首先分享一个静态特征的例子,该篇文章发表在年,是一篇CCFC类会议文章。
SaxeJ,BerlinK.Deepneuralnetworkbasedmalwaredetectionusingtwodimensionalbinaryprogramfeatures[C]//10thInternationalConferenceonMaliciousandUnwantedSoftware(MALWARE).IEEE,:11-20
文章的主要方法流程如下所示:
该模型包含三个步骤:
特征抽取使用了四种特征特征抽取输入到深度神经网络包含两层隐含层的深度神经网络
分数校正
特征抽取
特征提取包括以下四种特征:
字节-熵对统计特征:统计滑动窗口的(字节,熵)对个数在下图中,假设白框是一个二进制文件,其中红色框W是滑动窗口,二进制文件如果有KB大小,每个滑动窗口是字节,那么滑动次可以将整个二进制文件扫描完。如果对窗口内的数值进行计算,首先计算它的熵值,熵是信息论的概念(下图中的E),它描述了一个数组的随机性,熵越大其随机性越大。在图中,每一个滑动窗口都有固定的熵值,包含了字节,标记为(Bi,Ewi),最后滑动得到x的字节熵对。
统计最后滑动得到x的字节熵对个数,得到如下图所示的二维直方图结果,横坐标是熵值最小值到最大值的范围,纵坐标是一个字节转换成10进制的范围0-,最终得到字节熵对分布的范围,再将16x16维的二维数组转换成1x维的特征向量。
PE头IAT特征:hashDLL文件名与函数名为[0-)范围第二种特征是PE头IAT特征。它的计算工程是将PE头的IAT表里面的文件名和函数名hash到0到范围,如果某个文件出现某个函数,就将该位置为1,当然每位对应表示的函数是固定的,最终得到数组。可打印字符:统计ASCII码的个数特征可打印字符和字节熵对比较相似,这里推荐大家阅读原文。PE元信息:将PE信息抽取出来组成维数组,例如编译时间戳PE元信息是将PE信息的数值型信息抽取出来,组成维数组,每一个数组的位置表示了一个固定的信息种类,再信息种类将对应的信息填入到元素的位置,比如编译时间戳。
总共有上述四种特征,然后进行拼接得到4*=维的数组,这个数组就代表一个样本的特征向量。假设有00个样本,就有对应00个特征向量。
得到特征向量之后,就开始进行模型的训练和测试,一般机器学习任务事先都有一个数据集,并且会分为训练数据集和测试数据集,按照4比1或9比1的比例进行随机划分。训练会将数据集和标签对输入得到恶意和非恶意的结果,再输入测试集得到最终结果。
下面是衡量机器学习模型的性能指标,首先是一幅混淆矩阵的图表,真实类别中1代表恶意样本,0代表非恶意样本,预测类别也包括1和0,然后结果分为:
TP:本身是恶意样本,并且预测识别为恶意样本FP:本身是恶意样本,然而预测识别为非恶意样本,这是误分类的情况FN:本身是非恶意样本,然而预测识别为恶意样本,这是误分类的情况TN:本身是非恶意样本,并且预测识别为非恶意样本
然后是Accuracy(准确率)、Precision(查准率)、Recall(查全率)、F1等评价指标。
通常Accuracy是一个评价恶意代码分类的重要指标,但本文选择的是AUC指标,为什么呢?
假设我们模型的效果非常差,它会将所有本测试样本标记为恶意样本,这样我有两个数据集,一个样本包括个数据(99个恶意样本、1个非恶意样本),另一个样本包括50个数据(50个恶意样本、50个非恶意样本),如果我单纯的计算ACC,第一个样本的结构是0.99,显然不符合客观的描述,不能用来评价性能高低的,并且这种情况是很容易产生的。所以论文中广泛采用AUC指标。
AUC指标包括TPRate和FPRate,然后得到一个点,并计算曲线以下所包围的面积即为AUC指标。其中,TPRate表示分类器识别出正样本数量占所有正样本数量的比值,FPRate表示负样本数量站所有负样本数量的比值。举个例子,我们撒网打鱼,一网下去,网中好鱼的数量占池子中所有好鱼的数量就是TPRate,而FPRate表示一网下去,坏鱼的数量占整个池子中所有坏鱼的数量比例,当然FPRate越小越好。最好的结果就是TPRate为1,而FPRate为0,此时全部分类预测正确。
该论文测试了六种特征集合,其计算的TPR和AUC值如下所示。
3.经典的图片特征举例
下面介绍另一种比较新兴经典的方法,就是图片特征。但一些安全界的人士会认为这种特征不太好,但其方法还是比较新颖的。
它的基本方法是按照每8位一个像素点将恶意软件的二进制文件转换为灰度图片,图片通常分为R、G、B通道,每个8位像素点表示2^8,最终每隔8位生成一个像素点从而转换为如下图所示的灰度图片。图片分别为Obfuscator_ACY家族、Lolipop家族、ramnit家族恶意软件样例,这些样例由微软kaggle比赛公布的数据生成。
这是因为对于某些恶意样本作者来说,他只是使用方法简单的修改特征码,从而每个家族的图片比较相似,最终得到了较好的结果。
4.动态特征设计举例
接下来分享一个动态特征的例子,该篇文章发表在年,文章的会议一般,但比较有代表性。
KolosnjajiB,ZarrasA,WebsterG,etal.Deeplearningforclassificationofmalwaresystemcallsequences[C]//AustralasianJointConferenceonArtificialIntelligence.Springer,Cham,:-.
下图展示了该方法的整体流程图。PE文件进入后,直接进入Cuckoo沙箱中,它是一个开源沙箱,在学术论文中提取动态特征比较通用;接着进行进行预处理操作,将文本转换成向量表示的形式,比如提取了个动态特征,可以使用维向量表示,每个数组的位置表示对应API,再将所得到的序列输入卷积神经网络LSTM进行分类,最终得到家族分类的结构。
Cuckoo沙箱LSTM
下图展示了实验的结构,其指标是高于单纯的神经网络和卷积网络的效果更好,这是一篇比较基础的文章。
5.深度学习静态检测举例
下面再看一个深度学习静态检测的文章。
CoullSE,GardnerC.ActivationAnalysisofByte-BasedDeepNeuralNetworkforMalwareClassification[C]//IEEESecurityandPrivacyWorkshops(SPW).IEEE,:21-27.
这篇文章是火眼公司的两名员工发布的,所使用的也是静态检测特征,其流程如下所示。
首先,原始的字节码特征直接输入一个ByteEmbedding层(词嵌入),对单个元素进行向量化处理,将字节码中的每个字节表示成一个固定长度的向量,从而更好地将字节标记在一个空间维度中。词嵌入技术广泛应用于自然语言处理领域,比如“女人”和“女王”关系比较紧密,这篇文章的目的也是想要在恶意代码中达到类似的效果。然后将矩阵输入到卷积和池化层中,比如存在一个K字节的二进制文件,得到10矩阵输入卷积神经网络中,最后通过全连接层完成恶意和非恶意的分类任务。
Fireeye使用了三个数据集进行训练和测试,其训练的模型分类效果结果如下表所示,博客Small、Baseline、Baseline+Dropout模型,其网络结构是一样的,其中Small表示使用小的数据集,Baseline表示使用大的数据集,Dropout表示对训练好的神经网络中随机丢弃一些神经元,从而抑制过拟合现象,也是比较常用的深度学习技术。
这篇文章的重点是对深度学习的解释性,就是解释深度学习是否能学习到恶意软件的本质特性。下图展示了不同特征对于分类结果的影响,横坐标是Offset偏移,通常用Offset记录字节,从0到右边也对应文件大小,前面可能就是PE头,中间有各种段。
它的横纵坐标分别表示了某些特征对于恶意性分类比较重要,还是非恶意性比较重要。如果它的校验和(CheckSum)是0,就对恶意性分类比较重要,这表示深度学习并没有学习到恶意软件为什么是恶意的,只是通过统计学去发现恶意软件和非恶意软件差别最大部分,以此进行数据建模。
深度学习进行恶意软件检测的问题:没有学习到恶意和非恶意特征,而是学习到区别的统计差异,而这种差异如果被黑客利用是可以被规避的。
6.优缺点
静态特征
优点特征提取速度快特征种类丰富,可以组合多种特征向量缺点易受加壳、加密、混淆干扰无法防范无文件攻击,难以反映恶意软件行为的恶意性
动态特征
优点提供恶意软件的动作,调用API规避一些静态的混淆对抗方法缺点反虚拟化,延时触发等技术的对抗测试时间较长,单个样本2-3分钟(Cuckoo)
最后给出推荐资料:
notfound实验室总结的AI在安全领域应用
转载请注明:http://www.0431gb208.com/sjszyzl/2138.html