您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 11避免拒绝服务攻击
第十一章避免拒绝服务攻击拒绝服务(DenialofService,DoS)攻击,是网络上常见的一类攻击的总称,其目的是使计算机或网络无法提供正常的服务。在DoS攻击中,最常见是网络带宽攻击和连通性攻击。前者一般恶意向网络发送极大的通信量,使得可用网络资源被消耗,而合法的用户连接反而无法通过;后者主要是针对网络上的计算机,向这些计算机发出大量的连接请求,消耗计算机可用的操作系统资源,导致计算机无法再处理合法用户的请求。DoS攻击由于实施起来比较容易,效果也比较明显,因此在网络上比较常见,也给网络安全带来巨大的威胁。本章首先讲解了拒绝服务攻击的过程以及危害,接下来阐述了几种常见的拒绝服务攻击,最后对它们提出了解决方案。本章涉及到的DoS攻击包括:系统崩溃、资源不足、恶意访问等。11.1拒绝服务攻击拒绝服务攻击作为互联网上的一种常见攻击手段,已经有多年历史。拒绝服务攻击曾被称作为互联网上最为严重的威胁之一。早期的拒绝服务攻击是利用了TCP/IP协议的缺陷,将提供服务的网络的资源消耗殆尽,导致其不能提供正常服务,不过,在本章中,我们也将一些对服务器的恶意访问也包含了进来。由于拒绝服务攻击形式较多,并且很多情况下都是利用了一些现有协议的漏洞,因此,到目前为止,还没有很好的解决办法来解决拒绝服务攻击问题。拒绝服务攻击的攻击方式有多种,如:消耗网络带宽;消耗网络设备的CPU;消耗网络设备的内存;导致网络上设备系统崩溃;等等。注意,这里的网络设备也包括网络上的计算机。提示以具有代表性的攻击手段SYNflood、ICMPflood、UDPflood为例,其原理是:针对同一个服务器的某个端口(如HTTP所在的80端口),短时间内发送大量伪造的连接请求报文,造成服务器忙不过来,严重的时候资源耗尽、系统停止响应甚至崩溃。这是对网络上服务器的攻击。而另一种是针对网络带宽本身的攻击,使用真实的IP地址,对服务器发起大量的真实连接,抢占带宽,由于服务器的承载能力有限,就有可能造成合法用户无法连接,当然也有可能造成服务器的资源耗尽,系统崩溃。更有甚者,可以使用假的IP地址(IP地址欺骗),使得服务器端无法通过“黑名单”来拒绝一些恶意的IP地址。从攻击原理分,拒绝服务攻击可分为两类:基于漏洞的攻击,又称为逻辑攻击(LogicAttack)。该种攻击方法中,攻击者首先找到软件中存在的漏洞(如操作系统中存在的缓冲区溢出漏洞),然后向存在漏洞的系统发送经过精心设计的数据包,使得系统崩溃或性能急剧下降。基于流量的攻击,又称为洪水攻击(FloodingAttack/Bandwidthattack)。该种攻击方式是指攻击者在短时间内,向目标系统发送大量数据包,消耗目标网络带宽或系统资源。传统的拒绝服务攻击,一般是从一个攻击源攻击一个目标。随着攻击技术的进步,近些年来,拒绝服务攻击已经演变为分布、协作、大规模攻击方式,从多个攻击源攻击一个目标,即分布式拒绝服务攻击(DistributedDenyofService,DDoS)。DDoS通常被用于对一些大型商务网站或网络系统进行攻击,攻击强度和造成的危害大大超过传统的Dos攻击。有关DoS攻击和DDoS攻击的其他资料,读者可以参考相关文献。11.2几个拒绝服务攻击的案例11.2.1程序崩溃攻击拒绝服务攻击引起程序崩溃,可以通过改善代码质量来降低损失。在这类攻击中,最薄弱的环节是一些使用了网络堆栈进行工作的场合。比如,在UDP通信中,构建一个UDP数据包,在UDP文件头中指定的长度比实际上数据包长度大,则系统内核会引起内存访问错误,此时各种系统都会有相应的反应,如:UNIX系统中,系统进入应急状态;Windows系统会蓝屏或者进行错误检查;系统重新启动;等等。本节以“PingOfDeath”攻击来阐述这个问题。根据TCP/IP的规范,一个包的长度最大为65535字节。尽管一个包的长度不能超过65535字节,但可以把报文分割成片段,然后在目标主机上重组。但是,这个规则本身存在着漏洞,如果攻击者精心设计,最终会导致被攻击目标缓冲区溢出,这也是拒绝服务攻击的一种形式。一般说来,当一个主机收到了长度大于65535字节的包时,就是受到了PingofDeath攻击,该攻击会造成系统的宕机。如下代码是一个IP头定义://定义IP首部struct_iphdr{unsignedcharh_verlen;//4位首部长度,4位IP版本号unsignedchartos;//8位服务类型TOSunsignedshorttotal_len;//16位总长度(字节)unsignedshortident;//16位标识unsignedshortfrag_and_flags;//3位标志位,13位偏移量unsignedcharttl;//8位生存时间TTLunsignedcharproto;//8位协议(TCP,UDP或其他)unsignedshortchecksum;//16位IP首部校验和unsignedintsourceIP;//32位源IP地址unsignedintdestIP;//32位目的IP地址};在以上结构体ip_header中,“total_len”定义了数据包中所包含的字节数目,在本程序中unsignedshort最大值是65535,即:一个包的长度最大为65536字节。此时如何实现“PingOfDeath”攻击呢?这里首先要将在结构体ip_header的结构进行一下解释。在结构体ip_header中,有一个成员frag_and_flags,该成员共2字节16位,它分为两部分:3位标志位:这里需要解释的是其中两位,其中1位指定数据包是否允许被分段,还有1位指定后面是否还有更多允许分段的数据包;另外13位:指定数据包分段的偏移量。这样就可能出现一个问题:在整个数据包所包含的最后一个字节处,最后一个数据段可以被添加到整个数据包中,数据包的长度就会超过最大值是65535。此时出现拒绝服务攻击。怎样避免这样的问题?很明显,应该在编程的过程中进行充足的考虑(比如在数据组装时进行充分的检查),并且认真进行测试,使得数据包的长度在65535之内。以下代码结构可以解决以上问题:该代码结构中描述了运算过程,具体的代码和具体的语言相关,用户可以参考相关资料,完成相应代码。//数据检查boolReassemblePackets(含有多个_iphdr的集合){//Step1:获取最后一个包,找到其偏移量//Step2:获得该包的长度//Step3:用偏移量加上该包长度,看是否大于65535//Step4:决定该包是否被丢弃}11.2.2资源不足攻击资源不足攻击,顾名思义,是指攻击者能够消耗特定的资源,使得系统资源不足。以聊天程序为例,如果服务器代码中,每收到一个Socket连接请求就开辟一个新的线程,那么敌方就有可能反复请求连接,如果不限制工作线程的数目,攻击者就很容易反复进行连接请求,制造足够多的线程来耗尽服务器端得CPU和内存资源。本节以SYNFlood为例,来说明这种攻击的原理和解决方法。SYNFlood是当前比较流行的DoS与DDoS方式之一,很多其他形式的攻击都可能是这种攻击的变种,或者原理与此方法类似。在该攻击方法中,利用了TCP协议缺陷,向服务器端发送大量的TCP连接请求,而这些连接请求是伪造的,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)。根据网络通信原理,TCP协议是基于连接的,言下之意,为了在服务端和客户端之间传送TCP数据,必须先建立一个TCP连接,然后才能够传输数据,否则一端就进行等待。其中,建立TCP连接的过程在TCP协议中被称为三次握手(Three-wayHandshake),其过程如图所示:该图中,HOSTA向HOSTB发出链接请求,可以认为HOSTA为客户端,HOSTB为服务器端,其流程如下:1:客户端向服务器端发送一个TCP报文(同步报文或称SYN报文),该报文包含SYN(同步)标志,SYN报文中同时指明了客户端使用的端口以及TCP连接的初始序号(seq=x);2:服务器端在收到客户端的SYN报文后,将返回一个SYN(同步)+ACK(确认)标志的报文给客户端,表示客户端的请求被服务器端接受;从图中可以看出,此处seq=y,ACK=x+1;3:客户端收到服务器端的SYN(同步)+ACK(确认)标志的报文之后,也返回一个含有ACK标志(ack=y+1)的报文给服务器端,到此一个TCP连接完成。不过,我们无法保证网络的稳定性,如果由于网络原因,无法保证三次握手能够正常完成,TCP协议是怎么解决的呢?以一个极端的例子为例,在上面例子的第一步中,客户端向服务器发送了SYN报文后突然停电,服务器并不知道客户端停电了,在服务器上仍然执行第二步工作,也就是说,服务器端在收到客户端的SYN报文后,将返回一个SYN(同步)+ACK(确认)标志的报文给客户端。但是此时,由于客户端停电了,客户端就无法执行第三步,也就是说服务器端无法收到客户端的ACK报文(第三次握手无法完成),怎么处理?TCP协议中,这种情况下服务器端一般再次发送SYN+ACK给客户端,经过一段时间,如果还是没有响应,则将该连接视为无效的连接,并且丢弃;通俗地说,就是服务器等待,超过一定时间,放弃连接。一般说来,服务器等待的这个时间为30秒到2分钟,该时间也称为SYNTimeout时间。攻击者就是利用这个缺陷,可以对服务器进行攻击。因为当单个客户端连接服务器时出现异常,导致服务器的一个线程等待一段时间,不会造成服务器的崩溃;但是,如果大量的客户端连接服务器出现异常,导致服务器的多个线程都要等待一段时间,服务器就难以承受了。SYNFlood攻击中,攻击者就是大量模拟了这种情况,此时,服务器在短时间内必须消耗资源来维护一个很大的未完成的连接的集合,并且还要对这个集合不断进行遍历和检查,会消耗非常多的CPU时间和内存;此外,服务器还要不断对各个客户端发出SYN+ACK报文进行重试,当攻击足够凶猛时,服务器的TCP/IP栈如果不够强大就会造成崩溃;即使没有崩溃,服务器也会忙于处理这些伪造的请求,当客户的正常请求到达时,它也难以处理。站在正常客户的角度来看,服务器响应变慢,或者干脆失去了响应。从开发角度讲,要防御此种攻击,有几种简单的解决方法:1:缩短SYNTimeout时间。SYNFlood攻击的本质在于向服务器端请求大量的未完成连接,而这些连接的个数直接影响到攻击的效果。因此,如果将SYNTimeout时间缩短,就有可能让某些连接在短时间之内被放弃,可以降低服务器负担。值得注意的是,如果将SYNTimeout设置得过小,又有可能会影响正常客户的访问。但是,该方法仅在对方攻击频度不高的情况下生效,2:设置黑名单。一般采用Cookie方法,也称SYNCookie。该方法中,当有一个请求到达时,给该请求连接的IP地址分配一个Cookie,如果在短时间之内,该IP地址重复发送SYN报文,就可以认为该IP地址是一个攻击者,将其加入到黑名单,凡是被加入到黑名单中的IP地址,传送的数据包直接被丢弃。该方法主要针对客户端IP地址没有经过伪造的情况。如果客户端攻击者的IP地址经过伪造,这种方法就不奏效了。3:使用相应软件(防火墙),屏蔽掉一些可疑的客户端,也能从一定程度上降低被攻击系统的负荷。怎样判断程序受到了拒绝服务攻击呢?以TCPSYNFlood攻击为例,一般情况下,可以一些简单步骤来判断系统是否正在遭受TCPSYNFlood攻击,如:1:由正常客户端报告,发现服务端无法提供正常的TCP服务,连接请求经常被拒绝或超时。2:在服务器端,利用netstat-an命令,检查系统中是否有大量的SYN_RECV连接状态,如果有很多,或者超过一定比例,就说明系统可能遭受了拒绝服务攻击。以下是运行该命令的效果:11.2.3恶意访问攻击某些应用程序(特别是WEB程序)是针对不可预知的客户的,客户的访问大都是正常的,但是某些恶意的访问可能会给系统造成一定困扰。以Web程序为例
本文标题:11避免拒绝服务攻击
链接地址:https://www.777doc.com/doc-1575768 .html