连接耗尽攻击:
这种攻击方式也许是TCP攻击中,消耗资源最严重的攻击方式。通常黑客发起连接耗尽型的攻击的代价也比前面文章讲的攻击要高的多。
那么让我们先来了解一下,一个TCP连接,将大致占用多少资源,通常服务器又能接受多少的连接的?下面以Linux系统为例,我们做一下简要的分析:
在三次握手完成之后,内核会为每个连接分配相应的结构,保存TCP连接相应的控制信息,接收缓冲和发送缓冲。默认情况下占用大概10K的内存。 通常的连接耗尽攻击会发起10~ 100w的连接,大致占用100M ~ 1G的内存,也许你会觉得很少。但大量的空连接占用的不只是这些,攻击者通常还会建立后立马会fin报文结束连接。每个TCP连接都需要维护状态。不断的发起和断开,系统将不断分配和释放资源,将会大大增加系统的调度负担,同时上层应用也将在建立和断开连接上消耗大量的CPU,造成服务器不可以用。
慢连接攻击:
例如通常的post请求都会在http头部设置content-length字段表明。请求的字节数,服务器应用通常获取到之后,会在连接上持续接收内容直到获取到指定长度的数据。黑客正是利用这个处理过程,比如:连接建立后,发送的http头指定长度content-length:10000,如何每秒发送1字节的数据。这样一样很少的连接就可能造成服务器占用严重,无法提供服务。
发展到今天,慢速攻击也多种多样,其种类可分为以下几种:
Slow headers:Web应用在处理HTTP请求之前都要先接收完所有的HTTP头部,因为HTTP头部中包含了一些Web应用可能用到的重要的信息。攻击者利用这点,发起一个HTTP请求,一直不停的发送HTTP头部,消耗服务器的连接和内存资源。抓包数据可见,攻击客户端与服务器建立TCP连接后,每30秒才向服务器发送一个HTTP头部,而Web服务器再没接收到2个连续的\r\n时,会认为客户端没有发送完头部,而持续的等等客户端发送数据。
Slow body:攻击者发送一个HTTP POST请求,该请求的Content-Length头部值很大,使得Web服务器或代理认为客户端要发送很大的数据。服务器会保持连接准备接收数据,但攻击客户端每次只发送很少量的数据,使该连接一直保持存活,消耗服务器的连接和内存资源。抓包数据可见,攻击客户端与服务器建立TCP连接后,发送了完整的HTTP头部,POST方法带有较大的Content-Length,然后每10s发送一次随机的参数。服务器因为没有接收到相应Content-Length的body,而持续的等待客户端发送数据。
Slow read:客户端与服务器建立连接并发送了一个HTTP请求,客户端发送完整的请求给服务器端,然后一直保持这个连接,以很低的速度读取Response,比如很长一段时间客户端不读取任何数据,通过发送Zero Window到服务器,让服务器误以为客户端很忙,直到连接快超时前才读取一个字节,以消耗服务器的连接和内存资源。抓包数据可见,客户端把数据发给服务器后,服务器发送响应时,收到了客户端的ZeroWindow提示(表示自己没有缓冲区用于接收数据),服务器不得不持续的向客户端发出ZeroWindowProbe包,询问客户端是否可以接收数据。
防御原理:
报文经过防御系统后防御系统将记录每个IP的连接行为做出标记:比如可分为正常,异常,可疑等级别。达到一定次数加入黑名单。
具体如空连接异常的判断标准为在连接建立和关闭过程中,或者建立后长时间,没有正常的数据交互过程,则可判定为空连接。
慢连接:建立后报文交互缓慢,一定时间内总传输数据小于特定值,则视为慢连接异常。
异常报文攻击:
TCP为了实现全双工的流传输,定义了负载的各种流控,并且整个传输过程都根据数据包中的标志位,进行状态机的状态切换。发送大量的异常报文,可能导致协议栈处理的过程中发送错误,而使系统奔溃。
防御方式较为简单:
1.是基于上述提到过的tcp会话机制,加入状态的检查,特定状态下只接收特意的允许的类型的报文。
2.过滤畸形报文,如syn,syn_ack报文中一定不带负载。过滤分片报文等(有一定概率误拦截)。
总的来说,利于上述的防御原理,基于TCP的特性,在带宽充足的情况下,防御效果基本良好。针对连接耗尽类型的攻击,还需要根据业务的特征,来定制连接的识别。比如基于用户的登录信息等等。
End