搞安全运营的人最头疼的问题之一,就是CC攻击的流量和正常高并发流量长得越来越像。传统的频率限制很容易误杀大促期间的正常用户,或者被攻击者用海量代理IP轻松绕过。真正有效的区分手段,必须下沉到行为本身。行为轨迹分析不是看“来了多少人”,而是看“每个人是怎么逛的”,这是识别自动化攻击与真实用户的核心分水岭。

行为轨迹的核心指标:时间与序列的异常

正常的页面访问一定有阅读时间。一个真实用户打开文章页,哪怕只是扫一眼,停留时间通常也在10秒到几分钟之间。而CC攻击工具为了追求高并发,往往在几百毫秒内就完成一次请求并立即发起下一个。在日志里,这类请求的停留时间趋近于零。更关键的是访问序列。正常用户浏览网站,路径是连贯的:从首页点到列表页,再点到详情页,URL之间通过站内链接跳转,Referer字段会清晰地记录上一级来源。CC攻击的请求序列往往是离散的,直接对同一个消耗资源的接口(比如搜索接口、动态生成页面)进行高频请求,Referer经常为空或者是一个固定的伪造值,完全不符合人类的点击逻辑。

鼠标轨迹与生物特征的隐形防线

对于具备动态交互的Web应用,前端埋点能提供更细粒度的证据。真实用户在页面上移动鼠标、触摸屏幕时,轨迹是平滑且带有犹豫、回扫等非线性特征的。而简单的脚本攻击没有鼠标事件,高级一点的模拟攻击虽然能产生移动事件,但轨迹往往是完美的直线或贝塞尔曲线,缺乏人类手部微颤产生的噪声。在移动端,设备陀螺仪数据的细微变化、触摸压力感应(3D Touch)的波动,都是难以用低成本脚本伪造的生物特征。把这些前端采集到的行为数据回传到风控引擎,当某个会话的请求频率很高,但鼠标轨迹却是一条笔直的对角线时,基本可以判定为机器行为。

页面交互深度与事件触发模式

不要只盯着请求频率看。攻击流量通常只盯着目标URL猛打,从不执行JavaScript渲染,更不会触发页面内的非必要交互事件。真实用户会触发滚动事件、可视区域曝光事件、甚至无意识的误触。比如一个电商商品页,正常用户大概率会触发至少一次页面滚动,可能会查看评论区,可能会点击放大图片。CC攻击的请求往往只是获取HTTP状态码200,根本不解析DOM,更不会去请求懒加载的图片资源。如果在服务端日志中,发现某个IP或某批IP在访问详情页时,从未请求过该页面内嵌的CSS、JS或图片资源,这种“只吃主食不吃配菜”的行为模式就是典型的攻击指纹。

基于马尔可夫链的路径转移概率分析

这是将行为轨迹分析数学化的有效手段。把网站的所有页面定义为一个状态集合,统计海量正常用户的访问日志,计算出页面之间的转移概率矩阵。例如,从首页到搜索页的概率是0.3,从首页直接到支付页的概率几乎为0。当一个会话的访问路径在概率矩阵中频繁出现极低概率的跳转,比如从外部直接空降到支付页,或者反复在搜索页和结果页之间做毫秒级的钟摆式震荡,这个会话的马尔可夫得分就会极低。设定一个动态阈值,当会话的路径概率乘积低于正常基线时,直接将其标记为高风险访问。

请求载荷与节奏的熵值计算

真实用户的请求间隔是随机的,符合泊松分布,带有明显的突发性和静默期。而CC攻击软件为了最大化攻击效率,往往设定固定的线程数和请求间隔,导致请求时序呈现出机械的周期性。通过计算相邻请求时间差的熵值,可以量化这种随机性。正常流量的时间差熵值较高,混乱无序;攻击流量的熵值较低,整齐划一。同样,请求头部的组合也存在熵值差异。真实用户的User-Agent、Accept-Language、屏幕分辨率等报头组合千奇百怪,而攻击脚本通常使用硬编码的少数几种报头模板,报头组合的熵值明显偏低。这种统计层面的分析不依赖单点特征,很难通过简单修改脚本参数来绕过。

构建无监督聚类模型自动发现异常群体

面对未知的CC变种,规则总是滞后的。利用无监督学习算法,比如DBSCAN或Isolation Forest,可以实时发现行为异常的集群。特征工程不需要标记攻击样本,只需要定义正常行为该有的样子。提取会话特征向量:平均停留时间、页面浏览深度、请求间隔方差、是否触发鼠标事件、是否加载了静态资源、URL路径深度等。将这些向量投入模型,正常用户会紧密聚拢成一个大簇,而CC攻击流量由于行为模式单一且与正常行为差异巨大,会形成孤立的小簇或离群点。运营人员只需关注这些自动分离出来的异常簇,大大降低了人工分析日志的成本。

被动指纹与主动验证的联动机制

行为轨迹分析不是非要等到会话结束后才做离线判定。在网关层植入实时计算逻辑,当某个会话的行为偏离度超过预设的黄色预警线时,不要立即阻断,而是注入轻量级的JavaScript挑战。这个挑战不是粗暴的验证码,而是通过执行一段极简的JS代码,检测浏览器环境是否存在自动化工具的特征(如Selenium的webdriver属性、Headless模式下的权限差异),同时观察客户端能否正确执行这段计算并返回结果。真正的浏览器执行这段代码几乎无感,而简单的CC脚本通常不具备完整的JS解析引擎,会直接卡死在挑战环节。这种“行为异常-主动探测”的联动,既不影响正常用户的体验,又能精准捕获伪装度不高的攻击源。

流量基线自学习与动态阈值调整

静态的阈值是安全运营的陷阱。半夜三点和双十一大促的流量模型完全不同。系统必须根据历史数据自动建立分时段的流量基线。比如凌晨时段,正常用户访问间隔变长,页面浏览深度变浅,此时如果突然出现一批浏览行为极其“专注”且停留时间极短的访客,即便绝对请求量不大,也应提高警惕。动态阈值算法需要综合考虑请求速率、瞬时并发数以及行为偏离度。当实际指标偏离基线三个标准差以上时,触发相应的处置策略。这种自适应机制能有效发现低频慢速的CC攻击,这类攻击正是为了规避固定频率限制而设计的。

纵深防御:从L7到应用层的全链路布防

行为轨迹分析不能只放在应用层做。在L7负载均衡层,可以通过对TLS指纹(JA3/JA4指纹)的识别来初步判断客户端类型。不同的浏览器和操作系统在TLS握手阶段的加密套件组合各不相同,而Python脚本、Go语言编写的攻击工具使用的TLS库指纹与真实浏览器截然不同。在入口处识别出非浏览器指纹的流量,直接进行标记或限速。这部分流量进入应用层后,再结合业务行为轨迹进行二次验证。两层过滤下来,能够穿透防御体系的CC攻击流量将大幅减少。同时,将行为分析结果实时同步给上游的清洗设备,形成闭环的防御生态。

处置策略的精细化分级

区分出正常访问和CC攻击后,处置手段不能只有“放行”和“阻断”两种。对于高置信度的正常用户,给予完整的访问权限并加白;对于低风险的可疑会话,打上标签进行重点监控;对于中风险的会话,返回静态缓存页面或者进行人机验证;只有对高置信度的攻击流量,才执行TCP重置或永久封禁。这种分级处置既避免了误伤,又能在攻击期间保障核心业务的可用性。特别是对于大型内容分发网络,将攻击流量牵引到专门的缓存集群,返回过期或降级的静态内容,而不是直接返回错误页,可以在遭受大规模攻击时依然维持基本的品牌形象。

行为轨迹分析的本质,是从关注流量特征转向关注行为意图。攻击工具可以伪造IP、伪造报头,但很难在短时间内完美模拟人类在网站上的复杂浏览逻辑。将多维度的行为数据转化为可量化的风险评分,让防御体系长出“眼睛”和“大脑”,这才是应对CC攻击从被动挨打转向主动免疫的关键路径。