工业落地-kaspersky《Machine Learning for Malware Detection》解析
Machine Learning for Malware Detection
本文总结了 kaspersky 利用机器学习为客户建立高级保护的丰富经验。
一、基本方法检测恶意软件
一个高效、健壮、可扩展的恶意软件识别模块是每个网络安全产品的关键组成部分。恶意软件识别模块会根据其在该对象上所收集的数据来决定该对象是否构成威胁。这些数据可以在不同的阶段进行收集:
需要有代表性的大型数据集
必须强调这种方法的数据驱动特性。一个创建的模型在很大程度上依赖于它在训练阶段看到的数据,以确定哪些特征与预测正确的标签有统计关联。让我们来看看为什么制作一个具有代表性的数据集如此重要。
训练的模型必须是可解释的
目前使用的大多数模型家族,如深度神经网络,都被称为黑盒模型。黑盒子模型被给予输入X,它们将通过一个难以被人类解释的复杂操作序列产生Y。这可能会在现实生活中的应用程序中带来一个问题。例如,当出现错误警报时,我们想理解为什么会发生它,我们会问这是训练集还是模型本身的问题。模型的可解释性决定了我们管理它、评估其质量和纠正其操作的容易程度。
假阳性率必须非常低
当算法将良性文件错误地标记恶意标签时,就会发生误报。我们的目标是使假阳性率尽可能低,或为零。这在机器学习应用程序中并不常见。这是很重要的,因为即使在一百万个良性文件中出现一个误报,也会给用户带来严重的后果。这是复杂的事实,有许多干净的文件在世界上,他们不断出现。
为了解决这个问题,重要的是要对机器学习模型和指标施加高要求,并在训练期间进行优化,并明确关注低假阳性率(FPR)【FP/(FP+TN)】模型。
这还不够,因为之前看不见的新良性文件可能会被错误检测到。我们考虑到这一点,并实现了一个灵活的模型设计,允许我们动态地修复假阳性,而不需要完全重新训练模型。这些示例在我们的执行前和执行后的模型中实现,这将在以下章节中描述。
算法必须允许我们快速调整它们以适应恶意软件作者的反击
在恶意软件检测领域之外,机器学习算法经常在固定数据分布的假设下工作,这意味着它不随时间变化。当我们有一个足够大的训练集时,我们可以训练模型,以便它将有效地推理测试集中的任何新样本。随着时间的推移,该模型将继续按预期进行工作。
在将机器学习应用于恶意软件检测后,我们必须面对我们的数据分布没有固定的事实:
- 活跃的对手(恶意软件编写者)不断努力避免检测和发布新版本的恶意软件文件,这与在培训阶段看到的文件有显著不同。
- 成千上万的软件公司生产的新型良性可执行文件与以前已知的可执行文件显著不同。在训练集中缺乏关于这些类型的数据,但该模型需要识别出它们是良性的。
这就导致了数据分布的严重变化,并提出了在任何机器学习实现中检测率随着时间的推移而下降的问题。在其反恶意软件解决方案中实现机器学习的网络安全供应商面临着这个问题,并需要克服它。该体系结构需要灵活,并且必须允许在再训练(retrain)之间“动态”更新模型。供应商还必须有有效的流程来收集和标记新样本,丰富训练数据集和定期的再训练模型。
二、卡巴斯基实验室机器学习应用
上述真实世界恶意软件检测的特性使机器学习技术的直接应用成为一项具有挑战性的任务。在将机器学习方法应用于信息安全应用方面,卡巴斯基实验室拥有近十年的经验。
在执行前检测新的恶意软件的相似性哈希
在杀毒行业的初期,计算机上的恶意软件检测是基于启发式特征,识别特定的恶意软件文件:
- 代码段
- 代码片段或整个文件的哈希值
- 文件属性
- 以及这些特征的组合
我们的主要目标是创建一个可靠的恶意文件指纹——一个功能的组合,可以快速检查。在此之前,这个工作流需要通过仔细选择指示恶意软件的代表性字节序列或其他特征来手动创建检测规则。在检测过程中,产品中的抗病毒引擎针对存储在防病毒数据库中的已知恶意软件指纹,检查文件中是否存在恶意软件指纹。
然而,恶意软件编写者发明了像服务器端多态性这样的技术。这导致每天都有成千十万的恶意样本被发现。同时,所使用的指纹对文件中的微小变化也很敏感。现有恶意软件的微小变化使它失去了雷达注意。前一种方法很快就变得无效了,因为:
- 手动创建检测规则无法跟上新出现的恶意软件流。
- 针对已知恶意软件库检查每个文件的指纹意味着,在分析人员手动创建检测规则之前,您才能检测到新的恶意软件。
我们感兴趣的是那些对文件中的小变化具有鲁棒性的特性。这些特性将检测到恶意软件的新修改,但不需要更多的资源来进行计算。性能和可伸缩性是反恶意软件引擎处理的第一阶段的关键优先事项。
为了解决这个问题,我们专注于提取以下特性:
- 快速计算,如从文件字节内容或代码反汇编导出的统计数据
- 直接从可执行文件的结构中检索,比如文件格式描述
使用这些数据,我们计算了一种特定类型的哈希函数,称为局部敏感哈希(LSH)。
ssdeep, TLSN 局部哈希
两个几乎相同的文件的常规加密哈希和两个非常不同的文件的哈希差异一样大。文件的相似性和哈希值之间没有联系。然而,几乎相同的文件的LSHs映射到相同的二进制桶——它们的LSHs非常相似——而且概率非常高。两个不同文件的LSHs有很大差异。
LSH的基本思想是:将原始数据空间中的两个相邻数据点通过相同的映射或投影变换(projection)后,这两个数据点在新的数据空间中仍然相邻的概率很大,而不相邻的数据点被映射到同一个桶的概率很小。
- https://colobu.com/2018/08/16/locality-sensitive-hashing/
但我们走得更远。LSH的计算是无监督的。它没有考虑到我们对每个样本都是恶意软件或良性的额外知识。
有一个相似和非相似对象的数据集,我们通过引入一个训练阶段来增强了这种方法。我们实现了一种相似性哈希方法。它类似于LSH,但它是==有监督==的,并且能够利用关于相似和非相似对象对的信息。在这种情况下:
- 我们的训练数据X将是一对文件特征表示[X1, X2]
- Y将是一个可以告诉我们这些物体在语义上是否真的相似的标签。
- 在训练过程中,该算法拟合哈希映射h(X)的参数,以最大化训练集中的对数,其中h(X1)和h(X2)对于相似的对象是相同的,而对于其他的对象是不同的。
该算法正在应用于可执行文件特性,它提供了具有有用检测功能的特定相似性哈希映射。事实上,我们训练了这种映射的几个版本,它们对不同特征集的局部变化的敏感性不同。例如,一个版本的相似性散列映射可以更专注于捕获可执行文件结构,而较少关注实际内容。另一种方法可能更专注于捕获文件中的ascii字符串。
这就抓住了这样一种观点,即不同的特性子集可能或多或少可以区分不同类型的恶意软件文件。对于其中一个,文件内容统计数据可能显示未知恶意包装器的存在。对于其他方面,关于潜在行为的最重要信息集中在表示已使用的OSAPI、已创建的文件名、已访问的url或其他特性子集的字符串中。为了更精确的产品检测,将相似度哈希算法的结果与其他基于机器学习的检测方法相结合。
基于局部敏感哈希(有监督)+ 决策树集成的用户计算机两阶段预执行检测
为了分析在预执行阶段的文件,我们的产品将相似性哈希方法与其他训练过的算法结合在一个两阶段的方案中。为了训练这个模型,我们使用了大量我们知道是恶意软件和良性的文件。
两阶段分析设计解决了减少用户系统的==计算负载==和==防止误报==的问题。一些对检测很重要的文件特性需要更大的计算资源来计算它们。这些功能被称为“重的”。为了避免对所有扫描文件的计算,我们引入了一个称为预检测的初步阶段。当使用“轻量级”特性分析文件,并在系统上没有大量负荷的情况下提取文件时,就会发生==预检测==。在许多情况下,预检测为我们提供了足够的信息,以知道一个文件是否是良性的,并结束了文件扫描。有时它甚至会检测到一个文件是恶意软件。如果第一阶段不够,则文件将进入第二阶段的分析,即提取“重”特征以进行精确检测。
在我们的产品中,两阶段分析的工作方式如下。在预检测阶段,对扫描文件的轻量级特征计算学习到的相似度哈希映射。然后,检查是否有其他文件具有相同的哈希映射,以及它们是恶意软件还是良性的。一组具有类似哈希映射值的文件被称为哈希桶。根据扫描文件所属的散列桶,可能会出现以下结果:
在一个简单的区域案例中,文件落入一个只包含一种对象的桶中:恶意软件或良性的。如果一个文件落入一个“纯恶意软件桶”,我们会检测到它是恶意软件。如果它落入一个“纯良性的桶”,我们不会扫描它更深。在这两种情况下,我们都不提取任何新的“重”特性。
在硬区域中,哈希桶同时包含恶意软件和良性文件。这是系统唯一可以从扫描文件中提取“重”特征以进行精确检测的情况。对于每个硬区域,都有一个单独的特定区域的分类器训练。目前,我们使用决策树集成或基于“重”特征的相似性哈希,这取决于哪个队硬区域更有效。
对象空间的分割:
使用相似性散列映射创建的对象空间的分割的示意图表示。为简单起见,该插图只有两个维度。每个单元格的一个索引对应于特定的相似度哈希映射值。网格中的每个单元格都说明了一个具有相同相似性哈希映射值的对象区域,也称为哈希桶。点颜色:恶意(红色)和良性/未知(绿色)。有两种选项可用的:将一个区域的散列添加到恶意软件数据库(简单区域)中,或者将其作为两阶段检测器的第一部分,并与特定区域的分类器(硬区域)结合使用。
在现实中,有一些困难的区域不适合用这种两阶段的技术进行进一步的分析,因为它们包含了太多流行的良性文件。用这种方法处理它们会产生假阳性和性能下降的高风险。对于这种情况,我们不训练特定区域的分类器,也不通过该模型扫描该区域中的文件。为了在这样的区域进行正确的分析,我们使用了其他的检测技术。
预检测阶段的实现大大减少了在第二步中被大量扫描的文件的数量。这个过程提高了性能,因为在预检测阶段通过相似哈希映射查找可以快速完成。
我们的两阶段设计也降低了假阳性的风险:
- 在第一个(预检测)阶段,我们不能在假阳性风险较高的区域使用特定区域的分类器进行检测。正因为如此,传递到第二阶段的对象的分布偏向于“恶意软件”类。这也降低了假阳性率。
- 在第二阶段,每个硬区域的分类器只从一个桶上对恶意软件进行训练,但在训练集的所有桶中可用的所有干净对象上。这使得区域分类器能够更精确地检测特定硬区域桶的恶意软件。当模型在具有真实数据的产品中工作时,它还可以防止任何意外的假阳性。
两阶段模型的可解释性来自于数据库中的每个散列都与训练中的一些恶意软件样本子集相关联。整个模型可以通过添加检测来适应一个新的恶意软件流,包括散列映射和一个以前未观察到的区域的树集成模型。这允许我们撤销和重新训练特定区域的分类器,而不显著降低整个产品的检测率。如果没有这个,我们将需要对整个模型重新培训所有我们知道的恶意软件,我们想要做的每一个改变。话虽如此,两阶段恶意软件检测适用于在介绍中讨论的机器学习的细节。
三、针对罕见攻击的深度学习
通常,当恶意和良性样本在训练集中大量表示时,机器学习会面对任务。但是有些攻击是如此罕见,以至于我们只有一个恶意软件进行训练的例子。这是针对性高调的有针对性攻击的典型情况。在这种情况下,我们使用了一个非常特定的基于深度学习的模型架构。我们将这种方法称为exemplar network( ExNet)。
这里的想法是,我们训练模型来构建输入特征的紧凑表示。然后,我们使用它们来同时训练多个单范例的分类器(per-exemplar classifiers)——这些都是检测特定类型的恶意软件的算法。深度学习允许我们将这些多个步骤(对象特征提取、紧凑的特征表示和局部的,或每个范例的模型创建)结合到一个神经网络管道中,它可以提取各种类型的恶意软件的鉴别特征。
该模型可以有效地推广关于单个恶意软件样本和大量干净样本收集的知识。然后,它可以检测到相应的恶意软件的新修改。
四、在执行后行为检测中的深度学习
前面描述的方法是在静态分析的框架中考虑的,即在真实用户环境中执行对象之前提取和分析对象描述。
执行阶段的静态分析有许多显著的优势。其主要优点是它对用户来说是安全的。一个对象可以在它开始作用于真实用户的机器之前被检测到。但它面临着高级加密、混淆技术以及使用各种高级脚本语言、容器和无文件攻击场景的问题。这些情况都是当执行后的行为检测开始发挥作用的情况。
我们还使用深度学习方法来解决行为检测的任务。在执行后阶段,我们正在使用威胁行为引擎提供的行为日志。行为日志是在进程执行过程中发生的系统事件的序列,以及相应的参数。为了检测观察到的日志数据中的恶意活动,我们的模型将得到的事件序列压缩为一组二进制向量。然后,它训练一个深度神经网络来区分干净的和恶意的日志。
日志的压缩阶段包括以下几个步骤:
将该日志转换为一个二部行为图。此图包含两种类型的顶点:事件和参数。在每个事件和参数之间绘制边,它们一起出现在日志中的同一行中。这样的图表示比初始的原始数据要紧凑得多。它对跟踪同一多处理程序的不同运行或分析过程的行为混淆所导致的任何行排列保持鲁棒性
之后,我们将自动从该图中提取特定的子图或行为模式。每个模式都包含与进程的特定活动相关的事件和相邻参数的子集,如网络通信、文件系统探索、系统寄存器的修改等
我们将每个“行为模式”压缩为一个稀疏的二进制向量。此向量的每个组件负责在模板中包含一个特定的事件或参数的令牌(与web、文件和其他类型的活动相关)。
训练后的深度神经网络将行为模式的稀疏二进制向量转换为称为模式嵌入的紧凑表示。然后将它们组合成一个单个向量,或进行日志嵌入
最后,在日志嵌入的基础上,网络预测了日志的可疑性。
所使用的神经网络的主要特征是所有的权值都是正的,所有的激活函数都是单调的。这些特性为我们提供了许多重要的优势:
- 在处理日志中的新行时,我们的模型的怀疑分数输出只随着时间的推移而增长。因此,恶意软件不能通过与它的主有效负载并行地执行额外的噪声或“干净的”活动来逃避检测。
- 由于模型的输出在时间上是稳定的,我们可能会免受由于在扫描干净日志时的预测波动而导致的最终错误警报。
- 在单调空间中处理日志样本,允许我们自动选择导致检测的事件,并更方便地管理假警报
这样的方法使我们能够训练一个能够使用高级可解释的行为概念进行操作的深度学习模型。这种方法可以安全地应用于整个用户环境的多样性,并在其架构中集成了假告警修复能力。总之,所有这些都为我们提供了一种对行为检测最复杂的现代威胁的有力手段。
五、基础设施中的应用(Malware Hunter)
从有效处理卡巴斯基实验室的恶意软件流到维护大规模检测算法,机器学习在建立适当的实验室基础设施中发挥着同样重要的作用。
5.1 聚类传入的对象流
每天都有成千上万的样本进入卡巴斯基实验室,同时人工对新型样本进行注释的高昂成本,减少分析师需要查看的数据量成为一项至关重要的任务。使用有效的聚类算法,我们可以从难以忍受的独立的未知文件数量增加到合理数量的对象组。这些对象组的部分将根据其中已注释的对象自动处理。
所有最近收到的传入文件都通过我们的实验室恶意软件检测技术进行分析,包括执行前和执行后。我们的目标是标记尽可能多的对象,但有些对象仍然未分类。我们想给它们贴上标签。为此,所有的对象,包括已标记的对象,都由多个特征提取器进行处理。然后,根据文件类型,它们通过几种聚类算法(例如k-means和dbscan)一起传递。这将产生类似的对象组。
在本文的这一点上,我们将面对四种不同类型的具有未知文件的结果集群:
- 包含恶意软件和未知文件的集群;
- 包含干净和未知文件的集群;
- 包含恶意软件、干净和未知文件的集群;
- 仅包含未知文件的集群。
对于类型1-3簇中的对象,我们使用额外的机器学习算法,如贝叶斯网络(belief propagation),来验证未知样本与分类样本的相似性。在某些情况下,这甚至在第3类集群中也是有效的。这使我们能够自动标记未知文件,只为人类留下4型和部分3型的集群。这导致了每天所需的人类注释的急剧减少。
蒸馏工艺:包装更新内容
我们在实验室中检测恶意软件的方式不同于针对用户产品的最佳算法。一些最强大的分类模型需要大量的资源,如CPU/GPU的时间和内存,以及昂贵的特性提取器。
例如,由于大多数现代恶意软件编写者使用高级包装器和混淆器来隐藏有效负载功能,机器学习模型确实受益于使用具有高级行为日志的实验室内沙箱的执行日志。同时,在用户的机器上的预执行阶段收集这类日志的计算量可能会很高。它可能会导致显著的系统性能下降。
对于加壳的恶意样本,需要沙箱分析,在用户终端
在实验室中保存和运行那些“重型”模型更有效。一旦我们知道一个特定的文件是恶意软件,我们就会使用我们从模型中获得的知识来训练将在我们的产品中工作的轻量级分类器(to 用户)。
在机器学习中,这个过程被称为蒸馏。我们用它来教我们的产品检测新的恶意软件:
- 在我们的实验室中,我们首先从标记的文件中提取一些耗时的特征,并对它们训练一个“沉重的”在实验室内的模型。
- 我们取一个未知文件集群,并使用我们的“重”实验室模型来对它们进行标签。
- 然后,我们使用新标记的文件来扩充轻量级分类模型的训练集。
- 我们向用户的产品提供了这个轻量级的模型。
蒸馏使我们能够有效地输出我们的知识的新的和未知的威胁给我们的用户。
总结
将常规任务传递给算法会给我们留下更多的时间来研究和创建。这使我们能够为客户提供更好的保护。通过我们的努力、失败和胜利,我们已经了解到什么对于让机器学习对恶意软件检测产生它的卓越影响是重要的。
亮点:
有正确的数据:这是机器学习的燃料。这些数据必须具有代表性,与当前的恶意软件环境相关,并在需要时正确标记。我们成为了在提取和准备数据以及训练我们的算法方面的专家。我们用数十亿个文件样本进行了有效的收集,以增强机器学习的能力。
了解理论机器学习以及如何将其应用于网络安全。我们了解机器学习是如何工作的,并跟踪该领域出现的最先进的方法。另一方面,我们也是网络安全方面的专家,我们认识到每一种创新的理论方法给网络安全实践带来的价值。
了解用户的需求,并成为将机器学习实现到帮助用户满足其实际需求的产品中的关键。我们使机器学习有效和安全地工作。我们建立了网络安全市场所需要的创新解决方案
建立一个足够的用户基础:这引入了“群众”检测质量的力量,并给我们需要的反馈,告诉我们是对是错。
保持检测方法的多层协同作用。只要当今的先进威胁攻击载体如此多样化,网络安全解决方案就应该提供多层的保护。在我们的产品中,基于机器学习的检测与其他类型的检测协同工作,以一种多层的现代网络安全保护方法进行工作。