解决 CVE-2023-44487:概述和 Quarkus 解决方案
您可能已经遇到了臭名昭著的 CVE-2023-44487,这是一个直接影响 HTTP/2 服务器的安全漏洞。该 CVE 利用了 HTTP/2 协议中的一个特定弱点,并对所有 HTTP/2 服务器产生了连锁反应。
然而,该 CVE 对所有服务器的影响并非均等;它取决于服务器的底层技术和执行模型。
后果可能从严重(例如潜在的分布式拒绝服务 (DDoS) 攻击甚至服务器崩溃)到相对较轻(仅表现为 CPU 使用率略有增加)不等。影响的这种差异是不同 CVE 分数的原因,前者场景的分数从7.3不等,后者则为 5.3。
Quarkus 属于5.3类别,实际影响不那么明显。
尽管如此,我们认真对待所有与安全相关的问题,并遵循我们的 安全政策,我们已经为 Quarkus 平台发布了以下版本更新:
-
最新 3.x:Quarkus 3.4.3(最新 3.x)
-
3.2 LTS:Quarkus 3.2.7(3.2 LTS)
-
最新 2.x:Quarkus 2.16.12.Final
同样,Red Hat Build of Quarkus 在其当前发布周期中也包含了 CVE 修复。
让我们深入了解这个问题,以便更好地理解其中的区别和我们的解决方案。
理解 HTTP/2 CVE
当您浏览支持 HTTP/2 的网站(例如 https://quarkus.net.cn)时,它允许使用单个连接获取多个资源,包括索引页、图像、JavaScript 脚本、字体、CSS 文件等。这样,浏览器就不需要为每个资源重复建立新连接,从而获得更高效、更快速的浏览体验。此外,HTTP/2 不需要浏览器在发送另一个请求之前等待响应。
HTTP/2 的这种流式处理能力增强了应用程序的并发性并降低了网络成本,因为它减少了对多个连接的需求。然而,此功能可能带来挑战,因为单个连接可以生成大量请求。为了解决这个问题,HTTP/2 提供了一种限制活动并发流数量的方法,以防止客户端使服务器不堪重负。此控制是服务器端设置。当客户端连接时,服务器会告知其允许的最大并发数。在 Quarkus 中,并发流的上限默认为 100。可以通过 quarkus.http.limits.max-concurrent-streams
属性自定义此限制。
当客户端超出允许的流限制时,服务器会响应一个 RST_STREAM
帧,关闭特定流而不切断连接,从而防止流泛滥。
但事情不止于此。在 HTTP/2 中,客户端和服务器都会维护流状态,最终进行同步。与 HTTP 1.1 不同,HTTP/2 允许客户端使用 RST_STREAM
帧优雅地取消正在进行的请求。在客户端,流在帧传输时关闭,而在服务器端,流在处理时关闭。这种取消不会影响同一连接中的其他流。
CVE-2023-44487 攻击利用了快速的流取消。虽然客户端关闭了流,但服务器端的关闭存在延迟,从而有效地绕过了客户端的流限制。这使得客户端能够打开过多的流,多达 1,073,741,824 个。在攻击期间,客户端通过新流中的 HEADERS
帧发起请求,并立即发送 RST_STREAM
帧。从客户端的角度来看,流已关闭。但是,服务器必须分配资源来处理 RST_STREAM
帧,最终关闭关联的流。
线程 vs 事件循环
随着客户端连续快速地打开和取消流,服务器需要处理 RST_STREAM
帧和相关的簿记工作。攻击的严重程度在不同的服务器技术之间有所不同。在每请求一线程模型中,这可能是灾难性的,因为它会耗尽所有可用的工作线程,导致 HEADERS
和 RST_STREAM
帧排队,并对并发的合法请求产生负面影响,从而严重影响服务可用性(CVE 分数:7.3/10)。
对于基于 Netty 的服务器(如 Quarkus)和其他基于事件循环的服务器,问题不那么严重。传入的帧被放入事件循环队列,导致 CPU 使用率更高,但不会出现线程饥饿。此外,Netty 会非常高效地处理 RST_STREAM
帧。这可能会导致响应时间更长,服务器看起来很忙,但仍能管理并发的合法请求。虽然这是一个问题,但它对可用性的影响相对较低(CVE 分数:5.3/10)。
Quarkus 解决方案
由于该 CVE 的高知名度,Quarkus 已采取措施解决此问题。我们已根据 Netty 的修复实施了一项解决方案。该系统会监控每个连接发送的 RST_STREAM
帧,并在 30 秒内设置 200 帧的限制。如果超过阈值,Quarkus 将采取措施关闭连接并发出 GOAWAY
帧。此过程将关闭连接及其关联的所有当前活动流。
虽然这些默认设置可以有效抵御攻击,但我们理解灵活性是必要的。在即将发布的 Quarkus 3 版本中,用户将可以选择微调这些阈值,从而允许您自定义配置以满足您的特定需求,包括减少最大并发流数(目前已可用)、调整 RST_STREAM
帧的数量以及修改攻击检测的时间窗口。
总结
HTTP/2 CVE 是一个严重问题,可能被用于分布式拒绝服务攻击,特别是如果实现是基于线程的。Quarkus 使用 Netty,Netty 基于事件循环模型,因此 Quarkus 受到的影响较小。
我们认真对待所有与安全相关的问题,并遵循我们的安全政策,我们已经为 Quarkus 平台发布了以下版本更新:
-
最新 3.x:Quarkus 3.4.3(最新 3.x)
-
3.2 LTS:Quarkus 3.2.7(3.2 LTS)
-
最新 2.x:Quarkus 2.16.12.Final
同样,Red Hat Build of Quarkus 在其当前发布周期中也包含了 CVE 修复。
所有这些版本都包含本文所述的修复。
我们强烈建议将您的应用程序更新到这些版本之一。