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的计算应该包含本次连接的状态信息,使攻击者不能伪造

服务器收到一个 SYN 包,计算一个消息摘要 Mac
$$
mac = MAC(A, k)
$$
在 Linux 中,MAC 为 SHA1,A 为 TCP SYN 包的部分字段,k 为服务器的密钥。
$$
A = SOURCE_IP || SOURCE_PORT || DST_IP || DST_PORT || t || MSSIND
$$

  • MSS 的编码只有 3 位,因此最多只能使用 8 种 MSS 值
  • 服务器必须拒绝客户端 SYN 报文中的其他只在 SYN 和 SYN+ACK 中协商的选项,原因是服务器没有地方可以保存这些选项,比如 Wscale 和 SACK 增加了密码学运算

DDos 攻击
https://shangzz2001.github.io/2024/09/11/DDos-攻击/
作者
Odysseus
发布于
2024年9月11日
许可协议