【网络】SYN泛洪攻击原理及防御---未消化完
DDoS和DoS攻击
拒绝服务攻击时,攻击者想非法占用被攻击者的一些资源,比如如:带宽,CPU,内存等等,使得被攻击者无法响应正常用户的请求。
讲泛洪攻击之前,我们先了解一下DoS攻击和DDoS攻击,这两个攻击大体相同,前者的意思是:拒绝服务攻击;后者的意思是:分布式拒绝服务攻击。不要看这两个攻击前一个比后一个多了一个字母,后一个攻击比前你一个攻击少了"分布式"三个字,其实他们具体的来说还是有所区分的。
DDoS是DoS攻击中的一种方法。下面我们来详细看一下区分:
DoS(拒绝服务):不是DOS操作系统,造成DoS的攻击行为被称为DoS攻击,它的目的是使得计算机或者网络我无法提供正常服务。最常见的DOS攻击有计算机网络带宽攻击和连通性的攻击。
DDoS(分布式拒绝服务);这个的攻击借助于客户/服务器技术,将多个计算机联合起来作为一个攻击平台,对一个或者是多个目标发动攻击,从而成倍的提高就裁决服务攻击的威力。
简单地说,DDoS的攻击威力要大于DoS的攻击威力,DDoS主要是发动群体攻击。
SYN攻击
以上的内容就是对DoS和DDoS攻击文字上的一个概念。为了更加直观地表达出来,我在下面附一张图:
这幅图呢就是TCP的通信的三次握手,如果说攻击端,发送完第一次握手的数据后,然后就"消失"了,那么服务器就会不断的发送第二次握手的数据,可是攻击端的人找不到了。于是,服务器的资源大量被消耗,直到死机为止。当然了,如果要完全弄懂机制,需要对TCP有相当深入的了解。
现在回到我们的原题:SYN泛洪攻击,其实这个攻击主要利用的就是TCP三次握手机制的缺陷。
TCP SYN泛洪主要发生在OSI的第四层,(关于这个OSI我会在后面的文章给大家讲述。)利用了这个TCP三次握手的特性。
A(攻击者)发送TCP SYN,SYN是TCP三次握手中的第一个数据包,而当这个服务器返回ACK以后,A不再进行确认,那这个连接就处在了一个挂起的状态,也就是半连接的意思,那么服务器收不到再确认的一个消息,还会重复发送ACK给A。这样一来就会更加浪费服务器的资源。A就对服务器发送非法大量的这种TCP连接,由于每一个都没法完成握手的机制,所以它就会消耗服务器的内存最后可能导致服务器死机,就无法正常工作了。更进一步说,如果这些半连接的握手请求是恶意程序发出,并且持续不断,那么就会导致服务端较长时间内丧失服务功能——这样就形成了DoS攻击。这种攻击方式就称为SYN泛洪攻击。
防御措施
那么我们如何去防范这种SYN攻击呢?
其实最常用的一个手段就是优化主机系统设置。比如降低SYN timeout时间,使得主机尽快释放半连接的占用或者采用SYN cookie设置,如果短时间内收到了某个IP的重复SYN请求,我们就认为受到了攻击。我们合理的采用防火墙设置等外部网络也可以进行拦截。
6 网络终端的对策
6.1增加TCP backlog队列
由于其基本攻击原理是依赖于终端主机连接套接字的backlog溢出,因此一个显然的基于终端主机的解决方案是增加backlog队列大小,而且这种方法已经广泛的运用于大多数服务器了。增加backlog队列通常是通过修改应用的listen()函数调用和一个操作系统内核参数SOMAXCONN——它用于设置一个应用程序能够接收的backlog上限值。这种方法本身并不能被完全认为是抵御SYN洪泛的有效方法,即使在一些能够有效支持超大backlog队列分配的操作系统中,因为攻击者能够任意生成比其操作系统支持的backlog还大得多的数据报。
6.2减少SYN-RECEIVED的时间
另一个基于终端主机的解决方法是缩短一个TCB从进入SYN-RECEIVED状态到因未进入下一个状态而被回收之间的时间。但这个方案的一个明显缺点是攻击可以利用因拥塞而丢包的ACK-SYN或者握手完成的ACK包,这样合法连接的TCB就会由于主机忙于重传这些包(因为SYN-RECEIVED时间减少)而被回收。此外,在管理员减少SYN-RECEIVED状态时间多少和攻击者的发包率之间仅仅是一个线性关系而已。基于上述原因,此方案并不建议采用。
6.3 SYN缓存
另外两种方案是基于SYN缓存和SYN cookies(见6.4)的,简化因接收SYN而生成TCB时初始化的状态,推迟全状态的实例化[4]。在采用SYN缓存的主机中,一个带有被限制大小的HASH表空间被用于存放那些将被分配给TCB的数据的一个子集。如果当握手完成的ACK接收到了,这些数据将被复制到一个完整的TCB中,否则超出存活时间的HASH值将会在需要时被回收。在Lemon的FreeBSD中,对于一个半开连接的SYN缓存是160字节,而一个完整的TCB是736字节,并且支持15359个SYN缓存空间。
SYN缓存的数据结构对于那些试图让HASH表空间溢出的攻击者是健壮的。因为在其HASH值里面包含了对方的端口号和一些密码比特。由于堆栈相对于链表是一种更加高效的数据结构,因此堆栈被用于SYN缓存以提高速度。在Lemon的测试中,处于活跃攻击下的主机用SYN缓存能够建立连接且仅仅比正常时间延缓了15%的时间。
6.4 SYN Cookies
对比SYN缓存的方法,SYN Cookies技术做到了接收到一个SYN时完全不需要分配空间。因为构成连接状态的最基本数据都被编码压缩进SYN-ACK的序列号比特位里了。对于一个合法连接,服务器将收到一个带有序列号(其实序列号已经加1)的ACK报文段,然后基本的TCB数据将被重新生成,一个完整的TCB通过解压确认数据将被安全的实例化。这种解压即使在重度攻击下仍然能够成功,因为在主机端根本没有任何存储负载,只有计算编码数据到ACK序列号中的负载。其不足之处就是,不是所有的TCB数据都能添加到32位的序列号段中,所以一些高性能要求的TCP选项将不能被编码。其另一个问题是这样的SYN-ACK报文段将不能被转发(因为转发需要完整的状态数据)。
Andre Oppermann最近的一些研究是运用TCP时间戳选项结合序列号字段编码更多的状态信息,保存那些高性能选项的应用,比如TCP窗口大小,TCP选择性确认选项(TCP Selective Acknowledgment Options )以及TCP MD5摘要对SYN cookies的支持。这使SYN Cookies向前迈进了一步,他消除了之前SYN cooikes实现不能支持这些功能的缺陷。
TCP SYN cookies 的规范格式并不涉及互操作性问题,因为它们仅在本地被处理,对于生成和验证的规范和过程在不同实现中会稍有不同。
6.4.1 SYN cookies的生成
为了在使用SYN cookies时计算出SYN-ACK序列号(就是SYN cookies),主机首先要结合一些本机的密码比特,一个包括IP地址和TCP端口号的数据结构,SYN初始序列号,和一些标识密码比特的索引数据。在所有上述字节之上生成一个MD5摘要,然后一些比特位从hash值里被截断以便将其放入到SYN-ACK序列号中。由于序列号的大小大约是全部hash值的四分之一,因此这种截断是必要的,但是通常验证的时候至少要用3字节大小的hash比特位,这意味着在不知道密码比特位的情况下仍然有将近2^24种可能性去猜测验证cookies。为了将hash值发送出去,cookies的一些比特位将使SYN包含的MSS(最大报文段长度)的上限值变小,并影响在hash值中标识本机密码位的索引位。
6.4.2 SYN cookies的验证
为了验证SYN cookies,首先要将收到的ACK报文段中的确认号减1以便重新生成SYN cookies。对于这些已被截断过的hash位验证值的计算是基于双方IP地址,端口号,序列号减1和与cookie中索引号对应的密码池中的值。如果被计算出来的这些值与cookie中的值相同,此时TCB才初始化并开始建立连接。被编码的MSS上界被用来设置一个不超过最初值的合理大小的MSS值。MSS通常由3个比特位来实现,这三个比特位对应8个由一般链路的MTU(最大传输单元)和以太网头部计算出的MSS值。
6.5混合方式
混合方式将上述的两种或更多防御方法联合起来使用。例如,一些终端机操作系统同时实现了一个超大backlog队列和SYN cookies,但是仅仅当backlog的大小超过一定阈值时SYN cookies才被使用,这样就能在不涉及SYN cookies缺点的情况下正常使用,也允许在遭受攻击时转移到SYN-cookies防御。
7 基于网络的对策
7.1过滤
网络层最基本的防御是RFC 2827[3]里描述的过滤应用。采用输入源过滤,ISP拒绝将一个源IP地址不属于其来源子网的包进行更远的路由。输入源过滤能够有效地阻止用IP伪装的SYN洪泛攻击。然而这种方法在目前是没用的,因为其很难大规模部署。而且输入源过滤同样不能抵御分布式攻击。
7.2防火墙与代理
一个有防火墙或者代理的设备在网络中就能够通过两种方法缓冲SYN洪泛攻击,一种是对连接发起人伪装SYN-ACK包,另一种是对服务器伪装ACK包[5]。
如果连接发起人是合法的,防火墙/代理就会收到ACK,然后在它自己和服务器之间建立连接并伪装连接发起人的地址。防火墙/代理将连接双方分割开。这种分割能够抵御SYN洪泛攻击,因为服务器方根本没接受收过攻击者的SYN。只要防火墙/代理实现了一些基于TCP的防御策略,比如SYN cookies或SYN 缓存,他就能够保护所有在其后面的服务器免于SYN洪泛攻击。
另一种是响应SYN-ACK的伪装ACK包通过防火墙/代理到达服务器。这种伪装防止服务器的TCB一直停留在SYN-RECEIVED状态,因此保证了backlog队列中的空余空间。防火墙/代理将会停留等待一段时间,如果连接发起人正确的ACK没有被检测到,它将会通过伪装的TCP RET报文使服务器释放TCB。对合法的连接,数据包流能够在没有防火墙/代理的影响下继续进行。这种方法相比于上面伪装SYN-ACK的方法更具吸引力,因为当合法连接建立以后防火墙/代理不需要直接参与到连接中去。
8 活动监视器
活动监视器是一种能够检测并干预发往服务器的流量的设备,跟像防火墙一样,它并不是网络路由中必须的设备。一种典型的监视器会像7中的ACK伪装的防火墙/代理一样,拥有一个附加的能力,就是如果它发现SYN包来源于它知道的攻击者源地址就会立刻发送伪装RST包给服务器。活动监视器因其便宜容易部署(相比于基于防火墙和输入源过滤的方案)而具有实用性,而且仍然能够保护整个服务器网络而不需要每台服务器操作系统都实现一个基于终端的解决方案。
9 SYN洪泛与相关一些攻击的比较
除了SYN洪泛,通过在TCP已建立的连接中伪装源IP地址和连接参数的一些其他攻击也是可能的。如果攻击者能够推测到双方的IP地址,TCP端口号和合法的序列号,就能通过重置或修改恶意数据而破坏连接。除了伪装TCP报文段,伪装ICMP数据包同样也能终止一个TCP连接。
不管是这些攻击还是SYN洪泛,其目标都是受害者的TCP应用程序,而且能够用比蛮力洪泛数据包方法小的多的代价来中断受害者的服务。然而,SYN洪泛与其他TCP欺骗攻击相比有很大的不同。SYN洪泛攻击新连接的服务而不影响已建立的连接,然而其他欺骗攻击却是打断已建立的连接不能从开始阻止新的连接。SYN攻击仅仅通过修改初始握手程序就能被制止,然而其他的欺骗攻击需要整个连接生命周期中检查每一段数据。SYN洪泛和其他TCP欺骗攻击之间的共同之处是他们都是取决于攻击者发送伪装源地址IP数据包的能力,而防御它们的相同方法都是部署更多的地址过滤或使用IP安全协议(IPsec)。
10 总结
在我看来,一些SYN缓存技术的变体应该作为固化功能将其植入到服务器操作系统中去,而且这些变体可以适当的情况下结合其他解决方案(基于地址的过滤,ACK伪装防火墙,IP安全协议等等)一起部署。目前也有许多专家正在致力于研究健壮性更强的TCP协议,也希望这些补充协议能够早日部署。
原文: