慢速CC攻击的狡猾之处在于它不追求洪水般的请求量,而是像一只慢慢勒紧的手,用极低的流量耗尽服务器的连接池。传统的频率限制和单IP请求量统计在这种攻击面前基本失效,因为攻击者可能每分钟只发几个请求,甚至刻意模拟正常用户的浏览节奏。真正能撕开这种伪装的手段,是对访问时序进行深度分析。访问时序关注的不再是“请求了多少次”,而是“请求与请求之间的时间间隔分布”以及“连接从建立到关闭的生命周期特征”。
连接占用时长与请求间隔的异常耦合正常用户访问网站时,会有一个自然的“阅读-点击”节奏。打开一个页面后,浏览器会在短时间内集中下载页面关联的静态资源,随后进入一段相对安静的浏览期,接着可能是下一次点击。反映在时序上,就是一个连接上会出现短暂的请求突发,然后沉寂数秒甚至数十秒。而慢速CC攻击为了达到占用资源的目的,往往需要刻意拉长连接时间,但在连接存续期间,其数据交互模式极为反常。一种常见手法是攻击者在建立TCP连接并完成TLS握手后,以极慢的速度发送HTTP头部,每隔十几秒发送一个字节,让服务器一直处于等待头部结束的状态。通过分析每个连接的“首字节到达时间”到“完整头部接收时间”的差值,可以精准捕捉这类行为。正常的差值通常在毫秒级,而慢速攻击的这个差值会呈现明显的长尾分布,甚至稳定在某个固定的超时阈值附近。
基于滑动窗口的突发性指数计算单纯看平均请求间隔是不够的,攻击者可以轻松伪造平均间隔。需要引入一个更硬核的指标:突发性指数。具体做法是,为每个IP定义一个时间窗口,比如60秒,然后计算该窗口内请求间隔的变异系数。正常用户的访问模式是突发与静默交替,变异系数会很高;而慢速攻击为了维持连接不超时,往往会以近乎恒定的间隔发送微小数据包,比如每15秒发送一个字节,其变异系数会异常的低。更进一步,可以结合请求体大小与间隔的比值来建模。如果一个IP在长连接中,每次发送的数据载荷极小,但发送间隔却非常规律,这个特征组合几乎可以直接判定为慢速攻击。在工程实现上,可以用Redis的有序集合记录每个IP最近N次请求的时间戳,实时计算间隔的标准差与均值之比,当比值持续低于阈值且连接数超过基准线时触发告警。
# 伪代码:计算IP的请求间隔变异系数
def calculate_cv(ip, timestamps):
if len(timestamps) < 3:
return 0
intervals = []
for i in range(1, len(timestamps)):
intervals.append(timestamps[i] - timestamps[i-1])
mean_interval = sum(intervals) / len(intervals)
if mean_interval == 0:
return 0
variance = sum((x - mean_interval) 2 for x in intervals) / len(intervals)
std_dev = variance 0.5
cv = std_dev / mean_interval
return cv
TCP状态转移路径的异常检测
访问时序分析不能只停留在HTTP层面,TCP层蕴含的信息更为底层且难以伪造。一个完整的正常HTTP请求,TCP连接会经历SYN_SENT、ESTABLISHED、FIN_WAIT等标准状态转移。慢速CC攻击中的Slowloris变种,会刻意让连接长时间停留在ESTABLISHED状态,既不传输完整数据,也不主动关闭连接。通过分析服务器内核输出的连接状态快照,可以统计每个IP处于ESTABLISHED状态且无数据流动的连接数量。更精细的做法是监控TCP的重传超时次数和零窗口探测频率。攻击者如果故意不接收数据,导致接收缓冲区满,服务器会不断进行零窗口探测,这类连接的时序特征会呈现出周期性的探测包发送,周期通常在数秒到数十秒之间,与正常突发流量有明显区别。
请求内容序列的马尔可夫链建模除了时间维度,请求的URL序列也包含时序信息。正常用户的页面访问路径存在业务逻辑上的先后依赖,比如从商品列表页进入详情页,再到购物车或结算页。这种转移概率可以用马尔可夫链来建模。先基于历史合法流量训练出一个状态转移矩阵,记录从页面A到页面B的概率。在线检测时,对于每个会话,计算其实际转移路径在模型中的出现概率。慢速CC攻击往往只针对少数几个高消耗URL进行反复请求,其转移序列会频繁出现低概率甚至零概率的跳转,比如反复从首页直接跳转到同一个搜索接口,中间没有正常的浏览间隔。结合时序来看,如果这种低概率跳转还伴随着极低的请求间隔变异系数,那么基本可以确定是自动化攻击。
基于信息熵的时序复杂度评估信息熵是衡量序列随机性的有力工具。将一段时间内某个IP的请求间隔序列进行离散化处理,比如将间隔划分为0-1秒、1-5秒、5-10秒、10-30秒、30秒以上等区间,然后计算这些区间出现频率的信息熵。正常用户的行为受思维和阅读速度影响,间隔分布较为丰富,熵值较高。慢速攻击脚本为了保持连接,其间隔往往集中在某个狭窄区间内,熵值明显偏低。同时,可以引入多尺度熵的概念,在不同时间粒度上计算熵值。一个高级的慢速攻击可能会在宏观上模拟正常间隔,但在微观的毫秒级精度上暴露出机器定时的规律性。这种跨尺度的熵差分析,能够识别出那些试图通过加入随机抖动来掩盖自身规律的攻击流量。
利用连接生命周期中的“静默期”识别每个HTTP连接从建立到关闭,中间存在数据静默期。正常用户在浏览器中打开页面后,连接会在资源加载完毕后进入静默,然后由浏览器或服务器端的keep-alive超时机制关闭。慢速CC攻击的核心就是恶意延长这个静默期,并在静默期内发送极少量数据以重置超时计时器。因此,可以专门统计每个连接中“有数据传输的时间”与“总连接时长”的比值,即连接利用率。正常短连接的利用率接近100%,正常长连接在页面加载完成后利用率会迅速下降,但最终会被关闭。慢速攻击的连接利用率则长期维持在一个极低水平,比如低于5%,且总连接时长接近服务器的超时阈值。通过实时计算每个源IP所有活跃连接的平均利用率和平均时长,可以非常直观地识别出那些在“空转”的连接。
时序指纹库与动态基线自学习静态的阈值规则难以适应业务流量的自然波动,需要建立动态基线。系统可以按小时粒度,对每个业务接口的正常访问时序特征进行学习,包括请求间隔的P50、P95分位值、连接时长的分布、突发性指数的正常范围等。利用流式计算框架,持续更新这些基线。当某个IP的时序特征偏离其所属业务接口的基线超过三个标准差时,标记为异常。更进一步,可以提取攻击样本的时序指纹,比如特定的间隔序列模式、TCP窗口大小变化规律等,形成指纹库进行实时匹配。这种方法能够有效应对那些针对特定CMS或框架漏洞发起的慢速攻击,因为这些攻击工具生成的流量往往带有固定的时序指纹。
多层时序特征的联合决策单一时序指标存在误报可能,比如某些特殊的物联网设备或后台同步程序,也可能表现出低突发性、长连接的特征。因此,需要构建一个多层联合决策引擎。第一层是实时特征计算层,从数据包级、流级、连接级三个维度同时提取时序特征。第二层是单指标异常评分层,对每个特征值进行归一化并计算偏离度。第三层是综合判决层,采用加权评分或简单的逻辑回归模型,将多个弱特征组合成一个强信号。例如,当“连接利用率低于10%”、“请求间隔变异系数低于0.3”、“TCP零窗口探测次数大于5”这三个条件同时满足时,才触发最终拦截。这种多层联合决策机制,既保证了检测的灵敏度,又有效控制了误伤率,是生产环境中落地时序分析方案的关键。
