目前,越来越多的网络安全解决方案都在依靠机器学习(ML)技术,来保护用户免受恶意软件的攻击。虽然基于ML的方法(如FireEye终端安全的MalwareGuard特性)在检测最新的网络威胁方面做得非常出色,但它们也带来了大量的研发和维护成本,MalwareGuard就是FireEye的数据科学家花费了两年时间研究出来的成果。由于创建和策划大量有用的安全特性需要大量的时间和专业知识,所以只有来自恶意软件分析师和数据科学家才能做到。请注意,本文中所提到的特性是指可执行文件的属性或特性,可用于区分良好软件和恶意软件。然而,近年来,深度学习方法在自动学习的复杂问题领域(如图像,语音和文本),取得了令人瞩目的成果。FireEye是否可以利用深度学习中的这些技术进步,在成本很小和专业知识很少的情况下检测出恶意软件呢?
事实证明,深度学习架构,特别是卷积神经网络(Convolutional Neural Networks, CNN),只需查看Windows可移植可执行文件(PE)文件的原始字节就可以很好的检测出恶意软件。卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一 [1-2] 。由于卷积神经网络能够进行平移不变分类(shift-invariant classification),因此也被称为“平移不变人工神经网络(Shift-Invariant Artificial Neural Networks, SIANN)”。
在过去的两年中,FireEye一直在尝试用深度学习架构来对恶意软件进行分类,以及如何预防它们。经过研究,研究人员发现与传统的基于ML的解决方案相比,深度学习架构具有惊人的准确性,同时还非常高效几乎不用人工干预。而且其他机构的研究人员也做了类似的研究,检测恶意软件的准确率高达96%。
你可能会疑惑,这些深度学习模型为什么在只关注原始字节而没有任何额外的结构、语义或句法上下文的情况下,它们怎么可能将良性软件与恶意软件区分开来?在这篇文章中,我们将通过分析FireEye的基于深度学习的恶意软件分类器来回答这个问题。
FireEye的深度学习分类器的介绍
1. FireEye的深度学习分类器可以仅使用Windows PE文件的非结构化字节成功识别恶意软件。
2. 基于导入的特性(如名称和函数调用指纹),会在分类器的所有级别学习的特性中发挥重要作用。
3. 与其他深度学习应用不同,深度学习分类器的低级特性通常就会捕获所有类的属性,FireEye的许多低级特性都专注于发现恶意软件中存在的特定的数据库数列(sequence)。
4. 分类器的端到端分析采用了与人工分析特性非常相似的原理,这足以保证它所捕获的信息人类可以理解。
在深入分析之前,让我们首先讨论一下CNN分类器对Windows PE文件字节做了什么处理。图1显示了分类器在从原始可执行数据“学习”时执行的高级操作:
1. CNN分类器是通过向可执行文件的原始字节表示开始学习的,一开始,它不包含任何结构;
2. 这些原始字节数列嵌入到一个高维空间,每个字节被替换为一个n维向量的值;
3. 该嵌入步骤允许CNN通过在n维嵌入空间内移动,从而学习离散字节之间的关系。例如,如果字节0xe0和0xe2可互换使用,那么CNN可以在嵌入空间中将这两个字节移动得更靠近,这样用一个字节替换另一个字节的成本就很小。接下来,就是执行嵌入的字节数列;
4. 执行卷积,当分类器在整个训练集中执行此操作时,卷积滤波器开始学习区分良性软件和恶意软件的某些数列的特性;
5. 简单来说,分类器会在嵌入的字节数列上滑动固定长度的窗口,卷积滤波器从这些窗口中学习重要的特性。一旦分类器扫描了整个数列,它就可以汇集数列每个区段中的最佳特性以传递到下一个级别。
6. 在实践中,卷积和池化操作以分层方式重复使用,目的就是将许多低级特性聚合成对分类更有用的较少数量的高级特性。最后,分类器使用这些汇集的聚合特性作为一个个参数输入到神经网络中,该神经网络就会将PE文件样本分类为良好软件或恶意软件。
![](http://imgtec.eetrend.com/sites/imgtec.eetrend.com/files/201901/blog/19551-39429-1.png)
我们在本文分析分类器的特定深度学习体系结构实际上有5个卷积层和最大池层,它们按照层次结构的方式排列,这允许分类器可以将较低层级学习来的复杂特性也组合到神经网络中。为了有效的训练这样一个深度神经网络,分类器必须将输入数列限制为一个固定长度,如果有的字节超出此长度,则要裁切多余的字节,如果有的字节太小,则要使用特殊填充符号填充,以达到规定的长度。而本文所讲的分类器选择了100KB的输入长度,不过FireEye的研究人员已经尝试过超过1MB的长度。分类器对超过1500万个Windows PE文件进行了CNN模型的检测,其中80%是良性软件,其余是恶意软件。对2018年6月至8月在野外观察到的近900万份PE文件进行检测时,分类器的准确率高达95.1%,F1得分为0.96,足见其准确性。
为了弄清楚分类器对恶意软件的理解程度,研究人员将依次检查架构的每个组件。在检查时,研究人员将使用从测试数据中获取的4000个PE文件的样本来检查,或者使用来自NotPetya,WannaCry和BadRabbit勒索软件系列的6个较小的工件集来检查特定特性。
(嵌入)空间中的字节
嵌入空间可以编码分类器已经了解的关于单个字节之间的关系,并且确定某些字节是否因为它们对分类器的决定具有隐含的重要性而被区别对待。
为了梳理出这些关系,研究人员将使用两种方法:
(1)MDS(multi-dimensional scaling),多维尺度分析,是一种降维算法,它试图找到一个映射将高维空间的数据映射到低维空间中,并且这个映射要尽可能的保持数据点之间的距离不变。
(2)DBSCAN聚类,基于密度的方法的特点是不依赖于距离,而是依赖于密度,从而克服基于距离的算法只能发现“球形”聚簇的缺点。DBSCAN的核心思想是从某个核心点出发,不断向密度可达的区域扩张,从而得到一个包含核心点和边界点的最大化区域,区域中任意两点密度相连。降维技术允许研究人员从高维嵌入空间移动到近似二维空间中,进而将其视觉化,同时仍然保留数据点的整体结构和组织。同时,聚类技术允许研究人员识别密集的点群,以及没有邻近点的离群点。离群点会被模型视为“特殊”数据点,因为只有密集的点集群可以互换使用。
![](http://imgtec.eetrend.com/sites/imgtec.eetrend.com/files/201901/blog/19551-39430-2.png)
在图2的左侧,是字节嵌入空间的二维表示,其中每个点集群都会被标记,并且离群点群被标记为-1。正如你所看到的,绝大多数字节都集中在一个点集群中(集群3),而其余三个点集群每个只有两个字节。虽然这些集群中没有明显的语义关系,但所包含的字节本身也很有趣,例如,集群0包含一些特殊填充字节,这些字节仅在文件小于固定长度时使用,而集群1包括ASCII字符‘r.’。
然而,更让研究人员感兴趣的是那些离群数据点,如图3右图所示,一些有趣的趋势开始出现。例如,0x0到0x6范围内的每个字节都存在,这些字节通常用于短的向前跳转,或者当寄存器用作指令参数(例如eax,ebx等)时。有趣的是,0x7和0x8在集群2中组合在一起,这可能表明它们在测试数据中可互换使用,这意味着0x7也可以理解为为寄存器参数。另一个明显的趋势是在一组离群值中存在一些ASCII字符,包括'\ n','A','e','s'和't'。最后,研究人员还会看到几个操作码,包括调用指令(0xe8),loop and loopne (0xe0, 0xe2),以及断点指令(0xcc)。
有了这些发现,研究人员就可以了解到分类器在低级特性中所发现的属性——ASCII文本和特定类型指令的使用。
低级特性的解读
首先是检查第一层卷积滤波器学到的低级特性,卷积是一种运算方法,卷积滤波器就是利用卷积运算的原理来构成滤波器,来提取特性。卷积运算决定了该滤波器的性能。在分类器的体系结构中,研究人员在该层使用了96个卷积滤波器,每个滤波器都学习了基本的构建块特性,这些特性将在后续层中不断进行组合,以获得有用的高级特性。一旦其中一个过滤器发现它可以在当前卷积中学习的字节模式时,它将产生一个大的激活值分类器就可以使用该值作为识别每个过滤器最有趣字节的方法。当然,由于分类器会检查原始字节数列,这只会告诉使用者要查看哪些文件偏移量,且其中的原始字节还无法解释为人类可以理解的内容。为此,研究人员会使用PEFile解析文件,并将BinaryNinja的反汇编程序应用于可执行区段,以便更容易的识别每个过滤器的学习特性中的常见模式。
由于需要检查大量过滤器,因此研究人员可以通过了解在4000个Windows PE文件样本中哪些过滤器具有最强的激活以及这些激活发生在这些文件中的何处来缩小搜索范围。图3中显示了4000个样本数据集中100个最强激活的位置。这代表了一些很有趣的趋势,其中一些趋势是能预测到的。除此之外,研究人员还有一些更惊奇的发现。首先,分类器架构中,该级别的大多数激活都发生在'.text'区段,该区段通常包含可执行代码。当分类器开始比较恶意软件和良性软件子集之间的'.text'区段时,恶意软件集的激活明显更多,这意味着即使在这么低的级别,似乎某些过滤器已经发现了位于恶意软件中的特定字节数列。此外,研究人员还看到了'UNKNOWN'区段,该区段是在PE文件的有效范围之外发生的激活,这意味着在恶意软件组中发生的激活比在良性软件中激活的更多。这就很有意思了,因为许多混淆和逃脱技术都依赖于将数据放置在非标准位置(例如,将PE文件相互嵌入)。
![](http://imgtec.eetrend.com/sites/imgtec.eetrend.com/files/201901/blog/19551-39431-3.png)
研究人员还可以通过绘制4000个PE文件中每个过滤器的前100个激活来检查卷积滤波器之间的激活趋势,如图4所示。其中一些过滤器与发现的特性都会体现在恶意软件样本中。在这种情况下,过滤器57的激活几乎只发生在恶意软件集中,因此这将是一个重要的过滤器。从过滤器激活的分布中获得的另一个主要结论是,该分布趋势很集中,在分类器的体系结构中,只有两个过滤器处理该级别的大多数激活。事实上,在分析的4000个文件集中,一些过滤器根本没有被激活。
![](http://imgtec.eetrend.com/sites/imgtec.eetrend.com/files/201901/blog/19551-39432-4.png)
现在我们已经确定了最有趣和最活跃的过滤器,分类器可以反汇编它们激活位置周围的代码。特别是,过滤器83和57,这两个过滤器在研究人员的基于激活值的模型中都是重要的过滤器,图5显示了这些过滤器在几个勒索软件工件中的反汇编结果。
在过滤器83中,当研究人员查看字节的ASCII编码时,激活的趋势变得非常清楚,这表明过滤器已经学会了检测某些类型的导入。如果研究人员仔细观察激活字符(用'*'表示),它们总是包括像'r','s','t'和'e'这样的字符,在嵌入分析期间,所有这些字符都被识别为离群值或在它们自己独特的集群中发现。在过滤器57中,当研究人员看到反汇编的结果时,可以看到一个清晰的攻击模式,其中过滤器激活包含多个推送指令和调用指令的数列,这本质上是用多个参数识别函数调用。
在某些时候,研究人员可以将过滤器83和57视为检测相同行为的两个角度,过滤器83检测是否有恶意导入,而57检测这些导入(即通过指纹识别参数的数量和使用)的具体用途。由于卷积滤波器的独立性质,导入内容与其用途之间的关系(例如,哪些导入内容在哪里使用)会丢失,并且分类器将这些视为两个完全独立的特性。
![](http://imgtec.eetrend.com/sites/imgtec.eetrend.com/files/201901/blog/19551-39433-5.png)
除了上面描述的与导入内容相关的特性之外,研究人员在分析中还确定了一些过滤器,这些过滤器对包含利用代码的函数(如DoublePulsar或EternalBlue)中的特定字节数列进行了锁定分析。例如,过滤器94在分析的BadRabbit工件的EternalRomance漏洞利用代码的区段上激活。请注意,这些低级别过滤器不一定会检测特定的漏洞利用活动,而是在同一函数中对周围代码中的字节数列进行激活。
这些结果表明分类器已经学习了一些与ASCII文本和指令用法相关的非常具体的字节数列,这些字节数列与导入代码中的导入、函数调用和工件有关。这一发现令人惊讶,因为在其他机器学习领域,例如图像领域,低级过滤器通常会学习跨所有类的通用的、可重用的特性。
端到端特性分析
虽然CNN分类器的底层似乎已经学会了特定的字节数列,但更大的问题是,分类器的深度分析和复杂性(即层的数量)是否会帮助分析人员在层次结构向上移动时提取更有意义的属性?为了回答这个问题,研究人员必须检查分类器的决策和每个输入字节之间的端到端关系。这允许研究人员直接评估输入数列中的每个字节(或其片段),并查看分类器是依靠什么来决策所评估的是恶意软件或良性软件。为了完成这种端到端分析,研究人员利用了Lundberg和Lee开发的SHapley Additive exPlanations(SHAP)框架,SHAP值(SHapley Additive exPlanations)可以分解预测以显示每个特性的影响,换句话说,每个SHAP值测量我们模型中每个特性对每个预测的正面或负面贡献的程度。另外,研究人员还使用了GradientSHAP方法,该方法结合了许多技术来精确识别每个输入字节的贡献,正SHAP值表示恶意软件的特性,负SHAP值表示良性软件的特性。
在将GradientSHAP方法应用于勒索软件数据集之后,研究人员注意到许多最重要的端到端特性与他们在分类器底层发现的特定字节数列的类型没有直接关系。相反,许多端到端特性与传统ML模型中手工检测特性密切相关。例如,对勒索软件样本进行端到端分析后,研究人员可以在PE标头的校验和区段中识别出了几个恶意特性,这是传统ML模型中常用的特性。其他值得注意的端到端特性包括是否存在与用于签署PE文件的证书相关的某些目录信息,区段表中定义PE文件各个区段属性的异常,以及特定的导入,这些异常特性(例如,GetProcAddress和VirtualAlloc)通常会由恶意软件使用。
图6显示了WannaCry勒索软件工件的文件偏移量中SHAP值的分布,此示例中发现的许多最重要的恶意特性都集中在PE标头结构中,包括前面提到的校验和与目录相关的特性。然而,该示例中一个特别有趣的观察结果是它包含嵌入其中的另一个PE文件,CNN发现了与此相关的两个端到端特性。首先,它确定了区段表的一个区域,表示“.data”区段的虚拟大小比该区段的规定物理大小大10倍。其次,它在嵌入式PE文件内发现了恶意的导入和导出。总的来说,这些结果表明,FireEye的分类器的深度学习似乎有助于它学习更多的抽象特性,并超越了我们在底层激活中观察到的特定字节数列。
![](http://imgtec.eetrend.com/sites/imgtec.eetrend.com/files/201901/blog/19551-39434-6.png)
总结
在这篇文章中,我们深入分析了FireEye分类器基于字节的深度学习的内部工作原理,以便了解它以及其他类似的深度学习分类器是如何从其非结构化原始字节中学习恶意软件内容的。通过我们的分析,我们了解了分类器的操作过程和相关特性:
1. 导入特性:导入特性可以让分类器的所有级别都学习到各个级别所收集的恶意特性。研究人员在嵌入层,低级卷积特性和端到端特性中都发现了基于ASCII的导入特性的证据。
2. 低级指令特性: CNN分类器的底层的几个特性可以捕获具有特定行为的指令数列,例如特定类型的函数调用或围绕某些类型的漏洞利用的代码。在许多情况下,这些特性主要与恶意软件相关联,这与CNN在其他领域(如图像分类)的典型用法相反,在图像分类中,低级特性会捕获数据的一般特性。此外,这些低级特性并未出现在恶意的端到端特性中。
3. 端到端特性:也许我们分析的最有趣的结果是,许多重要的恶意的端到端特性与传统ML分类器中常见的手工检测特性密切相关。例如证书是否存在、是否有明显错误的校验等特性与我们发现的低层特性没有明显的相似之处。相反, CNN分类器的深度学习和复杂性似乎在特定字节数列的分析特性中起着关键作用。
很明显,深度学习可以在为预防最新恶意软件供了一条更有效的道路。与此同时,为了创建一个可行的解决方案来解决本文中讨论的缺陷,需要进行重大改进。下一步最重要的是改进体系结构,以包含关于可执行文件的结构、语义和语法上下文的更多信息,而不是将其视为非结构化字节数列。通过将这种专门的领域知识直接添加到深度学习体系结构中,分类器就可以专注于学习每个上下文的相关特性,推断其相关关系,并创建更强大的端到端特性。
本文翻译自:https://www.fireeye.com/blog/threat-research/2018/12/what-are-deep-neura...
转自:嘶吼
原文地址:http://www.4hou.com/web/15267.html