尽管这种攻击已经出现了十四年,但它的变种至今仍能看到。虽然能有效对抗SYN洪泛的技术已经存在,可是没有对于TCP实现的一个标准的补救方法出现。你能够在现在的操做系统和设备中找到保护应用层和网络层的不一样解决方案的不一样实现。本篇论文详细描述这种攻击并展望和评估如今应用于终端主机和网络设备的对抗SYN洪泛方法。缓存
1 基本的漏洞安全
SYN洪泛攻击首次出如今1996年。当时Phrack杂志中描述了这种攻击并用代码实现了它[1]。这些信息被迅速应用于攻击一个网络服务提供商(ISP)的邮件和Telnet服务,并形成了停机。CERT(Computer Emergency Response Team)不久就发布了对于这种攻击技术的初步评估与解决方案[2]。服务器
SYN洪泛攻击的基础是依靠TCP创建链接时三次握手的设计。第三个数据包验证链接发起人在第一次请求中使用的源IP地址上具备接受数据包的能力,即其返回是可达的。图1显示了一次普通的TCP链接开始时交换数据包的过程。cookie
TCB(TCP 传输控制块)是一种包含一个链接全部信息的传输协议数据结构(实际上在许多操做系统中它是用于处理进站(inbound)链接请求的一个队列,该队列保存那些处于半开放(half-open)状态的TCP链接项目,和已创建完整链接但仍未由应用程序经过accept()调用提取的项目)。一个单一的TCB所占内存大小取决于链接中所用的TCP选项和其余一些功能的实现。一般一个TCB至少280字节,在某些操做系统中已经超过了1300字节。TCP的SYN-RECEIVED状态用于指出这个链接仅仅是半开链接,请求是否合法仍被质疑。这里值得注意的一个重要方面就是TCB分配空间的大小取决于接收的SYN包——在链接被彻底创建或者说链接发起人的返回可达性被证明以前。网络
这就致使了一个明显潜在的DoS攻击,到达的SYN包将被分配过多的TCB而致使主机的内核内存被耗尽。为了不这种内存耗尽,操做系统一般给监听接口关联了一个"backlog"队列参数,它同时维护链接的TCB上限数量和SYN-RECEIVED状态。尽管这种方案使主机的可用内存免遭攻击,可是backlog队列自己就带来了一个(小的)受攻击源。当backlog中没有空间时,就不可能再响应新的链接请求,除非TCB能被回收或者从SYN-RECIEVE状态中移除。数据结构
试图发送足够多的SYN包而耗尽backlog是TCP SYN洪泛的目的。攻击者在SYN包中加入源IP地址,这样就不会致使主机将已分配的TCB从SYN-RECEVIED状态队列中移除(由于主机将响应SYN-ACK)。由于TCP是可靠的,目的主机在断开半开链接并在SYN-RECIEVED队列中移除TCB以前将等待至关长的时间。在此期间,服务器将不能响应其余应用程序合法的新TCP链接请求。图2显示了简单的TCP SYN洪泛攻击的过程。分布式
图3显示了目前网络中检测到的一些SYN攻击变种。函数
2 直接攻击性能
若是攻击者用他们本身的没有通过假装的IP地址快速地发送SYN数据包,这就是所谓的直接攻击。这种攻击很是容易实现,由于它并不涉及攻击者操做系统用户层如下的欺骗或修改数据包。例如,他能够简单地发送不少的TCP链接请求来实现这种攻击。然而,这种攻击要想奏效攻击者还必须阻止他的系统响应SYN-ACK包,由于任何ACK、RST或ICMP(Internet Control Message Protocol)包都将让服务器跳过SYN-RECEIVED状态(进入下一个状态)而移除TCB(由于链接已经创建成功或被回收了)。攻击者能够经过设置防火墙规则来实现,让防火墙阻止一切要到达服务器的数据包(SYN除外),或者让防火墙阻止一切进来的包来使SYN-ACK包在到达本地TCP处理程序以前就被丢弃了。测试
一旦被检测到,这种攻击很是容易抵御,用一个简单的防火墙规则阻止带有攻击者IP地址的数据包就能够了。这种方法在现在的防火墙软件中一般都是自动执行的。
3 欺骗式攻击
SYN洪泛攻击的另外一种方式是IP地址欺骗。它比直接攻击方式更复杂一点,攻击者还必须可以用有效的IP和TCP报文头去替换和从新生成原始IP报文。现在,有不少代码库可以帮助攻击者替换和从新生成原始IP报文。
对于欺骗式攻击,首先须要考虑的就是选择地址。要使攻击成功,位于假装IP地址上的主机必须不能响应任何发送给它们的SYN-ACK包。攻击者能够用的一个很是简单的方法,就是仅需假装一个源IP地址,而这个IP地址将不能响应SYN-ACK包,或许由于这个IP地址上根本就没有主机,或许由于对主机的地址或网络属性进行了某些配置。另外一种选择是假装许多源地址,攻击者会假想其中的一些假装地址上的主机将不会响应SYN-ACK包。要实现这种方法就须要循环使用服务器但愿链接的源IP地址列表上的地址,或者对一个子网内主机作相同的修改。
若是一个源地址被重复地假装,这个地址将很快被检测出来并被过滤掉。在大多数状况下运用许多不一样源地址假装将使防护变得更加困难。在这种状况下最好的防护方法就是尽量地阻塞源地址相近的欺骗数据包。
假设攻击者是在一个“互联”的网络中(例如一个自治系统(Autonomous System)),由其ISP限制攻击者所在网络流量的输入输出过滤将可以制止这种欺骗攻击——若是这种方法能被机构部署到正确位置的话。这种流量输入输出过滤的防护方式将限制一些合法的通讯,好比移动IP三角路由运做模式,所以不可能被广泛部署。IP安全协议(IPsec)一样也提供了一种抵御欺骗包的优秀方式,可是这协议由于部署限制还不能被使用。因为对于服务器方一般不可能要求连接发起人的ISP去实施地址过滤或者要求其使用IP安全协议,所以抵御这种用多地址假装的欺骗攻击还须要更加复杂的解决方案,将在后文讨论到。
4 分布式攻击
对于单个运用欺骗式攻击的攻击者真正的限制因素是若是这些假装数据包可以以某种方式被回溯到其真正的地址,攻击者将被简单地击败。尽管回溯过程须要一些时间和ISP之间的配合,但它并非不可能的。可是攻击者运用在网络中主机数量上的优点而发动的分布式SYN洪泛攻击将更加难以被阻止。如图3所示,这些主机群能够用直接攻击,也能够更进一步让每台主机都运用欺骗攻击。
现在,分布式攻击才是真正可行的,由于罪犯拥有数以千计的主机供他来进行拒绝服务(DoS)攻击。因为这些大量的主机可以不断地增长或减小,并且可以改变他们的IP地址和其链接,所以要阻止这类攻击目前仍是一个挑战。
5 攻击的一些参数
SYN洪泛攻击可以比通常的仅仅是向目标网络发送大量数据包的蛮力DoS攻击用更少的数据包进行攻击。可是这须要对服务器的操做系统有必定了解,好比它分配了多少的backlog队列空间,在超时并丢弃TCB前它会将TCB在SYN-RECIEVED状态里保持多久。例如,攻击者能够发送恰好是backlog队列大小的必定数量的SYN包,而且其周期恰好是TCB被回收的时间,这样就可让服务器永远不可用。
最近的一些系统基本都是默认backlog大小为1024字节,可是网络上的不少服务器都将其配置为128字节或更少。一般重传SYN-ACK的时间阈值时5秒,是一般成功接收时间的两倍,默认超时时间是3秒,在第一个SYN-ACK发出到其TCB被回收的时间是189秒。
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协议,也但愿这些补充协议可以早日部署。