博客 | NGINX

HTTP/2 快速重置攻击影响 F5 NGINX 产品

NGINX-F5-horiz-black-type-RGB 的一部分
Michael Vernik 缩略图
迈克尔·韦尔尼克
2023 年 10 月 10 日发布
妮娜·福赛斯缩略图
妮娜·福赛斯
2023 年 10 月 10 日发布

这篇博文主要讨论最近发现的与 HTTP/2 协议相关的漏洞。 在某些条件下,此漏洞可被利用对 NGINX Open Source、NGINX Plus 以及实现 HTTP/2 规范的服务器端部分的相关产品执行拒绝服务攻击。 为了保护您的系统免受此攻击,我们建议立即更新您的 NGINX 配置。

HTTP/2 流重置的问题

与服务器建立连接后,HTTP/2 协议允许客户端发起并发流进行数据交换。 与该协议的先前版本不同,如果最终用户决定离开页面或由于其他原因停止数据交换,HTTP/2 提供了一种取消流的方法。 它通过向服务器发出 RST_STREAM 帧来实现这一点,从而避免其执行不必要的工作。

该漏洞通过在已建立的连接上启动并快速取消大量 HTTP/2 流来利用,从而规避服务器的并发流最大值。 发生这种情况的原因是,传入流的重置速度比后续流到达的速度快,从而允许客户端使服务器过载,而不会达到其配置的阈值。

对 NGINX 的影响

出于性能和资源消耗的原因,NGINX 将并发流的数量限制为默认的 128(参见http2_max_concurrent_streams )。 此外,为了最佳地平衡网络和服务器性能,NGINX 允许客户端默认使用 HTTP keepalive 保持最多 1000 个请求的 HTTP 连接(请参阅keepalive_requests )。

通过依赖默认的保活限制,NGINX 可以防止此类攻击。 创建额外的连接来规避此限制会通过标准的第 4 层监控和警报工具揭露不良行为者。

但是,如果 NGINX 配置的 keepalive 明显高于默认和推荐设置,则攻击可能会耗尽系统资源。 当发生流重置时,HTTP/2 协议要求不要在该流上向客户端返回任何后续数据。 通常,重置会导致以正常处理取消的任务形式出现的服务器开销可以忽略不计。 然而,绕过 NGINX 的流阈值使得客户端能够利用这种开销,并通过快速启动数千个流来放大它。 这会导致服务器 CPU 峰值,从而拒绝向合法客户端提供服务。

通过 HTTP2 流进行 DoS 攻击
通过建立 HTTP/2 流,然后在异常高的保持活动限制下取消流,从而实现拒绝服务。

减轻攻击风险的步骤

作为功能齐全的服务器和代理,NGINX 为管理员提供了强大的工具来减轻拒绝服务攻击。 为了利用这些功能,必须对 NGINX 配置文件进行以下更新,以最大限度地减少服务器的攻击面:

我们还建议添加以下安全措施作为最佳实践:

  • 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 在发现和合作识别并缓解此漏洞方面所发挥的作用。


“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”