蠕虫的无节制传播通常会导致拒绝服务,事实上,蠕虫攻击已经成为发生率最高的一种拒绝服务攻击方式。同时,蠕虫攻击带来的危害也是巨大的,例如,2003年1月,由于网络蠕虫的攻击,使亚洲、美洲和澳洲很多国家的Internet全部或部分瘫痪。而据美国FBI于2004年做的计算机犯罪调查报告[CSI/FBI03]显示,2003年,病毒(包括蠕虫)和拒绝服务是导致损失最多的两类攻击方式,病毒(包括蠕虫)造成的损失巨大的主要原因就是2003年全球范围内蠕虫的肆虐。同时,由上一章已经知道,蠕虫也是攻击者用于获得傀儡机的主要方法之一。因此,拒绝服务攻击一般来说不能脱离蠕虫与蠕虫攻击的研究。只是由于蠕虫与病毒的相似性,人们经常把它与病毒归为一类。
蠕虫的定义编辑本段回目录
早期恶意代码的主要形式是计算机病毒[COHE1985] [COHE1989] [COHE1990]。1988年“Morris”蠕虫爆发后,Spafford为了区分蠕虫和病毒,对病毒重新进行了定义,他认为:“计算机病毒是一段代码,能把自身加到其他程序包括操作系统上;它不能独立运行,需要由它的宿主程序运行来激活它”[SPAF1988]。而网络蠕虫强调自身的主动性和独立性。Kienzle和Elder从破坏性、网络传播、主动攻击和独立性[KIEL2003]四个方面对网络蠕虫进行了定义:网络蠕虫是通过网络传播,无须用户干预能够独立地或者依赖文件共享主动攻击的恶意代码。根据传播策略,他们把网络蠕虫分为三类:E-mail蠕虫、文件共享蠕虫和传统蠕虫。郑辉认为蠕虫具有主动攻击、行踪隐蔽、漏洞利用、造成网络拥塞、降低系统性能、产生安全隐患、反复性和破坏性等特征,并给出相应的定义:“网络蠕虫是无须计算机使用者干预即可运行的独立程序,它通过不停地获得网络中存在漏洞的计算机的部分或全部控制权来进行传播[ZHENG2003]。”该定义包含了Kienzle和Elder定义的后两类蠕虫,不包括E-mail蠕虫。2003年10月的世界蠕虫会议上,Schechter和Michael D. Smith提出了一类新型网络蠕虫,Access For Sale蠕虫[SCSM2003],这类蠕虫除上述定义的特征之外,还具备身份认证的特征。
综合上述分析,我们认为“网络蠕虫是一种智能化、自动化,综合网络攻击、密码学和计算机病毒技术,无须计算机使用者干预即可运行的攻击程序或代码,它会扫描和攻击网络上存在系统漏洞的节点主机,通过局域网或者国际互联网从一个节点传播到另外一个节点”。此定义体现了新一代网络蠕虫智能化、自动化和高技术化的特征。
蠕虫的历史编辑本段回目录
“蠕虫”最早出自一本1975出版的名为《Shockwave Rider》的科幻小说。最先由Xerox Palo Alto Research Center(PARC)于1980引入计算机领域,但当时引入它的目的是进行分布式计算而不是进行恶意的破坏。
蠕虫被用做恶意攻击的历史可以追溯到1988年11月2日爆发的Morris 蠕虫[SPAF1988],它是由Morris在Cornell大学就读研究生期间作为研究项目开发的,它在互联网上发布后几天之内就感染了互联网上6 000多台服务器,造成了巨大的损失。它的出现一方面给社会造成了巨大的损失,另一方面引起了人们对这种攻击的重视。Morris蠕虫是通过fingerd、sendmail、rexec/rsh三种系统服务中存在的漏洞进行传播的。它之所以如此出名,除了因为它是第一个出现的恶意蠕虫外,更重要的是因为它对蠕虫开发所涉及的各个方面考虑得比较周全,它的很多技术至今仍被蠕虫开发者所使用。
1988年12月23号,HI.COM蠕虫开始通过DECnet协议进行传播,它仅感染VMS系统,并且通过使用默认口令来连接其他网络系统进行传播。由于该蠕虫在圣诞节那天发给被感染系统的消息中会包含“Your Father Christmas”的字样,所以该蠕虫有时也被称为“Father Christmas”蠕虫。
1989年10月16日,另一个与HI.COM相类似的蠕虫——WANK蠕虫开始在运行于DECnet的VMS系统上进行传播,与HI.COM不同的是,该蠕虫的作者用意不在于用它搞破坏而是用它来表达自己的政治主张,这从它所散布的标语“Worms Against the Nuclear Killers”上可以看得出来。WANK蠕虫是通过系统弱口令缺陷进行传播的。
1998年5月,一个名为“ADM”的地下安全组织发布了ADM蠕虫,它借助BIND8.1及其以前版本反向查询中的缓冲区溢出漏洞在Linux系统上进行传播,但由于程序自身的限制,它的传染效率较低。ADM蠕虫是UNIX平台上蠕虫的重要里程牌,因为:① 它引入了随机地址生成器;② 它通过Shell脚本对攻击代码进行了封装。这两种技术都被后来的很多蠕虫作者所采纳。
1999年9月,ADM Millennium蠕虫爆发,由于该蠕虫将其所有文件的时间戳设置为2000年1月1日,所以人们称其为“Millennium”蠕虫。由于它在很多方面类似于1998年的ADM蠕虫,所以被认为是ADM 蠕虫的仿制品。Millennium蠕虫只感染Linux系统,它入侵系统后,会修补所有它利用的系统漏洞,以此来防止重复感染。它通过imap4、qpopper、bind、rpc.mountd 4种系统服务中存在的漏洞进行传播。
2000年5月4日,求爱信(LOVE LETTER)蠕虫爆发,这是一个用VBScript语言写成的蠕虫程序,它可以通过多种方式进行传播,包括:E-mail、Windows文件共享、IRC、USENET新闻组等。根据CERT的统计,截至2000年5月8日,仅5天的时间,就有近500 000台机器被感染。该蠕虫一旦感染了某台机器就会采取下面的动作:① 用自身的副本来替代系统内部的特定类型的文件;② 生成mIRC脚本;③ 修改浏览器的主页,将其指向一个可能含有恶意代码的网页;④ 从地址簿中获取邮件地址来发送自己的副本;⑤ 修改注册表以保证自己在机器启动时得到执行。另外,值得注意的一点是,它利用了人们的好奇心理,比如将邮件的主题定为“I LOVE YOU”,导致很多人会因为好奇而去打开附件,从而被感染。这种手段被后来的很多蠕虫所借鉴。
2001年1月,Ramen蠕虫在Linux系统下发现,它的名字取自一种面条。该蠕虫通过三种方式进行攻击:① 利用wu-ftpd2.6.0中的字符串格式化漏洞;② 利用RPC.statd未格式化字符串漏洞;③ 利用LPR字符串格式化漏洞。由于以上所涉及的软件组件可以安装在任何的Linux系统上,所以Ramen能够对所有的Linux系统造成威胁。同时它也向人们显示出构造一个蠕虫并不是非常复杂的事情,因为该蠕虫所用到的漏洞和脚本等大多数来自互联网上公开的资料,但这并没有影响该蠕虫爆发后给互联网所带来的巨大损失。
2001年3月23日,Lion(或1i0n)蠕虫继Ramen之后在互联网上出现,最初发布的版本中只包含了如下几个作为蠕虫所必需的几个组件:一个用于传播蠕虫工具包的微型服务器端,一个B类地址的随机生成器,一个扫描工具和一段针对BIND8.1服务器的攻击代码,但后来出现的变体中又引入了其他的一些组件来隐藏自己。Lion蠕虫通过域名解析服务程序BIND中的TSIG漏洞进行传播,代码中有明显的对Ramen蠕虫的抄袭痕迹,而且所有关键模块都来自于网上其他的工具包。
2001年4月3日,Adore蠕虫被发现,它也曾被称为Red蠕虫,攻击受害者系统后,该蠕虫会向adore9000@21cn.com,adore9000@sina.com,adore9001@21cn.com,adore9001@sina.com等处发送系统信息,所以有计算机专家推断Adore蠕虫为中国黑客编写。经分析Adore蠕虫是基于Ramen蠕虫和Lion蠕虫写成的,它综合利用了这两个蠕虫的攻击方法。Adore蠕虫通过wuftpd、rpc.statd、LPRng、bind 4种系统服务中存在的漏洞进行传播。
2001年5月8日,sadmind/IIS蠕虫爆发,它被认为是第一个同时攻击两种操作系统的蠕虫。它利用SUN公司的Solaris系统(UNIX簇)中的sadmind服务中的两个漏洞进行传播,另外还可以利用微软公司IIS服务器中的Unicode解码漏洞来攻击安装了IIS的服务器。
2001年5月17日,Cheese蠕虫在互联网上出现,这个蠕虫号称是良性蠕虫,是针对Lion 蠕虫编写的,它利用Lion蠕虫留下的后门(10008 端口的rootshell)进行传播。进入系统后,它会自动修补系统漏洞并清除掉Lion 蠕虫留下的所有痕迹。它的出现,被认为是对抗蠕虫攻击的一种新思路,但由于在实现上没有采取很好的控制措施,它最终还是对互联网的性能造成了负面的影响。
2001年7月18日,CodeRed蠕虫爆发,该蠕虫感染运行于Microsoft Index Server 2.0系统,或是在Windows 2000、IIS中启用了索引服务(Indexing Service)的系统。该蠕虫只存在于内存中,并不向硬盘中拷贝文件,它借助索引服务器的ISAPI扩展缓冲区溢出漏洞进行传播,通过TCP端口80,将自己作为一个TCP流直接发送到染毒系统的缓冲区,它会依次扫描Web,以便能够感染其他的系统,而且将感染对象锁定为英文系统。一旦感染了当前的系统,蠕虫会检测硬盘中是否存在c:\notworm,如果该文件存在,蠕虫将停止感染其他主机。随后几个月内产生了威力更强的几个变种,其中CodeRed II蠕虫造成的损失估计达12 亿美元,它与CodeRed相比作了很多优化,不再仅对英文系统发动攻击,而是攻击任何语言的系统,而且它还在遭到攻击的机器上植入特洛伊木马,使得被攻击的机器后门大开。CodeRed II拥有极强的可扩充性,可通过程序自行完成木马植入的工作,使得蠕虫作者可以通过改进此程序来达到不同的破坏目的。
2001年9月18日,Nimda蠕虫被发现,不同于以前的蠕虫,Nimda开始结合病毒技术,它通过搜索[SOFTWAREMicrosoftWindowsCurrentVersionApp Paths]来寻找在远程主机上的可执行文件,一旦找到,就会以病毒的方式感染文件。它的定性引起了广泛的争议,NAI(著名的网络安全公司)把它归类为病毒,CERT把它归类为蠕虫,Incidents.org(国际安全组织)同时把它归入病毒和蠕虫两类。自从它诞生以来到现在,无论哪里、无论以什么因素作为评价指标排出的十大病毒排行榜,它都榜上有名。该蠕虫只攻击微软公司的Windows系列操作系统,它通过电子邮件、网络共享、IE浏览器的内嵌MIME类型自动执行漏洞、IIS服务器文件目录遍历漏洞以及CodeRed II和sadmind/IIS蠕虫留下的后门共五种方式进行传播。其中前三种方式是病毒传播的方式。对Nimda 造成的损失评估数据从最早的5亿美元攀升到26亿美元后,继续攀升,到现在已无法估计。
2002年5月22日,SQL Snake蠕虫被发布,该蠕虫攻击那些配置上有漏洞的Microsoft SQL服务器。虽然蠕虫的传播速度并不快,但也感染了好几千台计算机,这充分说明了蠕虫作者所用技术的先进性,其中最重要的一点是该蠕虫的扫描地址不是随机产生的而是由蠕虫作者将最有可能被感染的那些地址集成到蠕虫个体当中去的,这大大提高了蠕虫成功的概率和攻击目标的明确性。SQL Snake蠕虫扫描指定地址的端口1433(这是SQL Server的默认端口),对那些开放了此端口的服务器则进一步用“SA”管理员账号进行连接,成功后,蠕虫会在系统内建立一个具有管理员级别的“GUEST”账号,并修改“SA”的账号口令,将新的口令发送到指定的邮箱,以备后用。
2003年1月25日,SQL Slammer(又名:Sapphire)蠕虫爆发,它是曾经出现过的传播速度最快的蠕虫,每隔8.5秒的时间它所感染的主机的数目就要翻一番,在10分钟的时间内它就感染了近90%的脆弱性主机。该蠕虫利用的是SQL服务器或MSDE 2000中包含的缓冲区溢出漏洞。该蠕虫的另一个特点是:它的代码仅有376字节,其负载也不过404字节。幸运的是,该蠕虫所利用的随机地址产生器存在缺陷,使很大一部分IP空间逃过了它的攻击。
在2002年后期至2003年初期,出现了很多新的蠕虫针对Windows系统的文件共享服务,但其中最厉害的一个是2003年3月11日发布的“deloder”蠕虫,该蠕虫并没有利用任何编程方面的漏洞,它借助的是弱口令给系统所带来的脆弱性,最终也同样造成了大量主机被攻击。这就警示用户在进行口令设置时不能只从易于记忆方面加以考虑,还要充分考虑口令的复杂性。
2003年8月11日,“冲击波”(WORM_MSBlast.A)开始在国内互联网和部分专用信息网络上传播。该蠕虫传播速度快、波及范围广,对计算机正常使用和网络运行造成了严重影响。该蠕虫在短时间内造成了大面积的泛滥,因为该蠕虫运行时会扫描网络,寻找操作系统为Windows 2000/XP的计算机,然后通过RPC DCOM(分布式组件模型)中的缓冲区溢出漏洞进行传播,并且该蠕虫会控制135、4444、69端口,危害计算机系统。被感染的计算机中Word、Excel、Powerpoint等类型文件无法正常运行,弹出找不到链接文件的对话框,“粘贴”等一些功能也无法正常使用,计算机出现反复重新启动等现象,而且该蠕虫还通过被感染系统向windowsupdate.microsoft.com网站发动拒绝服务攻击。自11日夜晚至12日凌晨在中国境内发现,仅3天的时间冲击波就已经使数十万台机器受到感染。
2004年1月27日和28日,网络蠕虫“Mydoom”及其变种“Mydoom.B”相继开始在互联网上迅速传播。它是一种利用邮件进行传播的蠕虫,可以利用自身的SMTP引擎创建邮件信息。感染后,它会从被感染计算机上获取邮件地址,并把自身发送到所获取的“寄件人”地址里,而且它还可以终止安全程序的运行。由于信件来自自己熟悉的人,所以很容易使人受骗而被感染。
2004年4月30日,震荡波(Sasser)被首次发现,虽然该蠕虫所利用的漏洞微软事先已公布了相应的补丁,但由于没能引起计算机用户的充分重视,还是导致其在短短一个星期时间之内就感染了全球1 800万台电脑,成为2004年当之无愧的“毒王”。它利用微软公布的Lsass漏洞进行传播,可感染WindowsNT/XP/2003等操作系统,开启上百个线程去攻击其他网上的用户,造成机器运行缓慢、网络堵塞。震荡波攻击成功后会在本地开辟后门,监听TCP 5554端口,作为FTP服务器等待远程控制命令,黑客可以通过这个端口偷窃用户机器的文件和其他信息。“震荡波”发作特点类似于前面所说的“冲击波”,会造成被攻击机器反复重启。
以上只是简单地回顾了一下从第一个蠕虫出现至今蠕虫发展的历史,并选择其中具有代表意义的蠕虫加以简单介绍。最近几年,随着信息交流方式的便捷,越来越多的蠕虫编写知识为更多的黑客所掌握,蠕虫编写技术也随之不断提高,新的蠕虫将会更加频繁地出现在互联网中,研究新的更为有效的蠕虫检测与防范手段成为当务之急。
研究概况编辑本段回目录
网络蠕虫虽然早在1988年就显示出它巨大的破坏力和危害性,但由于当时Internet还未普及,所以并没有引起人们更多的注意。从1990年开始,对抗恶意软件破坏的内容主要集中在个人电脑的防病毒上,科研人员的主要精力放在如何预防、检测和消除攻击个人电脑文件系统的病毒。虽然邮件病毒的出现,使人们认识到了Internet已经使病毒的性质发生了一些变化,需要调整研究方向和方法,但对于蠕虫的研究和防御到目前为止仍然比较少。1998年,Steve R. White就曾强调应该加强蠕虫对抗工作的研究力度[STEV1998],并指出:针对文件系统的防范措施并不适用于蠕虫的防范需求。2000年,IBM启动对抗网络蠕虫的项目,力求开发一个自动检测和防御蠕虫的软硬件环境,关键技术是构造虚拟机来仿真蠕虫传播的网络环境[ACMSS2000]。2001年,Jose Nazario等人讨论了蠕虫的技术发展趋势,给出了蠕虫的一个功能模型框架[NAWC2001]。2001年7月,红色代码蠕虫爆发后,针对蠕虫的研究逐渐重新成为热点。Berkeley大学Nicholas C Weaver给出了几种蠕虫的快速传播策略[WEAV2002][SPW2002],并预言在30分钟之内即可感染整个互联网的蠕虫将要出现,在蠕虫对抗技术方面他强调蠕虫的检测、分析和响应需要自动化,认为数学建模和仿真是研究蠕虫的主要手段,讨论了Wormhole和Honey Farm的功能和应用策略;邹长春以红色代码蠕虫为例,讨论了基于微分方程描述的双因素传播模型,这个模型可以看做是SIR传播模型的一种扩展[ZGT2002]。David Moore提出了衡量防范蠕虫技术的有效性的三个参数:响应时间、防范策略和布置策略[MSVS2003],他认为目前的防治技术在这三个参数上都远远达不到对蠕虫防治的要求。
近年来,随着互联网的普及,人们对互联网的认识越来越深入,大量的蠕虫工具包和蠕虫编写文章在网上出现,使得蠕虫编写工作的难度越来越低。新的蠕虫层出不穷,所造成的危害也越来越大,其危害程度已经远远超过传统的病毒,使人们逐步认识到研究蠕虫对抗措施的重要性。但目前研究工作还主要集中在对已有蠕虫的检测与防范上,使蠕虫的防范工作处于一种非常被动的地位。为了改变这种被动的局面,人们正在研究能够检测与防范未知蠕虫的准确有效的方法,并已经取得一些初见成效的成果。
蠕虫与病毒的区别编辑本段回目录
1.病毒的定义
Fred Cohen在1984年给出的计算机病毒的定义是:计算机病毒是一种程序,它可以感染其他程序,感染的方式为在被感染程序中加入计算机病毒的一个副本,这个副本可能是在原病毒基础上演变过来的[COHE1985]。
1988年Morris蠕虫爆发后,Eugene H. Spafford为了区分蠕虫和病毒,将病毒含义作了进一步的解释:“计算机病毒是一段代码,能把自身加到其他程序(包括操作系统)上。它不能独立运行,需要由它的宿主程序运行来激活它。”[SPAF1988]
2.病毒的种类
按照Symantec公司对病毒的分类,现在的病毒主要分为5类:文档型病毒,引导区型病毒,主引导记录型病毒,复合型病毒和宏病毒。虽然每种病毒感染的目标不完全相同,但它们都具备病毒最主要的两个特征:① 设法使自己得以运行;② 能实现自我复制。
(1)文档型病毒:此类病毒通过感染文件来达到攻击的目的,通常是感染可执行文件,如:.com或者.exe文件。每当计算机用户运行这些被感染的文件时,病毒也同时被激活。这类病毒通常是内存驻留型的,一旦病毒被激活就会在关机前一直驻留在内存中,每当用户执行其他的可执行文件时,这些文件就会被驻留在内存中的病毒所感染,因此其危害非常的严重。典型的文档型病毒如耶路撒冷病毒等。
(2)引导区型病毒:此类病毒感染的是磁盘的系统区,即磁盘上的系统引导记录。所有的磁盘在其引导记录中都包含有一个小的引导程序,这部分程序在每次用磁盘启动的时候都会被执行,引导区型病毒通过与引导记录进行绑定每次开机时都得到执行,而且它们通常都是内存驻留型的。典型的引导区型病毒如磁盘杀手病毒等。
(3)主引导记录型病毒:这种病毒也是内存驻留型的,它用与引导区型病毒相同的方式来感染磁盘。但它们的区别在于主引导记录型病毒通常会在磁盘的其他地方为主引导记录保存一份正确的副本。典型的主引导记录型病毒如AntiExe病毒等。
(4)复合型病毒:此类病毒既感染引导区,又感染程序文件。此类病毒比较难于清除,因为只清除某一部分的病毒,并不能真正将所感染病毒清除,事后在条件满足的情况下已清除部分仍然会被重新感染。典型的复合型病毒如Emperor病毒等。
(5)宏病毒:此类病毒感染的是数据文件。它主要是利用软件自身所提供的宏能力来设计病毒,所以凡是具有写宏能力的软件都有宏病毒存在的可能,如Word、Excel、AmiPro都曾遭受过宏病毒的危害。典型的宏病毒如Taiwan NO.1 Word宏病毒。
3.两者区别
通过前面蠕虫与病毒的定义及病毒常见种类的介绍,不难看出蠕虫与病毒最主要的两点区别。
(1)主动性方面:蠕虫的传播具有很强的主动性,它的运行与传播并不需要计算机使用者的干预;而病毒则必须要借助计算机使用者的某种操作来激活它,这样才能达到其攻击的目的。
(2)感染对象方面:蠕虫感染的对象是有相应漏洞或者其他脆弱性的计算机系统,而病毒的感染对象则是计算机中的文件系统。
通过上面两点主要区别,读者已经基本可以对蠕虫与病毒加以区分。例如“NAVIDAD网络蠕虫”、“Blebla.B网络蠕虫”、“VBS_KAKWORM.A蠕虫”等,虽然它们以蠕虫命名,但它们本质上却是病毒,并非蠕虫。
蠕虫的常见传播策略
蠕虫利用系统漏洞进行传播首先要进行主机探测。ICMP Ping包和TCP SYN、FIN、RST及ACK包均可用于探测。良好的扫描策略能够加速蠕虫传播,理想化的扫描策略能够使蠕虫在最少的时间找到互联网上全部可以感染的主机。按蠕虫对目标地址空间的选择方式进行分类,扫描策略包括:选择性随机扫描、顺序扫描、基于目标列表的扫描、基于路由的扫描、基于DNS扫描、分治扫描等。
1.选择性随机扫描
随机扫描会对整个地址空间的IP随机抽取进行扫描,而选择性随机扫描(Selective Random Scan)将最有可能存在漏洞主机的地址集作为扫描的地址空间,也是随机扫描策略的一种。所选的目标地址按照一定的算法随机生成,互联网地址空间中未分配的或者保留的地址块不在扫描之列。例如Bogon列表[bogon-list]中包含近32个地址块,这些地址块对公网中不可能出现的一些地址进行了标识。选择性随机扫描具有算法简单,易实现的特点,若与本地优先原则结合则能达到更好的传播效果。但选择性随机扫描容易引起网络阻塞,使得网络蠕虫在爆发之前易被发现,隐蔽性差。“CodeRed”、“Slapper”和“Slammer”的传播采用了选择性随机扫描策略。
2.顺序扫描
顺序扫描(Sequential Scan)是被感染主机上蠕虫会随机选择一个C类网络地址进行传播,根据本地优先原则,蠕虫一般会选择它所在网络内的IP地址。若蠕虫扫描的目标地址IP为A,则扫描的下一个地址IP为A+1或者A-1。一旦扫描到具有很多漏洞主机的网络时就会达到很好的传播效果。该策略的不足是对同一台主机可能重复扫描,引起网络拥塞。“W32.Blaster”是典型的顺序扫描蠕虫。
3.基于目标列表的扫描
基于目标列表扫描(Hit-list Scan)是指网络蠕虫在寻找受感染的目标前,预先生成一份易感染的目标列表,然后对该列表进行攻击尝试和传播。目标列表生成方法有两种:① 通过小规模的扫描或者互联网的共享信息产生目标列表;② 通过分布式扫描可以生成全面列表的数据库。理想化蠕虫“Falsh”就是一种基于IPv4地址空间列表的快速扫描蠕虫。
4.基于路由的扫描
基于路由的扫描(Routable Scan)是指网络蠕虫根据网络中路由信息,对IP地址空间进行选择性扫描的一种方法。采用随机扫描的网络蠕虫会对未分配的地址空间进行探测,而这些地址大部分在互联网上是无法路由的,因此会影响到蠕虫的传播速度。如果网络蠕虫能够知道哪些IP地址是可路由的,则它能够更快、更有效地进行传播,并能逃避一些对抗工具的检测。
网络蠕虫的设计者通常利用BGP路由表公开的信息,获取互联网路由的IP地址前辍,然后来验证BGP数据库的可用性。基于路由的扫描大大提高了蠕虫的传播速度,以“CodeRed”为例,路由扫描蠕虫的感染率是采用随机扫描蠕虫感染率的3.5倍[ZTGC2003]。基于路由的扫描的不足是网络蠕虫传播时必须携带一个路由IP地址库,蠕虫代码量大。
5.基于DNS扫描
基于DNS扫描(DNS Scan)是指网络蠕虫从DNS服务器获取IP地址来建立目标地址库,该扫描策略的优点在于获得的IP地址块具有针对性强和可用性高的特点。
基于DNS扫描的不足是:① 难于得到有DNS记录的完整地址列表;② 蠕虫代码需要携带非常大的地址库,传播速度慢;③ 目标地址列表中地址数受公共域名主机的限制。例如“CodeRed I”所感染的主机中几乎一半没有DNS记录[MSC2002]。
6.分治扫描
分治扫描(Divide-Conquer Scan)是网络蠕虫之间相互协作快速搜索易感染主机的一种策略,网络蠕虫发送地址库的一部分给每台被感染的主机,然后每台主机再去扫描它所获得的地址。主机A感染了主机B后,主机A将它自身携带的地址分出一部分给主机B,然后主机B开始扫描这一部分地址。
分治扫描策略的不足是存在“坏点”问题。在蠕虫传播的过程中,如果一台主机死机或崩溃,那么所有传给它的地址库就会丢失。这个问题发生的越早,对传播的影响就越大。有三种方法能够解决这个问题:① 在蠕虫传递地址库之前产生目标列表;② 通过计数器来控制蠕虫的传播情况,蠕虫每感染一个节点计数器加一,然后根据计数器的值来分配任务;③ 蠕虫传播的时候随机决定是否重传数据库。
7.扫描策略评价
网络蠕虫传播速度的关键影响因素有4个:① 目标地址空间选择;② 是否采用多线程搜索易感染主机;③ 是否有易感染主机列表(Hit-list);④ 传播途径的多样化。各种扫描策略的差异主要在于目标地址空间的选择。网络蠕虫感染一台主机的时间取决于蠕虫搜索到易感染主机所需要的时间。因此,网络蠕虫快速传播的关键在于设计良好的扫描策略。一般情况下,采用DNS扫描传播的蠕虫速度最慢,选择性扫描和路由扫描比随机扫描的速度快;对于Hit-list扫描,当列表超过1M字节时蠕虫传播的速度就会比路由扫描蠕虫慢;当列表大于6M字节时,蠕虫传播速度比随机扫描还慢。分治扫描目前还没有找到易于实现且有效的算法。
目前网络蠕虫首先采用路由扫描,再利用随机扫描进行传播是最佳选择。
简介编辑本段回目录
生物学上的蠕虫:多细胞无脊椎动物的一种。
蠕虫藉由身体的肌肉收缩而作蠕形运动,故通称为蠕虫。在动物分类学史上,蠕虫曾被认为是独立的,具有特殊性的一类动物。但在分类学研究不断发展之后,人们发现蠕虫,实际上与人体有关系的包括扁形动物门(Phylum Platyhelminthes)、线形动物门(Phylum Nemathelminthes)和棘头动物门(Phylum Acanthocephala)所属的各种动物。因此在分类学上,蠕虫这个名称已无意义;但习惯上仍沿用此词。由蠕虫引起的疾病称为蠕虫病,具有重要意义的蠕虫种类几乎全部属于前两门。
网络中所谓的蠕虫(Worm)指计算机病毒中的蠕虫病毒。
蠕虫病毒是一种常见的计算机病毒。它的传染机理是利用网络进行复制和传播,传染途径是通过网络、电子邮件以及优盘、移动硬盘等移动存储设备。比如去年以来危害及大的“熊猫烧香”病毒就是蠕虫病毒的一种。蠕虫程序主要利用系统漏洞进行传播。它通过网络、电子邮件和其它的传播方式,象生物蠕虫一样从一台计算机传染到另一台计算机。因为蠕虫使用多种方式进行传播,所以蠕虫程序的传播速度是非常大的。
蠕虫侵入一台计算机后,首先获取其他计算机的IP地址,然后将自身副本发送给这些计算机.蠕虫病毒也使用存储在染毒计算机上的邮件客户端地址簿里的地址来传播程序。虽然有的蠕虫程序也在被感染的计算机中生成文件,但一般情况下,蠕虫程序只占用内存资源而不占用其它资源。
蠕虫病毒与一般病毒的异同:
蠕虫也是一种病毒,因此具有病毒的共同特征。一般的病毒是需要的寄生的,它可以通过自己指令的执行,将自己的指令代码写到其他程序的体内,而被感染的文件就被称为”宿主”,例如,Windows下可执行文件的格式为PE格式(Portable Executable),当需要感染pe文件时,在宿主程序中,建立一个新段,将病毒代码写到新段中,修改的程序入口点等,这样,宿主程序执行的时候,就可以先执行病毒程序,病毒程序运行完之后,在把控制权交给宿主原来的程序指令。可见,病毒主要是感染文件,当然也还有像DIRII这种链接型病毒,还有引导区病毒。引导区病毒他是感染磁盘的引导区,如果是软盘、U盘(闪存盘)、移动硬盘等被感染,这张受感染的盘用在其他机器上后,同样也会感染其他机器,所以传播方式也可以是移动存储设备。
蠕虫一般不采取利用PE格式插入文件的方法,而是复制自身在互联网环境下进行传播,病毒的传染能力主要是针对计算机内的文件系统而言,而蠕虫病毒的传染目标是互联网内的所有计算机.局域网条件下的共享文件夹,电子邮件Email,网络中的恶意网页,大量存在着漏洞的服务器等都成为蠕虫传播的良好途径。网络的发展也使得蠕虫病毒可以在几个小时内蔓延全球!而且蠕虫的主动攻击性和突然爆发性将使得人们手足无策!
蠕虫病毒的工作模式:
蠕虫病毒由两部分组成:一个主程序和一个引导程序。 主程序一旦在机器上建立就会去收集与当前机器联网的其它机器的信息。它能通过读取公共配置文件并运行显示当前网上联机状态信息的系统实用程序而做到这一点。随后,它尝试利用前面所描述的那些缺陷去在这些远程机器上建立其引导程序。
蠕虫病毒程序常驻于一台或多台机器中,并有自动重新定位(autoRelocation)的能力。如果它检测到网络中的某台机器未被占用,它就把自身的一个拷贝(一个程序段)发送给那台机器。每个程序段都能把自身的拷贝重新定位于另一台机器中,并且能识别它占用的哪台机器。
蠕虫历史:1982年,Shock和Hupp根据The Shockwave Rider一书中的一种概念提出了一种“蠕虫”(Worm)程序的思想。 蠕虫程序可用作为Ethernet(以太网)网络设备的一种诊断工具,它能快速有效地检测网络。
蠕虫病毒防治方法:使用具有实时监控功能的杀毒软件,并且注意不要轻易打开、运行不明来源的文件。
蠕虫的检测与防范
随着蠕虫技术的不断发展,网络蠕虫已经成为网络系统的极大威胁,如果不能很好地应对这些威胁,日益猖獗的蠕虫活动必然会给我们造成巨大的损失。准确有效的蠕虫检测与防范技术则是消除这种威胁、减轻蠕虫危害的重要手段。
本节讨论目前人们在蠕虫检测与防范的研究上所取得的主要成果。
6.6.1 基于单机的蠕虫检测
网络蠕虫的检测技术与网络蠕虫编写技术永远是在斗争中相互促进的。随着蠕虫技术的不断发展,安全研究人员也在对蠕虫编写及蠕虫特征的研究基础上不断完善和丰富网络蠕虫的检测技术,准确高效的网络蠕虫检测技术是人们对抗网络蠕虫的首要条件。
1.基于特征的检测技术
基于特征①的蠕虫检测技术的核心是模式匹配[GREN1993]。每当新的蠕虫出现时,研究人员通过对蠕虫的研究提取出能充分识别该蠕虫的特征字符串,形成对该蠕虫的特征描述,加到相应的特征库中,这些特征可能是恶意的网络负载,也可能是蠕虫可执行代码中的部分样本代码等。有了该蠕虫的特征之后,当再有此类蠕虫爆发或者此类蠕虫在其他地方爆发时就可以通过该特征进行识别,以便采取进一步的防范措施加以阻止。对于基于特征的蠕虫检测软件来说,特征库是这类软件设计中非常重要的部件,因为特征库的质量高低直接影响软件的准确性和有效性。
目前基于特征的蠕虫检测技术主要有三种类型:① 基于网络负载的特征匹配。这种技术广泛应用于网络入侵检测系统中,通过被动监听网络中传输的数据包并将它们与特征库中的特征加以匹配来检测蠕虫的存在与否。② 基于日志分析的特征匹配。由于蠕虫本身的攻击性,导致经蠕虫访问过的计算机会在其应用程序或者系统的日志中记下有关蠕虫行为的蛛丝马迹,这些痕迹包括未授权访问或者由蠕虫异常操作而引起的程序异常等。③ 基于文件内容的特征匹配。这是普遍采用的一种基于特征的蠕虫检测技术,大多数的蠕虫在攻击成功后,会向被攻击的计算机上传送自身的可执行文件,通过为这些文件建立特征,可以及时地发现计算机中是否存在相应的蠕虫个体。
基于特征的蠕虫检测技术具有高效、准确的特点,但它也有致命的缺点,那就是:只要蠕虫的个体稍有变异,这种方法往往就失去效力。这也是为什么一个新的蠕虫出现后会有许多变种紧随出现的原因。另外,由于在检测过程中要用到蠕虫的特征,所以这种技术是一种后发的对抗方式。
2.网络黑洞检测技术
网络黑洞指的是网络中没有分配的IP地址空间。由于蠕虫作者在编写蠕虫时出于减小蠕虫个体的大小(相对携带有效IP空间块的蠕虫而言)或者扩大蠕虫影响范围的考虑,往往会采用对全部IP地址进行扫描探测的方法,而正常的网络通信一般不会涉及这些并不使用的IP地址。根据这一点,就可以通过对与网络黑洞相关的数据包的监控来实现恶意行为的检测,通过对所监测到的数据进行分析,就可以及时发现网络中出现的蠕虫攻击行为。
这种技术的优点是对所有扫描全网的蠕虫都适用,无论是已知蠕虫还是未知蠕虫,但对于采用队列扫描和基于目标列表扫描的蠕虫来说却不适用。
3.基于流量的检测方法
基于流量的检测方法是一种非常有效的蠕虫检测方法,它充分利用没有蠕虫与存在蠕虫时流量的差异性来实现蠕虫的检测。通常情况下,一台主机或者一个局域网在正常运转的情况下其每天的平均流量几乎是相等的,即使稍有变化也是在很小的范围内波动,但总体上是稳定的。当遭受蠕虫入侵后其网络流量则会出现较大幅度的变化。因为所有的蠕虫在展开攻击前都要先通过扫描探测模块来发现其要攻击的目标,而且在攻击成功后往往还要完成其负载的传播,由于整个过程是蠕虫自主发起的,探测频率一般非常高,所以通常会在短期内产生大量的扫描探测包,使网络的流量迅速增加,甚至会造成网络的瘫痪。
基于流量的检测方法的难点在于各种参数的阈值的确定,这影响着检测结果的准确性,阈值设置得太低容易造成太多的误报,而如果设置得太高,则又容易造成漏报而起不到应有的检测作用。解决这个问题的通常的方法是在基于流量的蠕虫检测软件中引入自学习功能,先让该软件在正常运转的网络或者系统中自学习一段时间,通过这段时间的自学习使其为所监控的对象建立一个比较合理的阈值,以后就可以根据建立好的阈值来进行蠕虫的检测。为了使阈值能适应网络或者系统正常的流量变化,还可以引入其他的措施来保障阈值的定期更改。
基于流量的蠕虫检测技术与其他的蠕虫检测技术相比较,它不仅对已知的蠕虫有效,而且能及时地检测未知的蠕虫,改变了蠕虫防范的被动局面。
4.校验和技术
校验和技术,是一种保护信息资源完整性的控制技术[COHECC1987][COHEIP1987],例如Hash值和循环冗余码等。只要文件内部有一个比特发生了变化,校验和值就会改变。未被网络蠕虫感染的系统首先会生成检测数据,然后周期性地使用校验和法检测文件的改变情况。
运用校验和法检查网络蠕虫有3种方法:
(1)在网络蠕虫检测软件中设置校验和法。对检测的对象文件计算其正常状态的校验和并将其写入被查文件中或检测工具中,而后进行比较。
(2)在应用程序中嵌入校验和法。将文件正常状态的校验和写入文件本身中,每当应用程序启动时,比较现行校验和与原始校验和,实现应用程序的自我检测功能。
(3)将校验和程序常驻内存。每当应用程序开始运行时,自动比较检查应用程序内部或别的文件中预留保存的校验和。
校验和法可以检测未知网络蠕虫对文件的修改,但也有两个缺点:首先,校验和法实际上不能检测文件是否被网络蠕虫感染,它只是查找变化。即使发现网络蠕虫造成了文件的改变,校验和法也无法将网络蠕虫消除,也不能判断究竟被那种网络蠕虫感染。其次,网络蠕虫可以采用多种手段欺骗校验和法,使之认为文件没有改变。
5.沙箱技术
沙箱技术[WEBS2002],系指根据系统中每一个可执行程序的访问资源,以及系统赋予的权限建立应用程序的“沙箱”,限制网络蠕虫的运行。每个应用程序都运行在自己的且受保护的“沙箱”之中,不能影响其他程序的运行。同样,这些程序的运行也不能影响操作系统的正常运行,操作系统与驱动程序也存活在自己的“沙箱”之中。加州大学Berkeley实验室开发了基于Solaris操作系统的沙箱系统,应用程序经过系统底层调用解释执行,系统自动判断应用程序调用的底层函数是否符合系统的安全要求,并决定是否执行。对于每个应用程序,沙箱都为其准备了一个配置文件,限制该文件能够访问的资源与系统赋予的权限。WindowsXP操作系统提供了一种软件限制策略,隔离具有潜在危害的代码。这种隔离技术其实也是一种沙箱技术,可以保护系统免受通过电子邮件和Internet传染的各种网络蠕虫的侵害。这些策略允许选择系统管理应用程序的方式:应用程序既可以被“限制运行”,也可以“禁止运行”。通过在“沙箱”中执行不受信任的代码与脚本,系统可以限制甚至防止网络蠕虫对系统完整性的破坏。
6.安全操作系统对网络蠕虫的防范
网络蠕虫成功入侵的重要一环是,获得系统的控制权,使操作系统为它分配系统资源。Cohen指出,无论哪种网络蠕虫,无论要达到何种恶意目的,都必须具有相应的权限。没有足够的权限,网络蠕虫不可能实现其预定的恶意目标,或者仅能够实现其部分恶意目标[COHE1987][ZHAO2002]。如果能够合理控制程序访问系统客体的操作,则程序对系统的危害也将被限制。通过安全操作系统的强制存取控制机制可以将计算机系统划分为三个空间:系统管理空间、用户空间和保护空间。强制存取控制机制将进入系统的用户划分为两类:不具有特权的普通用户和系统管理员。系统管理空间不能被普通用户读写,如TCB数据、审计信息等,这样TCB使用访问隔离的方法进行自我保护,保护自身的安全使TCB可信。用户空间包含用户的应用程序和数据,用户可以进行读写。保护空间包含不能被用户空间的进程修改的程序和数据,但可被用户空间的进程读取。一般通用的命令和应用程序放在保护空间内,供用户使用。由于普通用户对此空间的程序和数据只读不可写,从而限制了网络蠕虫的传播。在用户空间区,由于用户的安全级别不同,即使网络蠕虫发作也只能传染同级别用户的程序和数据,缩小了网络蠕虫传播的范围。
6.6.2 基于网络的蠕虫检测
网络蠕虫已经成为网络系统的极大威胁,由于网络蠕虫具有相当的复杂性和行为不确定性,网络蠕虫的防范需要多种技术综合应用,包括网络蠕虫监测与预警、网络蠕虫传播抑制、网络蠕虫漏洞自动修复、网络蠕虫阻断等,本节下面将主要讨论近几年发展的网络蠕虫检测防御技术。
1.基于GrIDS的网络蠕虫检测
著名的入侵检测系统GrIDS[CHLRSYZ1999]主要针对大规模网络攻击和自动化入侵设计的,它收集计算机和网络活动的数据以及它们之间的连接,在预先定义的模式库的驱动下,将这些数据构建成网络活动行为来表征网络活动结构上的因果关系。它通过建立和分析节点间的行为图(Activity Graph),通过与预定义的行为模式图进行匹配,检测网络蠕虫是否存在,被认为是当前有效检测分布式网络蠕虫入侵的工具之一。
但是通过分析认为,GrIDS在检测大规模网络蠕虫的入侵仍存在以下不足:GrIDS的探测点对网络中传输的包信息不进行基于上下文的相关性分析,没有充分利用更多的、有效的数据,只做简单的基于事件的关联分析;GrIDS没有对TCP连接中的目标地址和目标服务做有效性分析,而上述分析是判断未知主动式传播网络蠕虫入侵网络的重要依据;GrIDS检测到网络蠕虫后,由于没有建立任何响应机制,不能提供与内部探测点与外部防火墙的互动,因此不能形成有效的预警和防范机制。
2.基于PLD硬件的检测和防御
华盛顿大学应用研究室的John W. Lockwood,James Moscola1和Matthew Kulig等提出了一种采用可编程逻辑设备(Programmable Logic Devices,PLDs)对抗网络蠕虫的防范系统[LMKR2003]。该系统由三个相互内联的部件组成,即数据获取部件(Data Enabling Device,DED)、内容匹配服务器(Content Matching Server,CMS)和区域事务处理器(Regional Transaction Processor,RTP)。DED负责捕获流经网络出入口的所有数据包,根据CMS提供的特征串或规则表达式对数据包进行扫描匹配并把结果传递给RTP;CMS负责从后台的MySQL数据库中读取已经存在的网络蠕虫特征,编译综合成DED设备可以利用特征串或规则表达式;RTP根据匹配结果决定DED采取何种操作。网络蠕虫大规模入侵时,系统管理员首先把该网络蠕虫的特征添加到CMS的特征数据库中,DED扫描到相应特征才会请求RTP做出放行还是阻断等响应。
该系统具有以下优点:① DED采用高速硬件FPX(Field-programmable Port Extender)实现其核心功能,对数据包的扫描速率可以实现2.4Gbps,所以该系统能够实现大规模高速网络环境对网络蠕虫的检测;② 高速硬件FPX比软件系统更容易实现并行技术。
系统存在的不足包括:① 只能进行事后处理,不能检测和防御未知网络蠕虫;② 采用特征匹配技术,存在一定的误报率。
3.基于蜜罐的检测和防御
早期的蜜罐HoneyPot[HONE2001]主要用于防范网络黑客攻击。ReVirt[GSSMP2002]是能够检测网络攻击或网络异常行为的蜜罐系统。Spitzner首次运用蜜罐[SPIT2002]防御恶意代码攻击。文献[PROV2003]提出了采用虚拟蜜罐检测和阻断恶意代码攻击的防范框架,其主要实现是在边界网关或易受到网络蠕虫攻击的地方置放多个的虚拟蜜罐,蜜罐之间可以相互共享捕获的数据信息,采用NIDS的规则生成器产生网络蠕虫的匹配规则,当网络蠕虫根据一定的扫描策略扫描存在漏洞主机的地址空间时,蜜罐可以捕获网络蠕虫扫描攻击的数据,然后采用特征匹配来判断是否有网络蠕虫攻击。此外蜜罐能够阻断网络蠕虫的攻击。Oudot用蜜罐实现对“W32.Blaster”的检测与防御。
用蜜罐实现蠕虫的检测与防御具有以下优点:① 蜜罐可以转移网络蠕虫的攻击目标,降低网络蠕虫的攻击效果;② 蜜罐为网络安全人员研究网络蠕虫的工作机制、追踪网络蠕虫攻击源和预测网络蠕虫的攻击目标等提供了大量有效的数据;③ 由于网络蠕虫缺乏判断目标系统用途的能力,所以蜜罐具有良好的隐蔽性。
蜜罐在检测与防御蠕虫方面还存在以下一些不足:① 蜜罐能否诱骗网络蠕虫依赖于大量的因素,包括蜜罐命名、蜜罐置放在网络中的位置和蜜罐本身的可靠性等;② 蜜罐可以发现大量扫描行为(随机性扫描、顺序扫描等)的网络蠕虫,但针对路由扫描和DNS扫描的网络蠕虫,效果欠佳;③ 蜜罐很少能在网络蠕虫传播的初期发挥作用。
4.基于控制中心的检测、防御和阻断
由于主动式传播网络蠕虫具有生物病毒特征,美国安全专家提议建立网络空间中的疾病控制中心(The Cyber Centers for Disease Control,CCDC)来对抗网络蠕虫攻击[WPSC2003]。防范网络蠕虫的CCDC体系实现以下功能:① 鉴别网络蠕虫的爆发期;② 网络蠕虫样本特征分析;③ 网络蠕虫传染对抗;④ 网络蠕虫新的传染途径预测;⑤ 前摄性网络蠕虫对抗工具研究;⑥ 对抗未来网络蠕虫的威胁。CCDC能够实现对大规模网络蠕虫入侵的预警、防御和阻断。但CCDC也存在一些问题:① CCDC是一个规模庞大的防范体系,要考虑体系运转的代价;② 由于CCDC体系的开放性,CCDC自身的安全问题不容忽视;③ 在CCDC防范体系中,攻击者能够监测网络蠕虫攻击的全过程,深入理解CCDC防范网络蠕虫的工作机制,因此可能导致突破CCDC防范体系的网络蠕虫出现。
6.6.3 其他
前面讲述的蠕虫检测技术为我们及时发现网络蠕虫的爆发提供了可能,但真正要阻止蠕虫的传播与危害则必须采取进一步的防范措施。
本节从人与物两个层面来探讨了蠕虫防范的具体方法,通过这些方法的完美结合可以构造起一个相对完善的蠕虫防范体系,从而有效抑制网络蠕虫的传播与危害。
1.加强人的安全意识
人作为计算机的使用者和最终的指挥者,是信息安全框架中的重要组成部分,这一点在过去却往往被忽视,人们将信息安全的保障经常寄希望于购置各种必需的安全产品,以为有了这些安全产品就可以高枕无忧,所以导致即使花大量费用购置了安全产品的政府以及企业仍然没有摆脱遭受攻击的烦恼。在2002年何德全院士就曾提到“提高网络安全意识”的重要性,指出“人作为主体是网络发展的基本动力和信息安全的最终防线”。
对安全要求比较高的单位只有通过培训等方式努力提高计算机用户与管理者的网络安全意识,使计算机的维护者与相应的安全维护软件达到较好的互动,才能真正发挥安全产品的最大性能,达到最大程度的安全保障。
蠕虫进行的弱口令攻击、默认设置脆弱性攻击以及社交工程攻击等也只有靠提升计算机使用的安全意识才能做到有效防范。
2.提高软件产品的安全性
增强人的安全意识,是一种从外围来加强安全防范的方法;提高软件产品的安全性,尽可能减少软件中出现漏洞的可能,却是从内部提高软件和系统的安全性。高质量的软件产品不仅能减少软件被网络加以利用的可能,而且能够减轻软件使用与维护者的负担。
软件产品的安全性由多方面的因素决定,但从目前网络蠕虫所利用的漏洞情况来看,软件中缓冲区溢出的问题则是亟待解决的首要问题,毕竟有近80%的攻击源自缓冲区溢出漏洞。本节主要讨论了防范缓冲区溢出的思路与方法。至于其他影响软件安全的问题与解决方法在Michael Howard和David LeBlanc著的《Writing Secure Code》中有更为全面的介绍,此处不再讨论。
由缓冲区溢出攻击,我们知道,造成缓冲区溢出的条件无非有两点:① 软件设计中变量缺乏必要的边界检查。这方面最明显的例子是C和C++语言,由于一开始设计的时候C和C++就没有为数组和字符指针的引用提供任何的边界检查机制,从而导致了它们的不安全性。而它们是日常开发中使用最广的语言,甚至连Windows/Unix这两个广泛使用的操作系统的很多模块也是用它们开发的,所以造成现在缓冲区溢出漏洞频频暴露。并且用它们开发的大部分软件在今后很长一段时间里仍会被使用,这也就给缓冲区溢出攻击的存在提供了有利环境。② 操作系统设计策略上的隐患。这方面主要是指堆栈和堆数据区的可执行属性。Unix和MS Windows系统为实现更好的性能和功能,往往在数据段中动态地植入可执行的代码,为了保持程序的兼容性,使堆栈和堆具有可执行的属性。但从二者用途本质——存储数据——来看,赋予堆栈和堆可执行的属性是不必要的。而且堆栈和堆作为程序跟用户交互的窗口,赋予其可执行的权力本身就对系统安全构成了威胁。
面对缓冲区溢出攻击的挑战,研究人员根据各种攻击的机制和造成缓冲区溢出的根本原因,提出了不同的防范措施。现在常见的防范措施主要有如下几种:
(1)安全地编码
现在缓冲区溢出攻击之所以成为主要攻击手段,除了程序语言本身和操作系统设计策略上的缺陷外,人为因素也占了很大比重,由于以前人们在编码过程中的安全意识不强或急于完成任务而忽略了对所编代码安全性的检查,造成隐患。提高编码者的安全意识,消除造成缓冲区溢出攻击的人为因素,可以大大减少这类攻击的发生。
安全地编码首先尽量选用自带边界检查的语言(如:Perl、Python和Java等)来进行程序开发;其次在使用像C这类的开发语言时要做到尽量调用安全的库函数,例如:用strncpy()函数来代替对strcpy()函数的调用,或者对不安全的函数调用进行必要的边界检查。
编写正确安全的代码,除了思想上要注意外,还可以借助现有的一些辅助检测工具。例如:使用源代码扫描工具PurifyPlus可以帮助发现程序中可能导致缓冲区溢出的部分。
这种措施的缺点是:对人的依赖性太强,现实中程序员要受多方面因素的影响,很难取得满意的效果。
(2)非可执行的缓冲区
除了基于LIB库的缓冲区溢出攻击外,所有其他的缓冲区溢出攻击方式之所以得逞是由于操作系统赋予了缓冲区可执行的属性。取消缓冲区的可执行属性,虽然会引起操作系统作相应的变化,但对遏制缓冲区溢出攻击的作用却非常显著。
这种方法对基于堆栈和堆的缓冲区溢出攻击效果较好,但对基于LIB库的缓冲区溢出攻击却无能为力。
(3)数组边界检查
通过对所输入的或将传给函数的字符串的长度做严格的边界检查,就可杜绝溢出的发生,也就不可能再发生缓冲区溢出攻击。但这种措施仍然是对人的依赖性太强,而很难取得良好的效果。
为了减轻编程者的操作量,人们开发了很多工具进行数组边界检查,常见的有:Compaq C编译器、Richard Jones和Paul Kelly开发的gcc补丁等。
(4)加强对返回地址的保护
返回地址在缓冲区溢出攻击中扮演了极其重要的角色,攻击者需要借助对它的修改来使程序转向选定的库函数或者向着预先植入的恶意代码方向去执行。通过在系统的其他地方对正确的返回地址进行备份,在返回前对两者进行核对可以成功阻断攻击。
这种措施仅局限于遏制通过修改返回地址来实现跳转的攻击方式,不能防范基于堆的缓冲区溢出攻击。
(5)及时打补丁或者升级
漏洞补丁的及时安装是降低缓冲区溢出攻击及其他网络安全威胁的最易见成效办法,这种办法特别适合于那些普通的计算机用户。
以上几种防范措施是目前最为常见的防范缓冲区溢出攻击的方法,但它们或者是对人的依赖性太强,增加了相应人员的负担;或者只适用于某种特定类型的缓冲区溢出攻击。
综合对缓冲区溢出攻击原理和现有防范方法的研究与分析,文伟平等提出了一种从编译器级和系统级进行改进来防范缓冲区溢出攻击的方法,其基本思路如下:
(1)在编译器方面,通过对编译器源代码的修改使其在编译的过程中为字符串数组加上“特定符号”用以标示字符串的最大长度。
通过反汇编含有字符串数组的程序的二进制可执行文件,我们会发现编译器所做的工作仅仅是为函数的局部变量预留了足够正常使用所需要的空间,除此并没有做其他有用的工作。例如下面的程序。
int main()
{
char str[8];
strcpy(str, "abcdefghijaaaabbbbccccddddeeeeffff "); //此处产生溢出
return 1;
}
用通常的编译器进行编译后其反汇编代码如图6.12所示。
从图中的反汇编代码可以看出,虽然编译器为函数中的字符串数组分配了空间,但并没有标识数组的末尾位置,所以根本无法正确测量字符串数组的确切大小,从而导致无法进行严格的边界检查。另外,观察所有用通常编译器编译的可执行文件的反汇编代码会发现:反汇编代码的前两个语句(pushl %ebp、movl %esp, %ebp)和后两个语句(leave、ret)是所有反汇编代码中共有的部分与程序的源代码没有关系。这就证明这四条语句是由编译器在编译的过程中为所编译程序自动添加的,这就为添加标示字符串最大长度的“特定符号”提供了一个很好的接口。在实验中以字符‘~’(其ASCII码为126)作为“特定符号”,经过修改后的编译器编译出来的二进制文件的反汇编代码如图6.13所示。
图6.12 普通编译器得出的反汇编代码
图6.13 修改后编译器得出的反汇编代码
从图6.13可以看出,对编译器所做的修改主要有两部分:① 改自动添加“pushl %ebp、movl %esp, %ebp”为自动添加“pushl %ebp、movl %esp, %ebp、movl $126, %eax、pushl %eax”,改自动添加“leave、ret”为自动添加“leave、ret、popl %eax”;② 修正程序内部对局部变量的定位数值,在此程序中就是将“leal -8(%ebp), %eax”修正为“leal -12(%ebp), %eax”。
(2)在系统级,为了配合在编译器级所做的修改工作,采取的措施是用一个新的拷贝函数(记作SecurityCopy())来封装原来的存在溢出可能的strcpy()函数,在新函数SecurityCopy()中增加了用于检测“标示字符串最大长度的‘特定符号’”的代码,目前的代码形式如下所示。
char * SecurityCopy(char * dest, const char * src)
{
int i=0, j=0;
while(*(dest+i)!= '~ ') //检测是不是我们所添加的"特定符号"
i++;
while(*(src+j)!= '\0') //检测源字符串的长度
j++;
if(i<=j)
return NULL; //源字符串太长,会造成溢出,不予拷贝
return strcpy(dest, src);
}
在没有修改编译器前,编译运行前面的程序得出如图6.14所示的结果。
图6.14 普通编译器编译后程序的运行结果
从图6.14中可以看出,由于溢出导致系统提示“Segmentation fault”错误,在用GDB调试的过程中,发现导致错误的原因是因为返回地址已经被溢出程序修改为“0x63636262”(即bbcc)。
为了调用新的函数,将原来的程序修改为如下形式。
int main()
{
char str[8];
//判断是否溢出
if(SecurityCopy(str, "abcdefghijaaaabbbbccccddddeeeeffff ")==NULL)
{
printf("The source string is too long! Copying is refused.\n");
return 0;
}
return 1;
}
用修改后的编译器对新的程序代码进行编译,然后运行得到如图6.15所示的结果。
图6.15 用修改过的编译器编译后程序的执行结果
图6.15示例了这种新的防范缓冲区溢出攻击方法的有效性。以上是对基于堆栈的缓冲区溢出攻击的防范方法的测试结果,试验证明这种方法对防范基于堆的缓冲区溢出攻击和基于LIB C库的缓冲区溢出攻击也同样是有效的。与防范基于堆栈的缓冲区溢出攻击方法不同的是基于堆的缓冲区溢出攻击的方法所要修改的是系统中用于分配堆空间的函数,使其在每块新分配的堆空间的末尾处添加“特定符号”,编程时再结合前面的SecurityCopy()函数就可以实现对基于堆的缓冲区溢出攻击的有效防范。
这种通过对编译器和系统中相关函数的修改来防范缓冲区溢出攻击的新方法与已有防范方法相比较,有如下的优点:① 它能有效防范溢出的发生,也就从根本上杜绝了缓冲区溢出攻击的发生;② 通过对编译器和系统中相关函数的修改,把防范缓冲区溢出攻击的任务完全交给了操作系统和编译器软件来负责,把程序员从防范工作中解脱了出来,唯一要求程序员做的是用新的SecurityCopy()函数代替原来的strcpy()函数,比让程序员因改用strncpy()而多考虑一个参数要省心得多,因为新函数与原来函数的参数完全一样;③ 这种新的防范方法对各种类型的缓冲区溢出攻击都是有效的;④ 新的防范方法有效地保证了对返回地址的完整性,所以防止了程序因返回地址被修改而出现异常或者崩溃,这对提供服务的程序来说尤其重要,因为一次溢出尝试只会导致本次服务的失败,而不会影响程序继续向其他的正常请求提供相应的服务。
当然这种新的防范方法与已有的防范方法相比也有其缺点:① 由于所做的修改中多了对长度的测量与比较,所以效率上要比原来的函数要低,但程序中并不是处处都会涉及字符串操作,而且现在的计算机速度在不断提高,所以新方法所引起的效率上的降低不会太明显;② 新方法由于要添加“特定符号”,所以占用的空间要比原来的多,由于现在的内存已经足够大,所以这一缺点也掩盖不了它所能带给我们的好处。
另外需要说明的一点是:这种新的防范缓冲区溢出攻击的方法要想得到普及,就必须将文中所涉及的“特定符号”以标准的形式规定下来,当然并不见得是试验中所用的字符,也完全可以用字符串等来充当,只是复杂度上会有所不同。
3.使用安全产品
正如前面所说的,只有做到计算机维护者与安全维护软件的良好互动,才能达到最大程度的安全保障,所以必要安全产品的配置也是信息安全中不容忽视的部分。随着信息领域安全需求的不断扩大,现在市场上的安全产品也变得越来越丰富,主要的安全产品有:IDS系列、IPS、漏洞扫描软硬件产品、防火墙、反病毒软件、数据备份软件等。