HTTP/2 Rapid Reset攻击对F5 NGINX产品的影响

NGINX | 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将HTTP连接保持最多1,000个请求(请参阅keepalive_requests)。

NGINX利用默认的keepalive限制来防止此类攻击。恶意行为者若创建更多连接以绕过此限制,便会被标准的第4层监控和告警工具发现。

但是,如果为NGINX配置的keepalive值远高于默认值和建议设置,此类攻击可能会耗尽系统资源。当流重置时,HTTP/2协议要求不得再通过该流向客户端返回任何后续数据。通常,重置仅会产生可忽略不计的服务器开销,主要来自妥善处理取消操作的任务。但是,客户端可以绕过NGINX的流阈值,利用这部分开销,并通过快速发起数千个流将其放大。这会导致服务器CPU使用率骤升,使合法客户端无法获得服务。

通过HTTP2流发起的DoS攻击

在异常高的keepalive限制下建立HTTP/2流,随后取消流,从而造成拒绝服务。

降低攻击暴露风险的步骤

作为功能完备的服务器和代理,NGINX为管理员提供了强大的工具,可用于缓解拒绝服务攻击。要充分利用这些功能,必须对NGINX配置文件进行以下更新,以尽可能缩小服务器的攻击面:

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

  • limit_conn 可限制单个客户端允许建立的连接数。应添加此指令并进行合理配置,以兼顾应用性能和安全性。
  • limit_req 可限制在给定时间内处理的单个客户端请求数量。应添加此指令并进行合理设置,以平衡应用性能与安全性。

我们的应对措施

我们试验了多种缓解策略,从而了解这种攻击可能会对不同类型的客户和用户造成怎样的影响。虽然这项研究证实,NGINX已具备避免此类攻击所需的全部工具,但我们仍希望采取进一步措施,确保确实需要超出建议规范配置NGINX的用户能够这样做。

我们的调查找到了一种方法,可在HTTP/2协议理论上可能遭受的各种洪泛攻击下提高服务器韧性。因此,我们发布了一个补丁,以增强系统在这些情况下的稳定性。为防范此类威胁,建议NGINX Open Source用户使用最新代码库重新构建二进制文件,并建议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、Amazon和Google在发现此漏洞以及协作识别和缓解此漏洞方面所做的贡献。


分享
标签: F5 NGINX, 2023, News

相关博客文章

NGINX Plus R26 正式发布
NGINX | 2022/02/15

NGINX Plus R26 正式发布

NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
NGINX | 2022/02/10

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击

gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
NGINX | 2021/09/13

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划

了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。

NGINX Plus R19 正式发布
NGINX | 2019/09/03

NGINX Plus R19 正式发布

NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。

NGINX现已正式加入F5
NGINX | 2019/05/09

NGINX现已正式加入F5

NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。

使用NGINX和NGINX Plus实现高性能缓存
NGINX | 2016/08/24

使用NGINX和NGINX Plus实现高性能缓存

我将介绍NGINX在内容缓存和性能方面的工作原理,并分享一些控制NGINX内容缓存方式的技巧。