本篇博文重点介绍近期发现的一个与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使用率骤升,使合法客户端无法获得服务。
在异常高的keepalive限制下建立HTTP/2流,随后取消流,从而造成拒绝服务。
降低攻击暴露风险的步骤
作为功能完备的服务器和代理,NGINX为管理员提供了强大的工具,可用于缓解拒绝服务攻击。要充分利用这些功能,必须对NGINX配置文件进行以下更新,以尽可能缩小服务器的攻击面:
- keepalive_requests 应保留默认设置,即1,000个请求
- http2_max_concurrent_streams 应保留默认设置,即128个流
我们还建议将以下安全措施作为最佳实践:
- 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在发现此漏洞以及协作识别和缓解此漏洞方面所做的贡献。
相关博客文章
NGINX Plus R26 正式发布
NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。
使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。
Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。
NGINX Plus R19 正式发布
NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。
NGINX现已正式加入F5
NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。
