一个针对 HTTP/2 服务器的拒绝服务(DoS)概念验证。通过将 HPACK 放大与流保持相结合,一台拥有普通网络连接的机器即可在数秒内使存在漏洞的服务器不可用。
CVE-2026-49975mod_http2 模块中存在一个过大内存分配漏洞(CWE-789),允许通过特制的 HTTP 请求发起拒绝服务攻击。该漏洞利用按多个阶段进行,如其执行日志所示:
TCP/TLS 连接建立
向目标服务器打开多个并发 TCP/TLS 连接。
HTTP/2 协商
客户端探测服务器允许的最大并发流数(通常为 100 或 128)。
HPACK 预热
发送精心构造的 HTTP 头,强制服务器分配过大的 HPACK 压缩表,迅速增加内存消耗。
连接保持
一旦流被打开,连接将无限期保持存活,阻止已分配的内存被释放,最终耗尽服务器可用的内存。
测试针对多个 Web 服务器,使用其默认配置进行。
| Web 服务器 | 测试版本 | 内存 | 内存耗尽 | 观察到的行为 |
|---|---|---|---|---|
| Envoy | 1.37.2 | 32 GB | ~10 秒 | 非常迅速地成功耗尽了内存。 |
| Apache HTTP Server | 2.4.67 | 32 GB | ~18 秒 | 流限制通常为 100。通过 HPACK 预热和无限期连接保持的标准攻击流程。 |
| nginx | 1.29.7 | 32 GB | ~45 秒 | 流限制通常为 128。攻击成功,但需要更多时间才能耗尽可用内存。 |
| Microsoft IIS | 未指定 | 64 GB | ~45 秒 | 可能通告异常大的流限制,例如 4294967297。 |
| 无漏洞目标 | 多种 | - | - | 当尝试超过服务器配置的流限制时,会立即出现 TLS 故障或 TooManyStreamsError。 |
h2.exceptions.TooManyStreamsError当提供给 --streams 的值超过服务器支持的最大并发流数时发生。
解决方案: 在发起攻击之前,先探测服务器的流限制。
NameError: name 'SettingsAcknowledued' is not definedPoC 源代码中的一个简单拼写错误。
解决方案: 将:
SettingsAcknowledued
替换为:
SettingsAcknowledged
[SSL] unknown error通常表示目标不支持基于 TLS 的 HTTP/2,或正在拒绝传入的连接。
EOF occurred in violation of protocol远程服务器意外关闭了连接。
这通常发生在服务器开始耗尽资源并拒绝新连接时。
Invalid input ConnectionInputs.SEND_HEADERS在所有请求头传输完成之前,服务器就关闭了 HTTP/2 连接。
该概念验证以 Python 脚本形式实现。
git clone https://github.com/califio/http2-bomb.git
cd http2-bomb
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
使用 10 个连接和 100 个流进行基本攻击:
python bomb.py example.com --streams 100 --connections 10
(要求目标允许每个连接至少 100 个并发流。)
自动检测流限制:
python bomb.py example.com --connections 10
大规模攻击:
python bomb.py target.example.com --connections 50
高并发连接测试:
python h2bomb.py -t target.example.com:443 -c 1000
超大规模连接测试:
python h2bomb.py -t example.com -c 20000
本软件仅供安全研究、教育目的以及测试您拥有明确授权的系统使用。
未经授权使用本工具攻击您不拥有或未经许可测试的系统,可能违反适用的法律法规。作者和贡献者不对因使用本软件而导致的任何误用或损害承担任何责任。