QPACK 手风琴攻击:一个 HTTP/3 连接就能把服务器内存撑爆
来源:foxio.io — 2026-10-20
📋 概述
FoxIO 的 Sébastien Féry 在十个 HTTP/3 实现中发现同一类放大漏洞:远端未认证客户端能让服务器分配比线上字节多几十到上千倍的内存,单条连接就足以让默认配置的服务器 OOM。根因是 QPACK 解码后的头部大小限制缺失、不完整或施加太晚,一个很小的 HEADERS 帧可以膨胀成几十万个头部对象。作者给出两种打法:塞满唯一头名,或用动态表让一条 4 KiB 条目被一字节引用反复实体化。
🔑 核心要点
- RFC 9114 §4.2.2 要求按解压后大小限流,并给每个字段加 32 字节开销;实现出错的方式共有五种
- 五种错法:检查压缩后尺寸、先全解压再检查、漏算 32 字节、未配置时默认无上限、配置了却从不执行
- 用 a 到 z、aa 到 zz 等唯一名字填满编码预算,一个 百万字节的 HEADERS 帧可塞进约 16 万个唯一头部
- 反向打法命中 lsquic 与 Bun:动态表插入一条约 4 KiB 的条目,再用一字节索引引用上千次,放大比达 4064:1
- 截至 10 月 20 日,quic-go 0.57.0、quiche 0.29.3、lsquic 4.9.0、Wireshark 4.6.2/4.4.12 已修;Bun 1.4.3、h3、aioquic/mitmproxy 未修;IIS、Envoy、ngtcp2/nghttp3 不受影响
💡 金句
A small HEADERS frame can therefore expand into hundreds of thousands of header objects in memory.
👍 0
👎 0
← 返回 Lobsters 首页