原文作者:Michael Vernik, Nina Forsyth
原文链接:漏洞处置:HTTP/2 快速重置攻击对 F5 NGINX 的影响
转载来源:NGINX 开源社区
NGINX 唯一中文官方社区 ,尽在 nginx.org.cn
本文主要介绍了最近发现的一个与 HTTP/2 协议有关的漏洞——HTTP/2 快速重置(HTTP/2 Rapid Reset)攻击。在特定条件下,攻击者可利用此漏洞在 NGINX 开源版、NGINX Plus 以及在服务器端实施 HTTP/2 规范的相关产品上执行拒绝服务(DoS)攻击。为了保护您的系统免遭此类攻击,我们建议您立即更新 NGINX 配置。
HTTP/2 数据流重置问题
与服务器建立连接后,HTTP/2 协议允许客户端启动并发流进行数据交换。与之前的协议迭代不同,如果最终用户决定离开页面或因任何其他原因停止数据交换,HTTP/2 提供了取消数据流的方法——它会向服务器发送一个 RST_STREAM 帧,以避免服务器执行不必要的工作。
利用该漏洞进行攻击的方法是通过已建立的连接启动并快速取消大量 HTTP/2 数据流,从而绕过服务器对并发流的最大值限制。由于传入数据流的重置速度快于后续数据流的抵达速度,因此客户端能够绕过服务器的配置阈值,达到使服务器超载的目的。
对 NGINX 的影响
出于对性能和资源消耗的考虑,NGINX 将默认的并发流地数量限制为128。此外,为了兼顾网络和服务器性能,NGINX 允许客户端使用 HTTP keepalive,在默认情况下为最多 1,000 个请求保持 HTTP 连接。
通过默认的 keepalive 限制,NGINX 可以防止此类攻击。如果攻击者企图创建更多连接来绕过这一限制,标准四层监控和警报工具就会发出告警。
但如果 NGINX 配置的 keepalive 数量明显高于默认和推荐设置,攻击可能会耗尽系统资源。当发生数据流重置的情况时,HTTP/2 协议要求不向该数据流上的客户端返回任何后续数据。通常情况下,重置会以任务的形式优雅地处理取消操作,只产生可忽略不计的服务器开销。
然而,如果能绕过 NGINX 的数据流阈值,客户端就能在这种开销上做文章,通过快速启动数千个数据流放大这一开销。这会导致服务器 CPU 占用率激增,从而拒绝为合法客户提供服务。
在异常高的 keepalive 限值下通过建立并快速取消 HTTP/2 数据流发起拒绝服务攻击
针对该攻击的缓解措施
作为一款功能齐全的服务器和代理服务器,NGINX 为管理员提供了强大的工具来缓解拒绝服务攻击。要使用这些功能,必须对 NGINX 配置文件进行如下更新,以尽量缩小服务器的攻击面:
-
keepalive_requests 应保持 1,000 次请求的默认设置
-
http2_max_concurrent_streams 应保持 128 个数据流的默认设置
我们还建议添加这些安全措施作为最佳实践:
-
limit_conn 限制单个客户端的连接数添加该指令时,应合理设置在应用性能和安全性之间取得平衡
-
limit_req 限制在给定时间内处理的来自单个客户端的请求数。添加该指令时,应合理设置在应用性能和安全性之间取得平衡
我们对该攻击的响应
我们试验了多种缓解策略,以充分了解这种攻击对我们广大客户和用户的影响。虽然研究证实 NGINX 已经配备了规避此类攻击的所有必要工具,但我们仍希望更进一步,确保有需求的用户能够对 NGINX 进行超出推荐规格的配置。
通过研究,我们发现了一种方法,能够提高服务器在各种理论上可通过 HTTP/2 协议发起的洪水攻击下的弹性。针对这些情况,我们发布了一个补丁来提高系统稳定性。为了防范此类攻击,我们建议 NGINX 开源版用户基于最新的代码库重新构建二进制文件,而 NGINX Plus 客户请立即更新到最新的软件包(R29p1 或 R30p1)。
新增补丁的工作原理
为确保及早检测到 NGINX 上的洪水攻击,我们对同一个事件循环中可引入的新数据流的数量施加了限制。该限值被设置为 http2_max_concurrent_streams 指令所配置的值的两倍。即使从未达到最大阈值,例如在发送请求后立即重置数据流(如本攻击案例),该限值也会生效。
受影响的产品
该漏洞会影响 NGINX HTTP/2 模块 (ngx_http_v2_module)。
如欲进一步了解可能受影响的特定 NGINX 或 F5 产品,请访问:https://my.f5.com/manage/s/article/K000137106。
有关 CVE-2023-44487 – HTTP/2 快速重置攻击的更多信息,请参阅:https://www.cve.org/CVERecord?id=CVE-2023-44487
致谢
感谢 Cloudflare、亚马逊和 Google 在发现和协作确定及缓解这一漏洞方面所做的工作。
NGINX 唯一中文官方社区 ,尽在 nginx.org.cn
更多 NGINX 相关的技术干货、互动问答、系列课程、活动资源: 开源社区官网 | 微信公众号