HTTP/2 CONTINUATION Flood 攻击漏洞与防护
字数 2716 2025-12-12 17:36:17

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帧)。

  1. 发起恶意连接:攻击者与目标服务器建立一个HTTP/2连接。
  2. 发送不完整的头部块流:攻击者发送一个不设置END_HEADERS标志的HEADERS帧(例如,发起一个GET或POST请求)。这个帧携带了头部块的第一部分
  3. 持续发送CONTINUATION帧,但不终结:接着,攻击者持续发送大量的CONTINUATION帧。关键点在于,这些CONTINUATION帧也都不设置END_HEADERS标志
  4. 资源消耗:由于始终没有收到END_HEADERS标志,服务器会认为“这个请求的头部还没传输完”,因此必须为这个“未完成”的请求持续分配缓冲区来存储这些CONTINUATION帧带来的数据。同时,服务器会维持这个请求的状态,等待其完成。
  5. 放大攻击:攻击者可以在一个连接上并发发起多个这样的“永不结束”的请求流(利用HTTP/2的多路复用特性),每个流都消耗一份资源。攻击者也可以建立大量这样的连接。服务器内存、CPU(用于维护状态和缓冲区管理)会因此被快速耗尽,导致合法请求无法得到处理,形成DoS。

步骤3:分析漏洞成因与影响

  • 根本原因:HTTP/2协议实现(服务器、代理、负载均衡器等)未能对单个流(Stream)上未终结的头部块分片(即连续的CONTINUATION帧)数量或总大小施加合理的限制,或者限制过于宽松,容易被攻击者突破。
  • 攻击特点
    • 低带宽消耗:攻击者发送的CONTINUATION帧可以很小(甚至只包含最少量的填充),但数量巨大。
    • 高资源消耗:服务器端需要为每个未完成的流维护状态和缓冲区,消耗远大于攻击流量。
    • 协议合规:攻击流量本身可能完全符合HTTP/2协议规范,使得基于异常协议数据包检测的防御机制可能失效。
  • 影响目标:所有支持HTTP/2的服务端软件,如Nginx、Apache、各类应用服务器(Tomcat, Jetty)、CDN、API网关等,若其HTTP/2实现存在缺陷,均可能受影响。

步骤4:防护与缓解措施
防护的核心思路是:在协议允许的范围内,对可能被滥用的资源施加严格的限制。

  1. 更新与打补丁

    • 这是最直接有效的方法。关注你所使用的Web服务器、代理、负载均衡器等软件的官方安全公告。当供应商发布针对此类CONTINUATION Flood攻击的补丁时,应立即更新。补丁通常会引入更严格的限制策略。
  2. 配置防护策略(如果软件支持)

    • 限制单个流上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防护的专门指令。
      }
      
  3. 部署外部防护

    • Web应用防火墙(WAF):部署支持第7层协议分析的WAF。高级WAF可以深度解析HTTP/2流量,识别出包含异常多CONTINUATION帧且无终结标志的流,并主动拦截或重置连接。
    • DDoS防护服务/设备:专业的DDoS防护服务通常具备应用层(L7)攻击防护能力,可以识别和缓解此类协议滥用攻击。它们可以基于行为分析,对来自同一源的、持续发送不完整流的连接进行速率限制或封禁。
  4. 监控与告警

    • 在服务器和网络层面部署监控,关注异常指标:
      • HTTP/2流完成率骤降
      • 单个连接上并发未完成流数量异常高
      • 服务器内存使用量(特别是缓冲区相关)异常增长
      • 出现大量带有RST_STREAM错误码(如REFUSED_STREAM, INTERNAL_ERROR)的连接断开
    • 设置相应的阈值告警,以便在攻击发生时能快速响应。

总结
HTTP/2 CONTINUATION Flood攻击利用了协议规范中头部块分片传输机制的潜在资源消耗点。防御关键在于对协议实现进行加固,通过严格限制每个流上CONTINUATION帧的数量、头部块总大小以及未完成流的生存期,并辅以外部防护和有效监控,来保障服务的可用性。作为开发者或运维人员,应保持中间件版本更新,并合理配置安全参数。

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为例,需查看其对应版本的配置项) : 部署外部防护 : Web应用防火墙(WAF) :部署支持第7层协议分析的WAF。高级WAF可以深度解析HTTP/2流量,识别出包含异常多CONTINUATION帧且无终结标志的流,并主动拦截或重置连接。 DDoS防护服务/设备 :专业的DDoS防护服务通常具备应用层(L7)攻击防护能力,可以识别和缓解此类协议滥用攻击。它们可以基于行为分析,对来自同一源的、持续发送不完整流的连接进行速率限制或封禁。 监控与告警 : 在服务器和网络层面部署监控,关注异常指标: HTTP/2流完成率骤降 。 单个连接上并发未完成流数量异常高 。 服务器内存使用量(特别是缓冲区相关)异常增长 。 出现大量带有RST_ STREAM错误码(如REFUSED_ STREAM, INTERNAL_ ERROR)的连接断开 。 设置相应的阈值告警,以便在攻击发生时能快速响应。 总结 : HTTP/2 CONTINUATION Flood攻击利用了协议规范中头部块分片传输机制的潜在资源消耗点。防御关键在于对协议实现进行加固,通过严格限制每个流上CONTINUATION帧的数量、头部块总大小以及未完成流的生存期,并辅以外部防护和有效监控,来保障服务的可用性。作为开发者或运维人员,应保持中间件版本更新,并合理配置安全参数。