包含与 CVE-2019-9511 和 CVE-2019-9513 相关行为的受控验证脚本的仓库,这两个漏洞均涉及 HTTP/2 实现中的拒绝服务向量。
这些脚本旨在支持在授权环境中的技术验证,允许观察服务器是否协商 HTTP/2 并响应与 Data Dribble 和 Priority Churn 相关的特定模式,而不执行拒绝服务攻击。
其目的是以轻量、安全的方式证明该向量,请求量低,且不以使环境不可用为目标。
| CVE | 名称 | 脚本 | 描述 |
|---|---|---|---|
CVE-2019-9511 | HTTP/2 Data Dribble | data_dribble_probe.py | 通过受控方式释放小块数据来验证 HTTP/2 流量控制行为的有效性。 |
CVE-2019-9513 | HTTP/2 Priority Churn / Resource Loop | priority_churn_probe.py | 验证低强度下 PRIORITY 帧处理行为的有效性。 |
CVE-2019-9511,也称为 HTTP/2 Data Dribble,影响某些未能高效处理流量窗口操作和数据逐步交付的 HTTP/2 实现。
在此场景中,攻击者可以向服务器请求数据,并操纵流量控制,使响应保持打开状态并以小块(如 1 字节数据包)方式交付。在某些实现中,此行为可能导致 CPU、内存或连接资源的过度消耗,从而产生拒绝服务风险。
在本仓库中,相关脚本为:
data_dribble_probe.py
该脚本的目标是以轻量方式验证行为,不产生激进负载,也不试图导致不可用。
参考资料:
CVE-2019-9513,也称为 HTTP/2 Priority Churn 或 Resource Loop,影响某些以高成本处理流优先级树持续变更的 HTTP/2 实现。
在此场景中,攻击者可以创建多个流并反复更改这些流之间的优先级,导致优先级树发生搅动。在某些实现中,此行为可能导致 CPU 过度消耗,进而引发拒绝服务。
在本仓库中,相关脚本为:
priority_churn_probe.py
该脚本的目标是验证服务器是否接受并处理 PRIORITY 帧,使用低强度且不执行 DoS 攻击。
参考资料:
CVE-2019-9511 和 CVE-2019-9513 并不与某个特定的 Web 服务器版本(如仅 nginx、Apache 或 Tomcat)关联。
它们影响不同产品、库、代理、负载均衡器和服务器中的某些 HTTP/2 实现。因此,验证应考虑分析环境中哪个组件正在协商和处理 HTTP/2。
可能涉及的组件示例:
nginx
Apache HTTP Server
Envoy
HAProxy
Tomcat
Jetty
Node.js
Go net/http2
nghttp2
CDN
WAF
Load Balancer
Ingress Controller Kubernetes
第一个技术标准是确认服务是否通过 ALPN 协商 HTTP/2。如果服务不协商 h2,则这些脚本不适用。
漏洞确认应基于识别到的组件的官方公告。
在运行脚本之前,请验证目标是否通过 ALPN 协商 HTTP/2。
命令中仅使用域名,不带 https://。
openssl s_client -alpn h2 -connect exemplo.com.br:443 </dev/null 2>/dev/null | grep -i "ALPN"
也可使用占位符:
openssl s_client -alpn h2 -connect <HOST>:443 </dev/null 2>/dev/null | grep -i "ALPN"
预期输出:
ALPN protocol: h2
如果输出显示 h2,则服务协商 HTTP/2,脚本可能适用。
如果没有返回值或协商的协议为其他(如 http/1.1),则该端点不适用这些脚本。
| 脚本 | 相关 CVE | 目的 | 何时使用 |
|---|---|---|---|
data_dribble_probe.py | CVE-2019-9511 | 验证与 Data Dribble 相关的行为,通过窗口控制释放小块数据 | 当服务器支持 HTTP/2 且需要检查在窗口缩小情况下的 DATA 帧交付行为时使用。 |
priority_churn_probe.py | CVE-2019-9513 | 验证与 Priority Churn 相关的行为,使用低强度 PRIORITY 帧 | 当服务器支持 HTTP/2 且需要检查它是否处理流优先级变更时使用。 |
脚本使用的逻辑顺序为:
1. 使用 openssl 进行 HTTP/2 预验证
↓
2. priority_churn_probe.py
↓
3. data_dribble_probe.py
首先,使用 openssl 命令确认目标是否协商 HTTP/2。然后使用 priority_churn_probe.py 验证服务器是否接受并处理优先级帧。接着使用 data_dribble_probe.py 观察服务器在流量窗口缩小情况下受控释放小块数据的行为。
两个脚本均为轻量探测。他们的目标不是造成不可用,而是产生所观察行为的技术证据。
priority_churn_probe.py 是一个轻量 PoC,用于验证与 CVE-2019-9513(HTTP/2 Priority Churn)相关行为。
脚本通过 TLS 建立 HTTP/2 连接,打开少量 HTTP 流,并通过 PRIORITY 帧发送优先级变更。然后测量发送这些帧之前和之后的延迟,以观察处理是否有变化。
PING 测量初始延迟;PRIORITY 帧;当需要验证 HTTP/2 服务器是否接受并处理与 Priority Churn 向量相关的优先级帧,而不执行激进的 DoS 测试时,使用此脚本。
它适用于渗透测试中的受控验证、HTTP/2 暴露分析以及脆弱或有潜在风险行为的技术证明。
脚本通过命令行参数接收值:
--host
--port
--paths
--shuffles
| 参数 | 描述 |
|---|---|
--host | 授权目标的 FQDN。请勿包含 https://。 |
--port | HTTP/2 服务可用的 TLS 端口。默认:443。 |
--paths | 用于打开 HTTP/2 流的简单路径列表。 |
--shuffles | 优先级变更的循环次数。保持较低以确保安全测试。 |
使用轻量、公开且低影响的路径,例如:
/
/robots.txt
/favicon.ico
/health
/login
避免执行繁重操作、复杂查询、报告生成、上传、高级搜索或任何会给后端带来负载的路径。
python3 priority_churn_probe.py --host exemplo.com.br --port 443 --paths / /robots.txt /favicon.ico --shuffles 10
输出示例:
[OK] PING before: 45.20 ms; after churn: 52.80 ms; shuffles=10
Signal 9513: PRIORITY frames accepted and processed; subtle increase post-churn evidences the vector (no DoS).
如果脚本成功协商 HTTP/2、打开流并发送 PRIORITY 帧,则表明服务器处理此类行为。
搅动后延迟的轻微增加可用作该向量存在的技术证据,但不应单独解释为严重影响的证明。最终分类取决于上下文、服务器版本、架构、缓解措施、WAF/CDN 和 HTTP/2 配置。
data_dribble_probe.py 是一个轻量 PoC,用于验证与 CVE-2019-9511(HTTP/2 Data Dribble)相关行为。
脚本通过 TLS 建立 HTTP/2 连接,打开单个流,并操纵流量控制窗口以释放小块数据,模拟 DATA 帧的逐步交付行为。
当需要验证 HTTP/2 服务器是否响应与 Data Dribble 向量相关的缩小流量控制模式,而不执行激进负载时,使用此脚本。
它适用于受控技术证明,特别是当自动化工具指示可能暴露且需要手动验证以降低操作风险时。
脚本通过命令行参数接收值:
--host
--path
--port
--bytes
| 参数 | 描述 |
|---|---|
--host | 授权目标的 FQDN。请勿包含 https://。 |
--path | 测试中请求的路径。 |
--port | HTTP/2 服务可用的 TLS 端口。默认:443。 |
--bytes | 测试期间释放的总字节数。保持较低以确保安全验证。 |
使用一个简单、静态或服务器成本较低的路径,例如:
/
/robots.txt
/favicon.ico
/health
/login
避免执行数据库查询、繁重认证、异步处理、文档生成或对内部系统调用的端点。
python3 data_dribble_probe.py --host exemplo.com.br --path / --port 443 --bytes 12
输出示例:
[OK] HTTP/2 negotiated; DATA frames received: 12; bytes released: 12; time(ms): 1450
Signal 9511: multiple tiny DATA delivered under window=1 (evidence of dribble path without stress).
如果脚本协商 HTTP/2 并在窗口释放时接收到小的 DATA 帧,则表明服务器处理这种流量控制模式。
此行为可用作该向量的技术证据,但严重程度应考虑实际环境上下文,例如使用的服务器、版本、连接限制、负载均衡器、CDN、WAF、超时和防滥用保护。
脚本需要 Python 3 和 h2 库。
python3
pip
h2
ssl
socket
argparse
ssl、socket、time、argparse 和 select 库是 Python 标准库的一部分。
主要外部依赖项是:
h2
直接安装:
python3 -m pip install h2
使用虚拟环境安装:
python3 -m venv venv
source venv/bin/activate
pip install h2
验证安装:
python3 -c "import h2; print('h2 installed successfully')"
脚本依赖于通过 ALPN 协商 HTTP/2。
在执行之前,确认服务器是否支持 HTTP/2:
openssl s_client -alpn h2 -connect exemplo.com.br:443 </dev/null 2>/dev/null | grep -i "ALPN"
预期输出:
ALPN protocol: h2
如果服务器不协商 h2,则脚本不适用。
--host 参数中仅使用 FQDN不要在 --host 参数中包含 https://。
正确:
--host exemplo.com.br
错误:
--host https://exemplo.com.br
优先使用简单路径:
/
/robots.txt
/favicon.ico
/health
避免敏感或繁重的端点:
/relatorios
/export
/search
/upload
/api/processamento
目的是验证 HTTP/2 行为,而非给后端增压。
使用保守值:
对于 priority_churn_probe.py:
--shuffles 10
对于 data_dribble_probe.py:
--bytes 12
未经明确授权,请勿在生产环境中增加这些值。
openssl s_client -alpn h2 -connect exemplo.com.br:443 </dev/null 2>/dev/null | grep -i "ALPN"
python3 priority_churn_probe.py --host exemplo.com.br --port 443 --paths / /robots.txt /favicon.ico --shuffles 10
python3 data_dribble_probe.py --host exemplo.com.br --path / --port 443 --bytes 12
为降低与 HTTP/2 DoS 攻击相关的风险,建议保持 Web 服务器、代理、负载均衡器和 HTTP/2 库的更新,应用连接限制,配置适当的超时,限制并发流数量,限制 HTTP/2 帧的滥用,监控延迟异常,并评估在不需要该协议的服务上禁用 HTTP/2。
还建议验证 CDN、WAF、反向代理、Ingress Controller 和负载均衡器等层的保护,因为实际暴露通常更多地取决于边缘而非最终应用。
修复确认应基于环境中实际终止并处理 HTTP/2 的组件,例如 Web 服务器、代理、负载均衡器、CDN 或 Ingress Controller。
这些脚本仅应用于授权环境。
尽管它们是为轻量执行而编写,但它们直接与 HTTP/2 机制交互,这些机制与 DoS 向量相关。因此,使用必须符合正式的测试范围、参与规则以及与环境负责人协商的操作限制。
在生产环境中执行之前,请确认:
未经授权针对系统使用这些脚本是禁止的。
本仓库的目的完全是为了支持合法的安全活动,例如授权的渗透测试、受控漏洞验证、实验室环境、技术研究和安全风险演示。