HTTP/2 CONTINUATION Flood 攻击漏洞与防护
描述:
HTTP/2 CONTINUATION Flood 攻击是一种针对HTTP/2协议实现的资源耗尽型拒绝服务(DoS)攻击。它利用HTTP/2协议中用于传输大型HTTP头部(HEADERS)帧的CONTINUATION帧机制,通过发送大量、恶意构造的CONTINUATION帧,而不发送终结标记(END_HEADERS标志),迫使服务器持续等待并消耗大量内存、CPU等资源,最终导致服务不可用。此攻击不同于HTTP/2快速重置攻击,其攻击载荷在于头部帧的持续传输而非请求的创建与取消。
解题过程循序渐进讲解:
步骤1:理解HTTP/2头部块分片与CONTINUATION帧机制
首先,需要理解HTTP/2协议中如何传输HTTP头部。在HTTP/1.x中,头部是纯文本。在HTTP/2中,头部经过HPACK压缩后,作为二进制帧传输。一个完整的、经过压缩的头部数据块称为“头部块(Header Block)”。
- HEADERS帧:用于发起一个请求或响应,并可以携带一部分或全部头部块。如果HEADERS帧设置了
END_HEADERS标志,表示这是该头部块的最后一帧。 - CONTINUATION帧:当头部块太大,一个HEADERS帧装不下时,或者为了实现特定目的(如攻击),可以将头部块分片。HEADERS帧携带第一片,并且不设置
END_HEADERS标志。后续的片段则通过一个或多个CONTINUATION帧传输。只有最后一个CONTINUATION帧(或那个未分片的HEADERS帧)可以设置END_HEADERS标志,表示头部块传输完毕,服务器/客户端才能开始解析并处理这个完整的头部。
步骤2:识别攻击原理 - 滥用CONTINUATION帧
攻击者发现了协议实现中的一个潜在风险点:协议规定,在收到END_HEADERS标志之前,接收方必须缓冲所有收到的头部块分片(来自HEADERS帧和后续的CONTINUATION帧)。
- 发起恶意连接:攻击者与目标服务器建立一个HTTP/2连接。
- 发送不完整的头部块流:攻击者发送一个不设置
END_HEADERS标志的HEADERS帧(例如,发起一个GET或POST请求)。这个帧携带了头部块的第一部分。 - 持续发送CONTINUATION帧,但不终结:接着,攻击者持续发送大量的CONTINUATION帧。关键点在于,这些CONTINUATION帧也都不设置
END_HEADERS标志。 - 资源消耗:由于始终没有收到
END_HEADERS标志,服务器会认为“这个请求的头部还没传输完”,因此必须为这个“未完成”的请求持续分配缓冲区来存储这些CONTINUATION帧带来的数据。同时,服务器会维持这个请求的状态,等待其完成。 - 放大攻击:攻击者可以在一个连接上并发发起多个这样的“永不结束”的请求流(利用HTTP/2的多路复用特性),每个流都消耗一份资源。攻击者也可以建立大量这样的连接。服务器内存、CPU(用于维护状态和缓冲区管理)会因此被快速耗尽,导致合法请求无法得到处理,形成DoS。
步骤3:分析漏洞成因与影响
- 根本原因:HTTP/2协议实现(服务器、代理、负载均衡器等)未能对单个流(Stream)上未终结的头部块分片(即连续的CONTINUATION帧)数量或总大小施加合理的限制,或者限制过于宽松,容易被攻击者突破。
- 攻击特点:
- 低带宽消耗:攻击者发送的CONTINUATION帧可以很小(甚至只包含最少量的填充),但数量巨大。
- 高资源消耗:服务器端需要为每个未完成的流维护状态和缓冲区,消耗远大于攻击流量。
- 协议合规:攻击流量本身可能完全符合HTTP/2协议规范,使得基于异常协议数据包检测的防御机制可能失效。
- 影响目标:所有支持HTTP/2的服务端软件,如Nginx、Apache、各类应用服务器(Tomcat, Jetty)、CDN、API网关等,若其HTTP/2实现存在缺陷,均可能受影响。
步骤4:防护与缓解措施
防护的核心思路是:在协议允许的范围内,对可能被滥用的资源施加严格的限制。
-
更新与打补丁:
- 这是最直接有效的方法。关注你所使用的Web服务器、代理、负载均衡器等软件的官方安全公告。当供应商发布针对此类CONTINUATION Flood攻击的补丁时,应立即更新。补丁通常会引入更严格的限制策略。
-
配置防护策略(如果软件支持):
- 限制单个流上CONTINUATION帧的数量:在服务器配置中,设定一个流上允许的连续CONTINUATION帧的最大数量(例如,不超过10-100个)。超过此限制,立即重置(RST_STREAM)该流。
- 限制单个头部块的总大小:设置一个请求或响应的头部块允许的最大总字节数。这不仅防御CONTINUATION Flood,也防御其他头部过大导致的攻击。
- 限制未完成流的超时时间:如果一个流在开启后,长时间(如几秒到几十秒)没有完成(例如未收到END_HEADERS),服务器应主动重置该流,释放资源。
- 示例(以Nginx为例,需查看其对应版本的配置项):
http { # 限制头部最大大小(默认值通常足够,可确认或调小) client_header_buffer_size 1k; large_client_header_buffers 4 8k; # HTTP/2相关限制,具体指令名可能因版本和补丁而异 # 例如,可能存在的指令如 `http2_max_concurrent_streams`, `http2_stream_buffer_size` 等 # 需查阅对应版本支持HTTP/2防护的专门指令。 }
-
部署外部防护:
- Web应用防火墙(WAF):部署支持第7层协议分析的WAF。高级WAF可以深度解析HTTP/2流量,识别出包含异常多CONTINUATION帧且无终结标志的流,并主动拦截或重置连接。
- DDoS防护服务/设备:专业的DDoS防护服务通常具备应用层(L7)攻击防护能力,可以识别和缓解此类协议滥用攻击。它们可以基于行为分析,对来自同一源的、持续发送不完整流的连接进行速率限制或封禁。
-
监控与告警:
- 在服务器和网络层面部署监控,关注异常指标:
- HTTP/2流完成率骤降。
- 单个连接上并发未完成流数量异常高。
- 服务器内存使用量(特别是缓冲区相关)异常增长。
- 出现大量带有RST_STREAM错误码(如REFUSED_STREAM, INTERNAL_ERROR)的连接断开。
- 设置相应的阈值告警,以便在攻击发生时能快速响应。
- 在服务器和网络层面部署监控,关注异常指标:
总结:
HTTP/2 CONTINUATION Flood攻击利用了协议规范中头部块分片传输机制的潜在资源消耗点。防御关键在于对协议实现进行加固,通过严格限制每个流上CONTINUATION帧的数量、头部块总大小以及未完成流的生存期,并辅以外部防护和有效监控,来保障服务的可用性。作为开发者或运维人员,应保持中间件版本更新,并合理配置安全参数。