由于本人权限不够,只能将翻译的文章直接粘贴过来,不方便之处请大家谅解,还有翻译不妥和错误的请大家不吝赐教 利用压缩来分析蠕虫病毒和网络数据 摘要 网络蠕虫已经对系统和网络运作构成分布广泛的威胁。为了更有效与蠕虫对抗,分析最新的发现的蠕虫程序和攻击方式是有必要的。这篇文章说明了如何利用基于Kolmogorov复杂性的技术来对网络蠕虫和传输分析的。利用压缩,不同的种类的蠕虫都能由成群。这样就使得我们能判定一个未知的蠕虫二进制文件事实上是否是现存的极简单、自动运行方式的蠕虫的下一个版本。在对恶意二进制文件的初始分析中,这也许是个有用的工具。进一步,压缩对辨别不同类型的网络传输也是有帮助的,因此有助于探测到传输的异常:通过仅查看一个网络的会话的压缩率也许就可以侦测到特定的异常。我们更进一步的说明如何利用压缩来察觉恶意的网络会话,极类似于大家熟悉的入侵企图。这种技术可能有利于探测一种攻击的不同变异,所以它能有效阻止标示的隐藏。我们提供了两种新的Snort的插件,它对这两种方法都做了详细说明。 1 引言 近些年来,网络蠕虫的大量涌现出来,例如Sasser 和Msblaster,已经对全世界的数百万系统造成了破坏。蠕虫是自动运行的程序,可以发掘联网计算机的漏洞,并控制它们。蠕虫一旦成功地感染了一个系统,它们就会持续不断拓展受害者范围。当一个蠕虫程序发现一台新的脆弱的电脑,它也会使使这台机器受到感染。蠕虫就这样通过网络主动地扩散。 如果蠕虫造成大量的问题,重要的是开发对抗它们的防护体。为了达偿所愿,我们需要详细的分析它们。如果发现系统感染了蠕虫,我们最想知道的就是这是怎样发生的,蠕虫进行的什么可能操作,以及如何阻止以后再次感染。本文倾向于介绍诊断的步骤的第一步的一种如下:我们想确定,我们以前是否见过这种蠕虫或者它是否类似于一种众所周知的蠕虫。我们可以分析蠕虫的二进制可执行文件去获取这方面信息。许多公开的蠕虫,像Sasser,经常有许多变种。这些通常是由同一作者发布的相继版本,用来扩展这个蠕虫的功能。所有这些版本一起可以组成一个相联系的蠕虫类。利用浓缩分析,首先可以将不同版本的蠕虫按类划分。通过归类分析,我们把一个未知的蠕虫程序与大量的已知的蠕虫进行比较,判别出其归属类,这样就简化深层次的分析。这种非常简单的方法不能利用任何手工文本比较或者在传统分析利用的包含在蠕虫中特殊的选定的形式。许多混乱的二进制文件利用UPX来压缩,然后可修改它来阻止解压。这样就使基于反汇编二进制文件和比较两个程序的执行流的方法来分析二进制文件变得相当困难。令人惊奇的是,我们的方法即使利用UPX加壳,仍然发挥作用,尽管有些偏差。因此在对新捕获的蠕虫程序初始分析中,======是一个有用的工具。 受感染的系统和网络攻击通常使网络传输发生变化。为了确认和制止这样的攻击,应当去监视这些变化。最具代表性情况下,利用在网络传输中搜索特定形式方法来探测到反常。例如,当字符串“msblast.exe”在TCP会话中被发现时,Snort[11]就能发出警报。只要知道我们所寻找的形式,这种方法就能很好的发挥作用。这里,我们感兴趣的是即使不知道要搜索的形式,我们也能确认出异常。首先,我们利用压缩来探究不同类型网络传输的复杂性。这些复杂性的差别可以使我们粗略了解何种类型的应用协议能引发特定的网络交互。直观讲,对象的复杂性是由它压缩性能来决定的。如果其能压缩性能优良,我们说它复杂性低。另一方面,如果它几乎不能被压缩,那我们就认为它有高复杂性。例如,SSH协议的复杂性非常高。如果我们观测到TCP协议相同的端口有相当低的复杂性,就能对异常有所察觉。这并不需要异常的额外的知识或者对特定的传输形式进行搜索。对Snor插件的压缩,如果所观察的传输的复杂性没有落在特定范围,Snort就会引发警报。 最后,我们利用压缩比较不同的传输协议。新的攻击程序或者新版本的蠕虫可能产生稍微不同的网络传输,其中不再包含我们搜索特定的形式,以此来躲避查杀。这里我们所感兴趣的是辨别出与现存类似的形式。确且地说,如果两种会话协议的组合复杂性不比它们各自的更复杂,我们就认为它们是紧密联系的。也就是这样一种情况,如果两种通讯非常相似并且能相互能很好的解释对方。我们可以利用这种方法来判定可观测得TCP通讯是否与已记录的相应于已知的攻击通讯相似。NCD Snort 插件在一个可观测的通讯与给定的通讯有一定差异是就Snort发出警报。即使压缩对网络通讯的操作是相当耗时的,我们认为这种方法对探测新的攻击类型仍然是有用的。只要辨识攻击,就可以构建特定形式并将它用在传统的入侵检测中。 1.1 相关工作 Halvar Flake [5] 以及Carrera and Erd¡äelyi [1] 利用基于图形的方法在比较可执行程序中取得了骄人的成绩。最近,Halvar Flake也已经利用这种方法对malware [3]进行了分析。对同一种可执行文件的不同版本进行比较,可能获得蠕虫涉及实际安全问题。这需要对二进制文件反汇编。然而,这种方法对优点在于揭露关于安全隐患的本质实际信息,这里我们注意的焦点是不同的。我们提供了不用反汇编就能判别已知蠕虫的类别的快速方法,这可以用到可执行文件的初步分析。基于这种分析,就能更准确地利用其它方法。 为了确定网路传输的本质,进行了大量的工作。由于我们没有事先选择形式或者特定性质,这就使我们方法根本上不同于其它方法。我们让压缩器来完成指出所有的相似性。 此前Kulkarni and Bush [6]已经考虑过利用基于Kolmogorov复杂性来监视网络传输。然而他们的方法是不同的,因为他们没有利用压缩估计Kolmogorov复杂性。主要是他们认为在网络传输中反常并没有表现出来,因为它们的复杂性要比正常的网络传输还要低。然而,我们发现例如由硬件中继发出假信息就是这样的,我们假设反常通常要比我们认为正常的协议要复杂。例如,如果我们发现HTTP端口80传输正常同时有一部分的复杂性要高的多,这可能就是恶意入侵者造成的,它正在向外传输加密的会话。在这个特定的例子中,由于恶意传输增加了复杂性。 Evans and Barnett [4比较针对FTP服务器攻击于FTP的合法传输的复杂性。他们通过分析合法和非法的FTP传输文件头达,同时收集上百字节的好的坏的信息来压缩到这样的目的。我们的方法不同之处在于我们利用整个包或者整个TCP会话。这样做事因为我们相信在真实世界中,单从单个攻击利用文件的头部分收集上百字节的坏的通信是非常困难的。探测系统的漏洞的攻击通常情况下是非常短的同时不能在同一个端口中产生任何其它的恶意的通讯。这种情况特别出现在非交互式协议中例如HTTP,在HTTP中所有交互仅包含一个请求和回应。 Kulkarni, Evans and Barnett [7]也试图利用Kolmogorov复杂性去跟踪服务拒绝的攻击。现在他们通过计算对包含在数据包中平均信息量估计来确定Kolmogorov复杂性。然后,随着时间的推移,他们利用复杂性差分方法来跟踪复杂性。他们对单个流中的特定的数据包进行采样,然后计算一次复杂的差分。这里,我们总是利用压缩,但目的并不与探测DDOS攻击。 1.2贡献 我们提出利用压缩作为一种新的工具对网络蠕虫的初始分析。 我们证明了网络会话的压缩率差别有助于辨别传输的类型。这样就形成了不需要知道它们的准确本质先验知识,而对对异常的检测一种简单方法。 最后,我们论证压缩对发现与现存的极其类似的攻击是有帮助的。 1.3 概要 在第二部分中,我们简单关注一下规范化压缩过程的概念,在整片文章中都将用到。第三部分展现了利用这个概念来对网络蠕虫的分析。在第四章中我们证明压缩在分析网络传输中有多大用处。最后,4.1.2和4.2小节中我们利用这些观测来构建两个Snort插件来帮助识别网络异常。 2 预备知识 在这章中我们利用基于Kolmogorov复杂性的规范化压缩过程概念。正常情况下,一个有限二进制字符串x的Kolmogorov复杂性C(x)与能输出x最短程序的长度是相等的。事实上,Kolmogorov复杂性于附加的常量机制上是相互独立的。这就是说它与编写程序的利用语言是没有关系的,只要这种语言是固定的。这就是我们将所需要的全部。更多的信息可以在由Li and Vitanyi [8]著的书中找到。 这个概念与压缩有何关系?我们把字符串的压缩版看作在我们的“压缩机”运行的程序。因此,相对机器的Kolmogorov复杂性不比已压缩的字符串的长度还要大。我们通过压缩来估计C(x):取一个标准的压缩器(bzip或者zlib)同时压缩x得到Xcompressed。然后利用Xcompressed的长度length()来代替C(x)。在我们考虑的情况中,字符串x就是蠕虫程序的执行文件或者传输数据。 字符串x和y的NCD可以由下列式给出: C(xy) min{C(x),C(y)} NCD(x,y) =--------------------------- . max{C(x),C(y)} 关于NCD的更详细的信息可以在[13]中查到。NCD是一个非常直观的概念:如果字符串A和B非常相似,就是说一个可以描述出另一个许多信息。也是说如果告诉A,如果我们仅需要知道A与B的差别,就能将字符串B压缩的非常好。因此,单独压缩A后结果的长度要比将A和B的一起压缩结果的长度差别很大。然而,如果A和B差别很大,压缩结果的长度要比单独压缩结果要大得多。我们计算集合中所有对象的两两NCD来进行归类。同时得到的所有对象之间的距离矩阵。这样我们利用[13]中介绍的四步来填充矩阵。在树中,对象如果互相接近,在NCD同样接近。 全文中,利用CompLearn 工具包[12]来构建树。在[10]中,我们得到网络协议的信息。我们分析不同的蠕虫的信息,可以在Encyclopedia[12]找到。 3分析蠕虫 我们利用NCD的概念来分析网络蠕虫的二进制可执行文件。只要识别出在机器上的一个恶意程序,我们就确定它与现存的蠕虫的关系。许多蠕虫程序存在很多不同版本。通常蠕虫作者为了改进它的性能而创造出新的版本。最近的Sasser蠕虫就是这样的。我们称这些版本的蠕虫为一类。现在我们就要提出一个问题:给定一个蠕虫,有与他相似的吗和它属于哪个类? 为了测试,我们收集了大约790不同的种类的蠕虫:IRC,vb,linux以及可执行的窗口蠕虫。粗略的计算,这些蠕虫的290多个有至少一个版本 。 3.1 蠕虫分类 首先,我们利用聚类来评估不同类之间的关系。我们的方法是利用计算在实验中用到的蠕虫的NCD进行的。这样就生成了距离矩阵以及可视化的与矩阵相对应的树。在这部分中,我们利用Bzip2作为压缩工具。 3.1.1 蠕虫的不同类 为了获得这些蠕虫类的深层次的关系,我们首先对完全不同的类型的蠕虫进行分类。我们利用基于文本的蠕虫(像IRC,标有mIRC和IRC)以及针对Windows系统名字含有PIF的蠕虫来对完成以上的工作。有Linux前缀的蠕虫则是针对Linux系统。所有其他是针对Window系统的蠕虫同时也是基于二进制的。 从图1我们可以看出基于文本的蠕虫已经被聚类在一起。就像我们期望的一样,在基于文本和基于二进制的蠕虫已分开了。在各类内部分类当然没有太大用处。然而,单利用我们的方法会产生一些惊奇结果,这会使我们重新对我们的蠕虫数据进行估计。什么是在基于文本的LinuxGodog蠕虫?在进一步分析,我们发现不同于其他的Linux蠕虫,它是二进制的可执行的,LinuxGodog是核脚本,因此与基于脚本的蠕虫IRC非常相似。当看到两个Window蠕虫Fozer和Netsp,它们都是Window脚本,就会有相同的发现。我们还发现SpthJsp也标示错了,其实它是一个IRC蠕虫与IRC-Spth系列非常相似。事实上,人工分析可以断定它确实是另一个变种。同样,IRCDreamircVi也与其他的IRC蠕虫归为一类。它看起来是IRCDreamirc系列的非二进制成员。通过聚类Alcaul蠕虫可以揭示另一个有趣的事实。许多不同的Alcaul蠕虫尽可能都是二进制格式的。然而在测试中,我们偶然发现仅有一个是利用多用途的网际邮件扩充协议编码的,因此它与基于文本的和基于二进制相比,与基于文本根相似。我们的测试鉴定也是将二进制Linux蠕虫与其它系统的基于二进制蠕虫归为一类。仅仅LinuxAdm表现不相近。我们把这归结于linux和windows系统的二进制并不相离,即使它们属于不同的执行格式。相同类蠕虫归结在一起。例如,我们可以看到基于文本的IRCSimpsalapim与IRCSpth系列的明显界限。然而,Mimail和Netres的分离说明了这种方法适合于基于二进制蠕虫的分类。MyDoom蠕虫则起始就是一个列外。两个版本的MyDoom,与其它的等价类蠕虫不同。进一步测试,然而,我们发现MyDoom.a事实上是一个删节的二进制版本。通常情况下,我们初始分析,就能将不同蠕虫很好的分类。 3.1.2 Window 蠕虫 基于文本的蠕虫容易手工分析,所以我们主要针对二进制可执行体。首先我们对不同的且不是利用UPX压缩的windows蠕虫进行分类。令人惊奇的是,即使二进制蠕虫也能很好的聚类,那说明它们的确非常相似。压缩器似乎可以找到利用人工分析不能发现的许多相似之处。图2表明两种可能Sasser变种能完美的聚类在一起。对Nimda的两个版本也是一样。这表明了利用压缩进行分类是一个有效的方法。 3.1.3 UPX压缩效果 许多流行的蠕虫 是压缩可执行的,且基本上都是压缩是单向的不可逆。这样就使获得实际的蠕虫二进制文件很难。但是如果没有这个二进制文件,我们就不能比较嵌入在可执行体中的文本字符串或者就不能反汇编并进一步分析程序流。如果一个字符串已经压缩了,那就几乎不可能在一次压缩太多。因此,我们预计利用基于压缩的方法不会取得好的结果。 Figure 1 不同类的蠕虫 令人惊奇的是,然而,我们仍然能对利用UPX压缩的蠕虫进行合理分类。这表明UPX,不能象bzip2获得压缩的长度,但可以允许二进制文件是可执行的。 图3表明了对起始利用UPX压缩的蠕虫的分类实例。这个实验表明即使我们的方法欠准确,但是我们仍然可以看到对Batzback系列的聚类。对其他的蠕虫,例如Alcaul.q,并没有很好的聚类在一起。这也说明了,即使蠕虫是UPX压缩的,我们仍然有机会利用简单的压缩对蠕虫进行分类鉴定。在移出UPX压缩后,图4 说明了聚类过程的结果。我们能观察到更好的结果。 然而,在分析蠕虫前,并不能总是简单移出UPX压缩。可以修改UPX压缩使得蠕虫仍然可执行,但是修改后将不能解压。这就使得对蠕虫的分析变得更加困难。因此,我们将研究UPX压缩如何对归类过程进行不规则的影响。在下一次实验中,我们选择UPX压缩及当前流行的不规则的蠕虫。在Alcaul系列中,只有Alcaul.r是不规则的。我们选择其它的UPX压缩的Alcaul蠕虫,来判定聚类中包含部分UPX压缩及不规则的蠕虫是否造成归类的失败。 正如图5所示的,我们的方法给出蠕虫分类启示,即使没有大量人工不能得到UPX解压。不规则的Alcaul.r蠕虫能与规则的Alcaul蠕虫聚类在一起。对于Lentin系列蠕虫也是一样。 3.1.4 蠕虫和合法的Windows程序 最后,我们检测现存的windows程序以及它们与蠕虫的关系。因此我们从表准的windows安装程序收集许多小的windows可行文件并且将它们和蠕虫混合起来进行聚类。图6 描述了我们测试的结果。在这里所利用的合法的windows程序有:net,netsh,cacls,cmd,netstart,cscript,debug.exe和command.com。令人惊奇的是,我们的实验结果证明大部分windows程序都紧紧集合在一起。直观表现是有相似功能的关系更紧密。只有debug.exe和command.com被置放在树中其它地方,我们把这归咎于这样的事实与其他程序相比它们的功能的确不同。然而,从这个实验断定压缩总是能从合法的windows程序辨别出蠕虫来为时过早。我们测试中仅仅包含非常有限的程序。但是,它也表明了,功能相近的程序关系非常密切。例如CodeGreen和CodeRed就有密切关系,归结于这样的事实它们有相同的弱点。 3.2蠕虫分类 现在我们尝试对一个未知类的蠕虫进行归类。断定一个蠕虫的属类使进一步分析更加容易。再一次,我们不是对特别选定的可执行文件进行搜索或者对实际的问题进行分析。然而,我们仅仅利用NCD。为了判定一个病毒的类属,我们计算这个蠕虫与其它所有可能的二进制蠕虫的NCD。根据NCD来蠕虫w与t距离最近,则t与w最匹配。然后,我们就把w归为t类。简而言之,我们把新蠕虫w划分为F类,使得存在t ∈ F, 对任意k ∈ W,NCD(w,t) ≤ NCD(w,k)其中W是所有测试蠕虫的集合。为了避免错误的划分,如果蠕虫存在一个t使得NCD(w,t)>=0.65,则我们把这个新蠕虫标为未知类。这个数据是由我们的数据的实验得到的,可根据不同的情况进行调整。 在对719不同二进制和非二进制蠕虫进行第一次实验中,其中284个,经过我们的方法判定后,可能属于不仅仅一个类。对每一个蠕虫,我们判定在其余的蠕虫与之最匹配。在284个中179都可能与它的类匹配,这说明我们成功了。我们的到39个错误的匹配。这是与正确的匹配相比,所占的比率很低。然而,值得注意的是我们对所有类型的蠕虫进行匹配同时利用一个非常大的蠕虫集合,这情况仅仅出现在本文中。实际中,你可以限制蠕虫被所属类为一个已选好的数据库,达到获得一个好的结果目的。例如,考虑一个通过email传播的蠕虫。如果将我们注意仅限制在“I-Worm”类的蠕虫,如表1所示就能得到一个好的分类效果。我们对454蠕虫进行分类,其中可能属于两个以上类的蠕虫有184个。现在如果利用上面的改进的方法,仅仅13个分类错误。 我们的实验使我们对将来这种简单的方法可能实用充满信心。
[1] [2] 下一页 |