TCP 泛洪攻击实验
Completion requirements
SYN cookies 最初由 Daniel J. Bernstein 在1996年提出,该技术已被 Linux 和 FreeBSD 采纳。在 Ubuntu Linux 上,这个防御在没有攻击时是不会启动的。一旦系统检测到半打开连接超过一定数量的时候,SYN cookies 机制会被自动激活。这个机制会给性能带来一些小的负面影响,所以在"太平"的时候不会被使用。
SYN Cookie 机制的核心思想是在服务器仅收到 SYN 包后不分配任何资源。只有当服务器收到了最终的 ACK 包时才会分配资源。这样就不会出现队列满了的危险。然而,这虽然解决了 SYN 泛洪攻击问题,却引入了一个新的攻击。由于服务器不保存SYN包的任何信息,这就无法验证最后收到的 ACK 包是之前的 SYN+ACK 包的结果,还是单纯是一个伪造的包。没有这个验证,攻击者就可以进行 ACK 泛洪攻击,例如使用很多伪造的 ACK 包来泛洪攻击服务器,每一个都会导致服务器给它分配宝贵的资源。这个攻击可能比 SYN 泛洪攻击更加有害,因为为一个完整的连接分配的资源比为半打开连接分配的资源多得多。服务器必须知道 ACK 包是否合法。SYN cookies 为这个问题提供了一个很妙的解决方法。
该机制的思想由 Bernstein 总结如下:"SYN Cookie 是 TCP 服务器选择初始 TCP 序列号的具体方式"。'通常情况下,初始 TCP 序列号是由服务器随机生成的,但 SYN Cookie 机制中使用此序列号来记录一些有用的信息。当服务器接收到一个 SYN 包后,它会用包中的信息(包括IP地址、端口号和序列号),结合一个密钥来计算一个哈希值,该密钥仅由服务器知道。这个哈希值 H 将被用作服务器返回给客户端的 SYN+ACK 包中初始序列号。这个值称为SYN Cookie。如果客户端是攻击者,则不会收到此包(在 SYN 泛洪攻击中,客户端的 IP 地址是虚假的)。如果客户端真是一个用户者,它将会得到这个包,并送回一个确认字段值为 H+1 的ACK包。当服务器收到 ACK 包时,它可以基于包的信息重新计算c ookie,以此检验确认字段里的序列号是否有效。这个验证防止了 ACK 泛洪攻击,并确保 ACK 包是之前的 SYN+ACK 包的结果。因为攻击者不知道计算 cookies 所需要使用的的密钥,所以无法轻易仿造有效的 cookies。
通过 SYN cookies 的机制,可以有效地防御 SYN 泛洪攻击。即使攻击者依然可以使用很多 SYN 包泛洪攻击服务器,也无法消耗服务器的资源,因为没有任何状态被保存。攻击者也可以使用很多 ACK 包泛洪攻击服务器,但因为在确认字段里没有有效的 SYN cookies,并不会触发服务器上资源的分配。
Last modified: Wednesday, 7 May 2025, 10:07 PM