恶意软件检测中的行为分析

 

长期以来,恶意软件一直是对信息安全的主要威胁。分析和防御这种类型的攻击的方法各不相同。通常有两种方法:静态和动态分析。

静态分析的目的是寻找文件或进程内存中的恶意内容模式。这些可能是字符串、编码或压缩数据的片段、编译代码的序列。不仅可以搜索单个模式,还可以搜索这些模式与附加条件的组合(例如,绑定到一个签名位置,检查彼此位置的相对距离)。

动态分析是对一个程序的行为进行分析。值得注意的是,该程序可以在所谓的仿真模式下运行。它应该能够安全地解释行动,而不会对操作系统造成损害。另一个选择是在虚拟环境(沙盒)中运行该程序。在这种情况下,在系统上会有一个公平的执行动作,然后对调用进行记录。记录的详细程度是观察的深度和分析系统的性能之间的一种平衡。其输出是程序在操作系统上的行动日志(行为的痕迹),可以进一步分析。

动态或行为分析有一个关键的优势,即无论攻击者试图混淆代码和恶意意图,恶意活动都会被病毒分析人员发现。将恶意软件检测任务减少到行动分析,使我们能够假设高级恶意软件检测算法的稳健性。而且,由于分析环境的初始状态相同(虚拟服务器状态投出),行为的可重复性简化了合法和恶意行为的分类任务。

通常情况下,行为分析的方法是基于规则集的。专家分析被转移到签名,在此基础上,恶意软件和文件检测工具得出结论。然而,在这种情况下会出现一个问题:只有严格遵守书面规则的攻击才能被计算在内,而不符合这些条件但仍然是恶意的攻击则可能被忽略掉。当同一恶意软件发生变化时,也会出现同样的问题。这可以通过使用更柔和的触发标准来解决,即可以写一个更通用的规则,或者在每个恶意软件下使用大量的规则。在第一种情况下,我们有可能出现许多误报,而第二种情况则需要严重的时间承诺,这可能导致必要的更新滞后。

有必要将我们已经掌握的知识扩展到其他类似的案例。也就是说,那些我们以前没有遇到过或没有用规则处理过的案例,但根据某些特征的相似性,我们可以得出结论,该活动可能是恶意的。这就是机器学习算法发挥作用的地方。

ML模型,当训练正确时,具有可推广性。这意味着受过训练的模型不只是学会了它所训练的所有例子,而是能够根据训练样本的模式对新的例子做出决定。

然而,为了使可推广性发挥作用,在训练阶段必须考虑两个主要因素:

  • 特征集应该尽可能完整(以便模型能够看到尽可能多的模式,从而更好地将其知识扩展到新的例子),但不能是多余的(以便不存储和处理那些对模型不携带有用信息的特征)。
  • 数据集应该是有代表性的、平衡的和定期更新的。

由于我们能够收集到所需的数据量,并且有机器学习可以扩展现有解决方案的假设,我们决定做这项研究:生成一组属性,对它们进行模型训练,并达到相信模型关于文件恶意程度的结论的准确性。

专家知识如何带入机器学习模型

在恶意软件分析的背景下,原始数据是文件本身,而中间数据是由它们产生的辅助进程。这些进程又会进行系统调用。这些调用序列是我们需要转换为特征集的数据。

数据集的创建从专家方面开始。专家们认为在恶意软件检测方面应该是有意义的属性被选中。所有的属性都可以通过系统调用还原成n-grams的形式。然后用模型来估计哪些属性对检测贡献最大,舍弃多余的属性,得到数据集的最终版本。

源数据:

{"count":1,"PID":"764","Method":"NtQuerySystemInformation","unixtime":"1639557419.628073","TID":"788","plugin":"syscall","PPID":"416","Others":"REST: ,Module=\"nt\",vCPU=1,CR3=0x174DB000,Syscall=51,NArgs=4,SystemInformationClass=0x53,SystemInformation=0x23BAD0,SystemInformationLength=0x10,ReturnLength=0x0","ProcessName":"windows\\system32\\svchost.exe"}  

{"Key":"\\registry\\machine","GraphKey":"\\REGISTRY\\MACHINE","count":1,"plugin":"regmon","Method":"NtQueryKey","unixtime":"1639557419.752278","TID":"3420","ProcessName":"users\\john\\desktop\\e95b20e76110cb9e3ecf0410441e40fd.exe","PPID":"1324","PID":"616"}  

{"count":1,"PID":"616","Method":"NtQueryKey","unixtime":"1639557419.752278","TID":"3420","plugin":"syscall","PPID":"1324","Others":"REST: ,Module=\"nt\",vCPU=0,CR3=0x4B7BF000,Syscall=19,NArgs=5,KeyHandle=0x1F8,KeyInformationClass=0x7,KeyInformation=0x20CD88,Length=0x4,ResultLength=0x20CD98","ProcessName":"users\\john\\desktop\\e95b20e76110cb9e3ecf0410441e40fd.exe"}  

中间数据(序列):

syscall_NtQuerySystemInformation*regmon_NtQueryKey*syscall_NtQueryKey

模型的知识是如何积累的,这个过程是如何变化的,以及为什么要及时停止数据的积累

如上所述,对数据的基本要求是代表性、平衡性和定期更新。让我们在恶意文件的行为分析中阐明这三点:

1.         代表性。数据的属性分布应接近于现实生活中的分布。

2.         平衡性。训练模型的原始数据带有 "合法 "或 "恶意 "的标签,这些信息被传递给模型,也就是说,当恶意例子的数量接近于纯粹的例子时,我们就解决了这个问题。

3.         定期更新性。这在很大程度上与代表性有关。由于恶意软件文件的趋势在不断变化,因此有必要定期更新模型的知识。

考虑到上述所有要求,建立了以下数据积累过程:

1.         数据分为两种类型--主要数据流和参考案例。基准由专家手工检查,并保证其标记的正确性。他们需要通过增加基准来验证模型和管理训练样本。主线是用规则和自动检查来标记的。他们需要用各种现实生活中的例子来充实样本。

2.         所有的基准都会被立即添加到训练样本中。

3.         此外,一些来自流程的初始数据集被添加到训练所需的数据量中。所需的数据量在这里被理解为训练样本被证明是足够完整(在数据多样性方面)和有代表性的数量。由于基准是由专家手动测试的,因此不可能仅从基准中收集几万个,因此需要从数据流中增加数据种类。

4.         定期在新的数据流中测试模型。

5.         首先要保证基准例子的准确性,如果出现矛盾,则优先考虑基准数据,它们在任何情况下都被保留下来。

随着时间的推移,从数据流中积累了足够的数据,于是需要取消基于错误的自动积累,而采用更加可控的训练样本:

1.         到目前为止,积累的训练样本是固定的;

2.         来自数据流的数据现在只用于测试模型,没有实例被添加到训练样本中;

3.          只有当参考实例集被更新时,训练样本才能被更新。

因此,我们能够实现以下目标:

1.         验证了训练和固定的模型可以对数据漂移有足够的鲁棒性;

2.         监控每一个添加到训练样本中的新实例(基准由专家手动检查);

3.          我们可以跟踪每个变化,并保证在基准数据集上的准确性。

如何确保模型的质量随着每次更新而提高

经过上述的数据积累过程,可能会出现一个合理的问题:为什么我们如此肯定每次更新都能改善模型?

答案仍然是同一个基准样本。我们相信这是最正确的,因为这个样本的例子是由专家手动测试和标记的,每次更新时,我们首先要检查的是,我们仍然保证这个样本的100%准确性。在 "in the wild"进行的测试证实了准确性正在提高。

这是通过清除训练样本中不一致的参考数据来实现的。所谓矛盾的数据,我们指的是从流中积累的例子,这些例子在矢量距离上与基准样本的痕迹足够接近,但却有相反的标签。

我们的实验表明,即使从数据流的角度来看,这样的例子也是离群的,因为为了提高基准样本的准确度,从训练样本中删除这些例子后,数据流的准确度也会提高。

ML方法和关联形式的行为检测器的互补性

ML模型在与相关性形式的行为检测相结合时表现非常好。需要注意的是,它是结合在一起的,因为在需要用检测类似和相关事件来扩展解决方案的情况下,该模型的通用性很好,但在需要在明确了解什么是恶意软件的规则和标准的情况下进行检测时,就不适用了。

ML方法能够真正扩展解决方案的例子是:

- 异常的子进程链。本身,大量的分支链是一种合法现象。但是节点数量的异常、嵌套程度、某些特定进程名称的重复出现或不重复出现都会被模型注意到,而人们并不喜欢提前发现这种东西是恶意的。

- 默认调用参数的非标准值。在大多数情况下,分析家对有意义的函数参数感兴趣,在其中寻找恶意的东西。其他的参数,粗略地说是默认值,它们其实并不感兴趣。但是在某个时刻,它发生了,所以第六个值出现了,而不是,比如,五个默认值。分析师可能没有猜到这是可能的,但是模型已经注意到了这一点。

- 非典型的函数调用序列。这是一种情况,当每个函数在孤立的情况下并不做任何恶意的事情。它也没有做任何恶意的事情。但恰好它们的序列在合法软件中没有发现。分析师需要巨大的经验来发现这种模式。但该模型注意到了(而且不止一个),解决了通过一个实际上并不打算作为恶意指标的特征进行分类的问题。

基于签名的行为分析正是重要的例子:

- 恶意行为的单一调用对某一特定组件的使用。一个系统以不同程度的变化使用数百个对象。在其他一百万个对象的背景下,不太可能捕捉到一个对象的使用--异常颗粒度仍然很低。

- 主动的威胁模型检测。决定对系统中某些对象的某些行动至少有一次是不可接受的。模型第一次可能不理解这是一个重要的现象,在类似的东西的分类阶段会有出错或不确定的决定的机会。

- 行动顺序的模糊化。例如,你可能知道你需要按照一定的顺序做3-4个动作。这中间有什么并不重要。如果你在3-4个关键动作之间抛出垃圾动作,就会混淆模型,做出的决定就会不正确。而特征数量的维度使得它不可能通过存储所有的调用序列组合,而不仅仅是总数来说明这种混乱。

猜你喜欢

转载自blog.csdn.net/ptsecurity/article/details/131318912