SYNCookie反制
最近看到一个很有意思的攻击。记一笔。
针对 SYN Flood 攻击(特点是攻击者发出大量 SYN 请求,但并不完成 TCP 握手),目前操作系统会采用 SYNcookie 予以反制。FreeBSD上的实现是在系统资源充足的时候采用标准的握手机制,而当发现存在可能的攻击(即可用的 TCP 状态资源不足时)应用 SYNcookie;SYNcookie是将TCP状态建立推迟到三次握手 之后,具体做法是将服务器本地的一个秘密数据与来源/目的IP、端口编码来形成序号来发出SYN+ACK,并在收到对方回应ACK时验证这个序号的真实性。
这种方法实际上是用计算来换内存资源,即增加了两步计算操作来避免在握手完成之前消耗 TCP 状态资源。
SYN Flood提供了两个优势:
- 攻击者可以伪造来源IP
- 攻击者可以不维护TCP状态(四两拨千斤)
新的攻击方法在攻击者一方也使用了类似SYN cookie的方法,即,它能够实际完成TCP握手,从而击败 SYN cookie(当然,由于完成了三次握手,伪造源IP就不太容易了),方法是将本机和服务器的端口/IP编码进序号。
这次公开的攻击方法还有很多非常聪明的做法,在改TCP实现之前,防守一方能够采取的缓解方法不太多(限制IP、推迟服务启动时间等)。