CVE-2023-44487 是什么?
1.核心问题: 这是一种新型的 分布式拒绝服务攻击 方法。
2.攻击名称: 通常被称为 “HTTP/2 快速重置攻击”。
3.攻击原理:
攻击者利用 HTTP/2 协议的一个特性:客户端可以非常快速地发起大量的 HTTP 请求。
最关键的一步是,攻击者在服务器处理和响应这些请求之前,就通过发送 RST_STREAM 帧主动取消/重置这些请求。
这样,攻击者就能在极短时间内发起海量(例如,数千万甚至数亿次)的请求-重置操作。
4.攻击效果:*
虽然单个被取消的请求不会消耗服务器太多资源(因为被提前终止了),但这种超高频率、超高数量的请求洪流会压倒服务器*。
*服务器需要为每个新请求分配和初始化资源(内存、CPU 时间、可能的 TLS 握手开销等),即使请求被快速取消,这个初始化的开销累积起来也非常巨大。
*导致目标服务器资源(CPU、内存、连接数)耗尽,无法处理合法用户的请求,从而实现 DDoS 攻击的目的。
为什么这个漏洞很严重?
1.影响范围极广: 几乎所有支持 HTTP/2 的服务器、代理、负载均衡器、CDN 和 Web 应用框架都受到影响。这包括 Nginx, Apache, Cloudflare, Google Cloud, AWS ALB, Microsoft IIS, Node.js, Envoy 等等。
2.攻击效率高: 攻击者可以用相对较少的资源(较少的攻击机器或较低的带宽)发动非常大规模的 DDoS 攻击,峰值流量可以达到前所未有的高度(例如数亿 RPS - 每秒请求数)。
3.协议层问题: 这不是某个特定软件的实现错误,而是对 HTTP/2 协议本身特性的滥用。因此影响的是整个协议栈的部署。
如何缓解/修复?
不是“打补丁”修复协议: HTTP/2 协议本身不会被修改。缓解措施主要在服务器、中间件和网络基础设施提供商*层面实现。
*主要缓解策略:
*限制请求速率: 对来自单个客户端 IP 或连接的请求速率设置上限。
*限制并发流: 降低单个 HTTP/2 连接允许的最大并发流数量。
*延迟流创建: 在建立新流之前引入微小延迟,增加攻击者的成本。
*主动断开恶意连接: 检测到异常高频率的请求-重置模式后,主动断开可疑的连接。
*增加资源成本: 对于快速重置的请求,服务器端仍保留少量资源占用一小段时间,增加攻击者的资源消耗。
*云和 CDN 提供商: 主要的云服务商(AWS, GCP, Azure)和 CDN 提供商(Cloudflare, Akamai 等)在其基础设施上快速部署了这些缓解措施,保护了依赖其服务的客户。
*自建服务管理员: 需要更新其 Web 服务器(如 Nginx, Apache)、负载均衡器或代理软件到包含缓解措施的最新版本,并可能需要调整相关配置参数。
总结
CVE-2023-44487 是一种利用 HTTP/2 协议设计进行高效 DDoS 攻击的方法(HTTP/2 Rapid Reset)。它不涉及数据窃取或系统入侵,但能导致目标网站或服务瘫痪。其严重性在于影响范围广泛且攻击威力巨大。防御依赖于基础设施和服务提供商在其系统中实施速率限制、连接管理等相关缓解策略。
如何确认 OpenResty 1.21.4.3 是否已修复 CVE-2023-44487 ?
要验证 OpenResty 1.21.4.3 是否已修复 CVE-2023-44487(HTTP/2 快速重置攻击),可通过以下步骤进行测试:
1. 确认 OpenResty 版本
首先确保环境中运行的版本正确:
openresty -v
输出应包含 nginx version: openresty/1.21.4.3。
2. 使用专用测试工具验证
方法一:使用 h2load(推荐)
h2load 是 HTTP/2 性能测试工具,可模拟快速重置攻击:
从源码编译安装(适合需要最新版本)
# 安装编译依赖
yum -y groupinstall "Development Tools"
yum -y install libev-devel jemalloc-devel openssl-devel libxml2-devel c-ares-devel jansson-devel
# 下载最新源码(替换为最新版本号)
# 检查 https://github.com/nghttp2/nghttp2/releases
NGHTTP2_VER="1.68.0"
wget https://github.com/nghttp2/nghttp2/releases/download/v${NGHTTP2_VER}/nghttp2-${NGHTTP2_VER}.tar.gz
tar xvf nghttp2-${NGHTTP2_VER}.tar.gz
cd nghttp2-${NGHTTP2_VER}
# 编译安装
./configure
make
make install
# 更新库链接
ldconfig
# 验证安装
h2load --version
# 安装 h2load(Debian/Ubuntu)
sudo apt install nghttp2-client
# 执行测试命令(替换 your-server-ip)
h2load -n 100000 -c 1000 -m 100 \
--reset-stream=1 \
--max-concurrent-streams=100 \
https://your-server-ip
参数说明:
-
-n 100000:总请求数 -
-c 1000:并发连接数 -
-m 100:每个连接的并发流数 -
--reset-stream=1:每个请求后发送 RST_STREAM(模拟快速重置) -
--max-concurrent-streams=100:允许的并发流上限(需 ≥ 服务器配置)
验证结果:
-
修复成功:服务保持稳定,无崩溃或宕机,日志无异常(如
worker process is shutting down)。 -
存在漏洞:OpenResty 崩溃、重启或出现
out of memory错误。
方法二:使用 CVE-2023-44487 PoC 脚本
通过 GitHub 上的公开 PoC 验证:
# 克隆 PoC 仓库(示例)
git clone https://github.com/grafov/h2load-reset-attack-poc.git
cd h2load-reset-attack-poc
# 运行测试(替换 your-server-ip)
./attack.sh your-server-ip
注意:PoC 脚本可能需调整参数(如流并发数、重置频率)。
3. 监控系统指标
测试期间实时监控资源使用情况:
# 监控 OpenResty 进程状态
top -p $(pgrep -d',' -f openresty)
# 检查内存/CPU
htop
# 查看 OpenResty 错误日志
tail -f /usr/local/openresty/nginx/logs/error.log
关键指标:
- CPU 和内存无异常飙升。
- 无
worker_connections are not enough或SIGSEGV崩溃日志。 - 服务持续响应正常请求。
4. 对比测试结果
- 未修复版本(如 OpenResty < 1.21.4.1):攻击会导致服务崩溃。
-
修复版本(1.21.4.3):服务稳定运行,仅记录少量流重置日志(如
stream closed with error: PROTOCOL_ERROR)。
5. 补充验证
- 正常流量测试:确保修复后 HTTP/2 普通请求不受影响:
curl -k -I --http2 https://your-server-ip
-
配置检查:确认未禁用 HTTP/2(
listen 443 ssl http2)。
结论
若测试中 OpenResty 保持稳定(无崩溃、资源正常),且错误日志仅显示协议级重置(非致命错误),则 CVE-2023-44487 已修复。建议结合自动化工具(如 h2load)和资源监控进行综合验证。
参考
OpenResty 1.21.4.3 Released
http://openresty.org/cn/ann-1021004003.html
https://openresty.org/download/openresty-1.21.4.3.tar.gz
nghttp2 - HTTP/2 C Library and tools
https://github.com/nghttp2/nghttp2