共计 1054 个字符,预计需要花费 3 分钟才能阅读完成。
导读 | SYN 攻击利用 TCP 协议缺陷,通过发送大量的半连接请求,耗费 CPU 和内存资源。SYN 攻击除了能影响主机外,还可以危害路由器、防火墙等网络系统,事实上 SYN 攻击并不管目标是什么系统,只要这些系统打开 TCP 服务就可以实施。 |
SYN 攻击是黑客攻击常用的一种手段,是 DDoS 的方式之一。SYN 攻击利用 TCP 协议缺陷,通过发送大量的半连接请求,耗费 CPU 和内存资源。SYN 攻击除了能影响主机外,还可以危害路由器、防火墙等网络系统,事实上 SYN 攻击并不管目标是什么系统,只要这些系统打开 TCP 服务就可以实施。
要明白这种攻击的基本原理,还是要从 TCP 连接建立的过程开始说起:
大家都知道,TCP 是基于连接的,也就是说:为了在服务端和客户端之间传送 TCP 数据,必须先建立一个虚拟链路,也就是 TCP 连接,建立 TCP 连接的标准过程是这样的:
第一步,请求端 (客户端) 发送一个包含 SYN 标志的 TCP 报文,SYN 即同步,同步报文会指明客户端使用的端口以及 TCP 连接的初始序号;
第二步,服务器在收到客户端的 SYN 报文后,将返回一个 SYN+ACK 的报文,表示客户端的请求被接受,同时 TCP 序号被加一,ACK 即确认。
第三步,客户端也返回一个确认报文 ACK 给服务器端,同样 TCP 序列号被加一,到此一个 TCP 连接完成。
以上的连接过程在 TCP 协议中被称为三次握手。
问题就出在 TCP 连接的三次握手中,假设一个用户向服务器发送了 SYN 报文后突然死机或掉线,那么服务器在发出 SYN+ACK 应答报文后是无法收到客户端的 ACK 报文的 (第三次握手无法完成),这种情况下服务器端一般会重试(再次发送 SYN+ACK 给客户端) 并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为 SYN Timeout,一般来说这个时间是分钟的数量级(大约为 30 秒 - 2 分钟)。
一个用户出现异常导致服务器的一个线程等待 1 分钟并不是什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况,服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源 —- 数以万计的半连接,即使是简单的保存并遍历也会消耗非常多的 CPU 时间和内存,何况还要不断对这个列表中的 IP 进行 SYN+ACK 的重试。
实际上如果服务器的 TCP/IP 栈不够强大,最后的结果往往是堆栈溢出崩溃 — 即使服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的 TCP 连接请求而无暇理睬客户的正常请求。