在长期的对抗、淘汰和选择中生物具备了求生的本能。与生物形态一样,恶意代码的当前形态,是综合淘汰和选择推动的结果。实际上这种情况适用于所有的软件程序。

  如何思考恶意代码的演变过程?为什么把恶意代码和进化论联系起来?与生态形态一样,恶意代码的当前形态也是各种因素综合淘汰选择推动的结果,实际上这种情况也适用于所有的软件程序,包括操作系统、各种相关的工具软件、各种反病毒软件本身。进化论从根本上说是关于生死和演进的科学。

  >>生篇
  对于“生”,在长期的对抗和淘汰选择中,生物具备了求生的可能;恶意代码也具备了这种可能。

  寄生
  金小蜂(Nasonia),是一生中只有一段时期寄生生活的一种寄生蜂,产卵在越冬红铃虫幼虫的身上,孵化为幼虫后就寄生在红铃虫幼虫体上,并以它的身体为食。
  我们可以进行一下简单的类比:寄生是病毒具备的最早生存特性,进行文件的感染、进行引导区的感染等等,这是恶意代码最原始的技能之一,而病毒编写者逐渐改善这种技巧,比如类似碎洞攻击的方法保持对象原装的长度不变。

  繁殖
  以老鼠为例,民间有句话,“一公一母三年二百五”,这是其繁殖的能力,而以恶意代码为例的传播过程中,SQL.Slammer蠕虫在十分钟之内全球感染了7.5万台节点,其繁殖能力远强于生物。

  躲避天敌
  这是高高警戒的狐,天敌来了就立即逃跑。而我们看看古老的病毒Yankee,因发作现象是演奏 “Yankee Doodle”的歌曲而闻名。这是具有最早躲避天敌能力的病毒之一,当其发现Debug加载时,便逃之夭夭。这是躲避天敌的一个特性。

  保护色
  保护色,土蝗在黄土地上看不出来,因为和环境是一个颜色。而我们看这个例子演示灰鸽子一个变种就把自己命名为pagefile,仿佛和系统页面相关,自己起的服务名字叫Windows Server Myssl,很像Windows的系统服务。它们只有通过我们的签名验证才暴露出来,否则混杂在大量的服务中看不出来,在终端上检验非常困难。

  拟态
  竹节虫,非常像一根竹枝。而我们在看这个演示病毒注入到浏览器进程Iexplore中,如果简单地通过进程查看的方式是无法发现的。这是用伪装的方法,通讯用的端口在监听上和浏览器并没有区别。

  引诱
  这是一种更有趣的现象。有一种双盘吸虫寄生在蜗牛里,于是蜗牛的触角会长得特别鲜艳,容易被鸟发现,鸟儿吃下后就寄生在鸟的体内,随着鸟的粪便排出,后被蜗牛再吃掉,进入蜗牛的体内而形成一个循环。
  我们也可以看出社会工程学化的恶意代码生存里就有引诱这种方式:我们会发现有两个文件夹都叫历史文献,哪个是?可能就随便打开一个。实际上这是一个U盘的病毒通过引诱的方式,利用Windows已知文件扩展名默认的配置属性来达成这样的结果。

  假死
  自然界中有一种会装死的千足虫。过去百度的插件用过类似的假死技术,当然,这并不是说百度是一个恶意代码,但是确实用了一个rootkit手法,拦截反病毒软件的API操作,在发现DeleteFile时,则返回SUCCESS。因为你收到了SUCCESS,意味着杀毒成功,实际病毒还在。后来就出现了一个问题,有的反病毒软件认为成功以后需要重试一下,就进入了死循环。为了解决这个问题而改变了拦截策略,在短时间内读不到,然后就到了下一个文件,这样rootkit在前阶段的死而复生,就是“假死”。
  这些本来是一系列的生物求生的方法,这种求生方法不是生物自己通过“人工智能”设计出来的,而是在长期进化中自然淘汰后保留下来的本能,不是双盘吸虫想去控制蜗牛,想自我演变,而是不能使触角变成鲜艳颜色的双盘吸虫最终死掉了,能够变颜色的则存活下来。

>>死篇
  天敌是造成演变的重要原因,但它只是演进的推动力而非消亡的推动力,没有任何一种病毒是彻底被反病毒软件杀灭的,是环境淘汰了物种。

  三叶虫,消亡了;恐龙,消亡了;剑齿虎,消亡了,华南虎,也快要消亡了。消亡者留下了化石,快要消亡者还在动物园里残喘,比如“巴基斯坦智囊”,不再具有活性;“莫里斯蠕虫”,不再具有活性;还有一些恶意代码,也快要彻底退出历史舞台了。不再具有活性的病毒,我们看到的就不再是他的危害,而是印在教科书上,孤零零的源码或者反汇编代码。

  为什么恶意代码被淘汰?首先说说天敌,就是对恶意代码的查杀,如同生物捕食一样,反病毒软件杀掉恶意代码。再就是防御,比如说乌龟有一层坚硬的壳,其他的动物就伤害不了它,主动防御、防火墙也是一个道理。天敌是造成演变的重要原因,但它只是演进的推动力而非消亡的推动力,没有任何一种病毒是彻底被反病毒软件杀灭的,是环境淘汰了物种。

  历来操作系统的升级都淘汰大量的病毒,比如说DOS 3.3 、DOS 5、DOS 6,由于中断的微妙变化,VASFE的引入等等,导致了一些传统的早版本DOS活性病毒消失。再一个就是COM-MZ—NE-PE格式,从com这种非常简单的无格式头的可执行体,简单的尾部感染直接附着,就可以运行,到了PE,把代码复制到PE后面执行逻辑根本读不到,怎么去破解这种格式?

  再就是Ring0这个机制,大家知道Windows95系统出来之后,为什么到1998年才出现像CIH这样广泛传播的病毒?这是因为整个安全机制发生了变化,系统运行在Ring0、应用运行在Ring3,如何获取Ring0的权限?而在这种情况下,CIH把VXD的技术突破零环的方法公示于天下,所以造成了大传播。每一次这样的升级都会淘汰掉一批,最后就是VXD->WDM。所以,导致CIH最终灭亡的是NT架构系统的崛起。

  传播与迁徙的方式
  动物是迁徙,恶意代码是传播。恶意代码被主流数据交换方式的依赖不亚于动物对迁徙途径的依赖。

  最早的恶意代码是如何传播的?“巴基斯坦智囊”发作的原因是通过软盘的交换传播,因为当时软盘是数据交换的主要通道,没有Internet。而1998年出现了happy 99。它应该不是第一个电子邮件的蠕虫,但是具有代表性。后来出现了Melisa等,既有宏病毒特性、又有邮件蠕虫特性,依赖电子邮件传播。电子邮件蠕虫又是怎样衰落的?是Outlook遏制了很多调用,自动发送控件被限制,电子邮件蠕虫也逐步衰亡。

  再比如远程溢出。这种溢出蠕虫受到严重挫折的是什么?不是天敌,是操作系统的数据执行保护(DEP),从机制上使即使成功溢出了也不能获取控制权限。

  再比如口令破解蠕虫家族,这是利用微软具备在权限足够情况下可以让远端系统直接运行本地程序的内部调用,如果系统是空口令的话,直接就可以把木马投上去运行。口令破解为什么消亡?除了Windows自带防火墙可以切到Block all packet coming in模式之外,Windows默认安全配置禁止空口令连接。

  我们再看当前最主要的病毒传播方法——U盘,本来是为了方便用户交换数据的,但其自动运行机制被利用了。Web注入,有设计的缺陷,但有的也是为了系统功能的灵活性;这些途径都在不断变化着,不断淘汰选择着,恶意代码的作者就要选择这些方式去改进。

  需要注意的是,被淘汰的不只是病毒。比如,我常说的OLE2分水岭,宏病毒是全球民间反病毒和商业反病毒的分水岭,尤其是在国内造成了这样的结果。宏病毒易写、易改、难杀。因为Windows的文件链接结构OLE2不公开,如果采用直接匹配会把文件破坏。可是当时McAfee等很容易就通过和微软的合作关系而拿到了相应的结构,而国内厂商莫不是通过长达六个月以上的逆向工程才完成这样的工作。因此这时首先就拉开了国外厂商和国内厂商的距离,接着就拉开了国内厂商和民间的距离。所以这是分水岭,不仅对于病毒自身,也包括反病毒软件。比如说Vista强化的DEP、PatchGuard等安全机制,把病毒挡在外面的同时,也把大量AV厂商长时间阻断于“兼容性”测试之外。所以有人觉得微软是在“行进中开火”,不仅拖垮了竞争对手和威胁,也把友军晃得晕头转向。

  光有生死不是进化论,有变异才叫进化论,进化论的核心不是简单的繁殖和生死,而是以无可辩驳的关于物种起源和进化的铁证构建学说体系,颠覆神创论的物种神造和物种不变的谬论。

  从变异的结果上看,从架构和变种来看,DOS时代最多的“耶路撒冷病毒”有354个变种,当时人们觉得不可思议;而目前来看,很多的病毒家族变种数以万计,而且还不包括被通用特征匹配出的变种。大量团队的批量制造,每天可以为不同的用户定制开发,比如灰鸽子变种数占全球后门变种总数的17%。这是非常严峻的形势。在这个变异过程中,我过去举过DOS病毒反免疫的案例,说明恶意代码实现变种的有趣倾向,这是靠作者预留了死分支,等待被改造者激活。但无论如何,恶意代码自己是不能增加功能的。

  另外,关于反汇编和代码演进的过程,在早期病毒刚进入我国的时候,一个反病毒的分析可以上到全国科学大会的报告,可见当时何其神秘,但现在就不一样了,因为相关的资源太多了。我们可以看看其中的轨迹,DOS病毒大量泛滥的起点是因为源于某个病毒的彻底反汇编剖析被公开了,这样的一个结果使很多有意愿写病毒的人对病毒基理非常了解。随后就是在源代码的基础上演进,比如后门的急剧膨胀在于BO的代码公开。另外就是变种最多的Rbot等僵尸程序家族的大量变种源于代码公开包括被销售,这是整个病毒的反汇编和代码演进。

  再说说一个二进制演进,口令猜测蠕虫族的演进。这个工具出现之后,病毒呈现了DIY特色,一行代码不用写就可以编出病毒。在网上找到了psexec,作为投放的部分,再找一个行命令的扫描器,再找个后门或者木马放在里面。写一个批处理作为调度,解决投放的怎么读扫描结果的问题。然后用一个自解压工具打包进行传播,于是就出现了演变,一些感染者把木马换成自己的二次传播。在这个过程中,我们可以根据很多信息猜测口令蠕虫的家族如何进行传播演进,这就是一个很典型的二进制过程。演进过程中一个固定的特点是有人参与的,不会发生自我的变异。

  关于自我变异,有人举跨平台的例子,但跨平台不是变异。比如有人写的PE和ELF的双态病毒,在Windows下PE格式,在Linux下ELF格式。这是变异吗?不是。比如有人写过 Macro和DOS COM的双态病毒也不是变异,这都是代码本身有的功能,并不是自己发明的功能。所以这只是两栖动物,既能在水里生活,也可以跑到陆上。此外,变形也不是变异,代码没有自我变异的可能性,比如新病毒哪里来的?变形的过程中并没有产生新的功能特性,你可以把它当作变色龙。

>>逸闻篇
  封闭的大陆块给了鸭嘴兽存活的环境,病毒存活有时也同理,源于遗忘和孤立。

  有趣的现象
  Wildlist和zoo,这是像专有名词一样接替过来的两个词汇,我过去一直没有深刻理解其来源。其实细想是非常形象的。zoo,为什么是动物园?因为很多在野外中已经灭绝了的动物只能在动物园看见;Wildlist则是活生生的存在,是有活性的。

  长寿的秘密
  有三个给人印象非常深刻的病毒,Klez 、Parite、 wyx。比如在大量的邮件蠕虫已经灭绝的情况下,还能兼顾到klez发出来的东西,为什么?因为顽固感染杀不掉。它不通过调度outlook来散发,而是自己插入到整个邮件体系中散发。这样就造成了一些顽固节点始终在网上挂着,至今仍不能彻底消亡。长寿的单一的恶意代码klez在无变种的情况下,存活的时间非常长久,而且其反制AV的特性导致了杀而不去的顽固感染。
  Parite也很古老了,到现在为止仍然还在。因为它是和当前主流操作系统兼容的。感染就像生物的大量传播一样。第一个是顽固式感染的秘诀;第二个是繁殖式生存的秘诀,不断产生被感染的文件。另外,随着各种其他的蠕虫被感染再投放到别的机器上去,延续了其生命,像寄生虫一样。
  最有趣的是wyx,是在DOS下的引导性病毒,现在还在wildlist活跃榜上活跃着。有一件很简单的例子,当Windows 95系统出现之后,病毒作者们就发现那仍然具有引导活性的引导性病毒非常难写,这意味着病毒一定要通过文件的感染方式。在这种背景下,反病毒软件是围绕着文件的查杀体系来编写的,没有考虑到原来的引导区查杀问题。事实上,还有大量的被感染软盘在里面,有时软盘放在软驱里面没有拿出,开机就造成了感染。
  我联想到鸭嘴兽,作为一个古生物为什么留存在封闭的大陆块上。而wyx就因为它是在一系列孤立的磁盘中被人们所遗忘的。

  传说中的物种
  物种的存续过去依赖的是自然选择,自从有了人之后就可以制造了,包括现在的克隆等。但即使在现代社会,也有很多的流言成羁。最开始的谣言是邮件病毒,如果收到一封邮件,千万不要看,一看就被感染,在文本邮件的时代,纯属谣言;后来用附件发邮件蠕虫;后来有直接溢出邮件客户端的漏洞(比如iframe漏洞的免预览执行),这叫流言成羁,传说中的物种被制造出来了。
  IM消息病毒最开始也出现过,看到一个消息千万不要点击,后来IM蠕虫泛滥;还有BIOS病毒,在BIOS不可软写时代,纯属谣言。所以说这种传统的流言不是一成不变的,随着环境的变化,传统的、不可能的事情就变为可能的,原来不可能存在的物种会因为故意的构造变为存在,当然这是需要理论前提的。

>>选择达尔文还是拉马克?
  进化是自然选择的结果,遗传是不确定性的,环境对不确定性进行淘汰。

  拉马克主义认为进化是生物能动性的结果,用进废退则会大,大了之后遗传给下一代获得性遗传。用进废退和获得性是拉马克主义的两个支柱。而达尔文认为进化是自然选择的结果,遗传是不确定性的,环境对不确定性进行淘汰。

  大量的科学事实证明,达尔文的观点基本上是正确的。为什么我国有很多人信任拉马克主义?是因为苏联开始是相信拉马克学说的,认为人的能动性决定一切,是建设伟大国家的条件,所以拉马克学说一度被奉为正统,达尔文遭到批判。而由于部分西方哲学家把达尔文适者生存的领域无节制地用到了社会科学领域,推论出剥削也是合理的等等,所以苏联人从情感上选择了拉马克,也影响了我们国家一些人的观点。

  在恶意代码领域,虽然只是类比,我还是要选择达尔文。首先,恶意代码是不具有主动性进化的倾向的;其次,一部分恶意代码消亡了,一部分还有活性,这是自然选择的结果,不是主动遗传的结果,所以要投达尔文一票。

  但值得注意的是,任何两种学说都不能完全平等对接,把进化论完全应用于信息技术是不可能的,如果说病毒是一种动物,反病毒也是一种动物,那么反病毒工作者和病毒作者他们是造物者还是环境的一部分?如果简单类比就会发现有问题,因为自然界不存在造物主,无论是病毒还是反病毒软件,其变异都是经过人的经验改造与尝试完成的。这里确实有主动倾向性,这个和生物变化完全随机是有一定差异的。再就是生物在变异中繁殖,每一代都会有差异;而代码在不变中复制,因此创造者和改造者是遗传链条中的环节。这是代码达尔文和生物达尔文的最大不同。

  另外,代码会发生拉马克式进化的一天吗?恶意代码进化的最不确定性是因为人的能动性改造,这是与动物随机性分布遗传结果不同的。但是有一天,恶意代码会发生自我的能动性改造么?

  从目前来看,即使是在有庞大的组织体系和计算资源的反病毒体系上,这种自学习也是失败的,云计算并没有解决这个问题。病毒与正常程序并没有绝对的区别,如何定性哪个是病毒哪个是反病毒?前文说百度使用了rootkit方法的插件和用于恶意入侵的rootkit的区别模糊,只是因为百度是一个合法厂商而已,这是社会意义上的区别,而不是技术上的。彻底的,没有工程化干预的自学习的理想目前在AV领域是失败的。但我们也在想,人为什么可以正确辨识很复杂的自然事物。这是因为大脑具有的计算能力。当前无论多么强大的计算机,可能在某个单一的方面(比如国际象棋)达到大师的水平,但不可能在全方位的辨识智能上达到人的水平,我们也可以认为这是因为人的大脑具有足够的计算能力,而十几年后,单点计算能力构建的全局AI可能仍无法达到儿童智力的水平。那么,一个几十万计算机的僵尸网络体系会怎样?一个拥有百万终端的流氓软件体系会怎么样?如果这种体系能有效进行分布式的计算和自主学习会怎样?这是值得我们警觉的。

>>教育网上的进化斗争
  我们知道,森林制造氧气,但是突然发现森林开始释放大量的二氧化碳,而且比氧气多,因为被红松甲虫感染了。树死之后这些甲虫就在树里释放大量的二氧化碳。那么,是应该杀虫还是消灾?所以我们从终端上处理掉病毒的实体文件,不是与恶意代码斗争的惟一方法,至少我是这样看的。

  关于教育网上历次反恶意代码斗争的关键点,作为一个亲历者,我想回顾一下。

  首先,看看Dvloder,它是口令猜测蠕虫中疫情最为严重的。因为不是采用一个简单的批处理调度的方法,所以有非常强的发包能力。另外一个特点是有更大的密码档,更快的扫描速度,更紧凑的组合方式,开设了VNC后门。我们曾与哈尔滨工业大学联合组建了一个CERT,这个蠕虫是“哈工大—安天联合CERT”国内率先发现的,并锁定了国内最早感染的机器。实际上在这个病毒之前,已经有了这种DIY口令猜测蠕虫,并可以追溯到上一年的12月。那时我们已经关注到互联网上大量的139、445 端口扫描的现象。因此在旁路的监听设了阈值,发现超标之后,当时确定了7个IP,联系到管理者抓到了这个蠕虫样本。它的后期处理还是非常典型的,主要是普查。因为这个蠕虫用的是VNC的后门,是3DES算法加密的,我们破解了口令,用这个VNC口令作为验证项,可以准确地判定。这一蠕虫是被公安部门立案侦查的,由我们提供技术支持,全国大概排查了4万台机器。国内最早的感染节点在东北农业大学,根据其他信息,该病毒的感染时间是早上8点多,但是初始投放时间根据分析应该是在凌晨两点,我们预测,这应该是时差的关系,并因此推断出大概的时区位置。再就是清除病毒。我们协助有关高校,把检测出的机器二次利用密码档去投杀毒程序。由于我们不能确定蠕虫是否还在,注册要给一个前台界面,这个程序是由网络管理机构派发的。当时主要是配合几个校园网络中心做远程查杀。从病毒设计机理上说,这种方法是无效的,因为这个蠕虫会关闭RPC,但事实上由于蠕虫传输本身的干扰,有可能关的时候蠕虫体还没有传完,所以关闭往往会失败的,导致了远程的查杀率还是比较高。

  再就是Welchian,这是当时在ISP IDC机房的监控点看到的。12月前几天的扫描数量,大概每天维持在200万次以上,但是,当时有一个非常典型的处理案例,某高校有300台HUB无法管理,如何处理?联合CERT后来想到了一个方法,因为可以判定出大概的源,发送ARP包压制它,叫它不停地弹,这样,不管怎样改IP都会冲突。同时在学校寝室的门口发布公告,通知学生一旦发现这种现象是因为机器中毒了,需要处理。采用这种方式,经过一周的时间,同时将几台设备分别布设在各个寝室楼出口的地方。这是另外一个我们认为比较成功的案例。

  再就是邮件蠕虫的事件。有一段时间存储的压力很大,一天中仅蠕虫就收了12.3G,还不算编码的大小。印象比较深刻的是Sobig.f。由于TELOCK随机数加壳,每重新加一次整个文件就变了,这个对文件引擎没有什么影响,对包引擎就成问题了,因为每一个变种要加一条规则。我们在很短时间内捕到13个变种,但是也不知道有多少个变种,后来分析了特点之后发现所有MZ头是一样的,如果用MZ头是可能误报的,而正常程序可能还在邮件附件里,概率还是比较小的,所以就用了惟一的一条快速匹配MZ头作为规则。

  关于Downloader处理。Downloader,包括挂马,是当前比较严重的情况。一旦一个木马下来之后就下来一群,这些样本无论是对网关上的设备还是终端设备,很多都是新的,不认识,很多恶意代码作者看不出特性,写的时候储备了十几个变种,三十分钟之后升级成了第二个;而反病毒软件升级一个通常需要一个小时,有时候需要更长。从厂商角度,因为定性可能很快,提取规则很快,编写查杀参数也不慢,或者干脆用通用引擎处理,但是白名单测试非常慢,如何保证不误杀、误报?要用一个千万级的白名单系统把所有文件扫描一遍不误报,这将导致发布时间很慢,期间可能又产生三个变种,所以杀不掉。反病毒当然不能够只靠主机,要靠网络,但有可能主机上匹配不到,网络更匹配不到,所以要靠行为。我们来做一个行为检测演示,模拟Downloader下一批东西,如果不打开行为的开关,可以查到一个;如果把开关打开,用相同的情况去做,实际上就会出现一次Downloader下载行为,因为有连续的小PE文件的传输。病毒对抗的很大弱点是你有什么权限人家也有什么权限,而且你在明处他在暗处。在网络上他是静态的数据,你是有响应权限的,所以他是无条件被你分析的,这样的一种连续事件可以分析成这样的一种下载行为。

  关于MS08-067的响应。对这个漏洞大家已经很了解,比如DEP是穿透不了的,为什么能造成当前这么大危害?一是因为操作系统较老,再就是“民间预装版”的,把一些系统默认的安全配置去掉了,这种情况导致了大量传播。安天写了一个快速扫描器,先测了一个教育网服务器C类IP段,发现11台有问题,而且基本都是Web Server,这说明问题很严重,是因为有很多老服务器是不维护的。

  实际上我认为高校的一个特点是技术和学术民主共同参与,往往参与实际的基于自身网络信息体系的保障恰恰是最好的锻炼。有一个教授说过一句话,全国每年以入侵检测为论文毕业的学生数以千计,但是没有几个能到实际的现场做一次真实的入侵分析,这个问题不应该继续下去。

  有这样一幅画:宗教狂热分子讽刺达尔文认为人的祖先是猿,但事实上达尔文从来没有说过这句话,他说的是人和猿有共同的祖先。

  被疯狂攻击的又岂止是达尔文一个人?就如同对AVER的指责。有人说反病毒产业是病毒经济。那么,AVER是敲诈者么?不要忘记恶意代码不是AVER写的,是由分布在地下经济体系上端的大量作者所写,他们没有被群起而攻之,却是我们被更多地非议和批判着。AVER是勤奋执着的。被学术界倍加推崇的snort,迄今不过3000条规则。而在过去的20年,AVER定性了数以千万计的文件,分析了数以百万计的病毒样本,提取了一百多万条检测规则,命名了30万个以上的病毒名称(含变种)。这其中有一半以上的工作是在2008年一年里完成的。

  我经常看到质疑AV作了20年,也没有解决反病毒问题,是不是AV没有用了。但我们也可以看到,人类的基础安全体系存在了数千年,不是同样没有解决杀人、盗窃的问题,难道警察和社会公权体系就是没有用的么?如果说反病毒是病毒经济,难道防盗门、报警器、这些都是小偷经济么?

  我想,我们与技术空想者的区别,是他们至今没有实现任何一个虚妄的幻想,而我们愿意把毕生的青春和才华献给一个永无休止、持续对抗的事业。

  希望那些狂热的批评者在批评AV技术之前,先试想一下,那些被数十万种恶意代码所窥视的无辜用户如何生活在一个没有反病毒技术的信息世界。

文章如转载,请注明转载自:http://www.5iadmin.com/post/10.html