DDos 攻击
DDos 攻击
最近阅读了一篇关于发表在 Usenix Security 24 上的有关 DDos 攻击防御的论文,借此机会总结一下 DDos 攻击的相关知识。
攻击原理
DDos (Distributed Denial of Service)攻击是一种通过向目标服务器发送大量请求,使其无法正常处理合法请求的攻击方式:
- 攻击者通过控制大量僵尸主机,向目标服务器发送大量请求,使目标机器停止提供服务或资源访问
- 资源包括磁盘空间、内存、进程甚至网络带宽
DDoS 攻击主要利用“僵尸网络”对 TCP 三次握手过程中第一次握手(SYN)和第二次握手(SYN-ACK)步骤来发起攻击。下面介绍两种常见的攻击: SYN Flood 和 ACK Flood。
- SYN Flood 攻击:攻击者发送大量 SYN 请求,但不进行后续的第二次握手(SYN-ACK)和第三次握手(ACK)。这导致服务器资源被大量消耗,因为服务器会为每个 SYN 请求保留资源,等待确认。当大量的SYN请求堆积在服务器上,服务器的处理能力将被严重削弱,无法处理正常的请求。
- ACK Flood 攻击:攻击者发送大量 ACK 请求,但不进行第一次握手(SYN)。这使得服务器在收到ACK请求时,无法找到匹配的 SYN 请求,从而消耗服务器的处理资源。服务器在收到大量无用的 ACK 数据包时,无法正常响应其他请求。
防御方法
SYN Cookies
TCP 服务器收到 SYN 包后,在发送 SYN + ACK 包前,服务器要先分配好一个数据区专门服务于这个即将形成的 TCP 连接。一般把收到 SYN 包而还未收到 ACK 包时的连接状态称为半打开连接(Half-open Connection) 。
攻击者通过伪造 IP 地址,向服务器发送大量的 SYN 包,服务器会为每个 SYN 包分配一个数据区,但是不会收到 ACK 包,这样服务器的资源就会被耗尽。
SYN Cookie 是对 TCP 服务器端的三次握手做一些修改,它的原理是:
- 在TCP服务器接收到 SYN 包并返回 SYN + ACK 包时,不分配一个专门的数据区,而是根据这个 SYN 包计算出一个 cookie 值。
- 这个 cookie 作为将要返回的 SYN ACK 包的初始序列号。当客户端返回一个 ACK 包时,根据包头信息计算 cookie,与返回的确认序列号(初始序列号 + 1)进行对比,如果相同,则是一个正常连接,然后,分配资源,建立连接。
Cookie 的生成
cookie的计算应该包含本次连接的状态信息,使攻击者不能伪造
服务器收到一个 SYN 包,计算一个消息摘要 Mac
$$
mac = MAC(A, k)
$$
在 Linux 中,MAC 为 SHA1,A 为 TCP SYN 包的部分字段,k 为服务器的密钥。
$$
A = SOURCE_IP || SOURCE_PORT || DST_IP || DST_PORT || t || MSSIND
$$
SYN Cookie 的缺点
- MSS 的编码只有 3 位,因此最多只能使用 8 种 MSS 值
- 服务器必须拒绝客户端 SYN 报文中的其他只在 SYN 和 SYN+ACK 中协商的选项,原因是服务器没有地方可以保存这些选项,比如 Wscale 和 SACK 增加了密码学运算
DDos 攻击
https://shangzz2001.github.io/2024/09/11/DDos-攻击/