QUIC 关闭:运行 SMB over QUIC 的 Windows Server 系统中的 DoS 漏洞
执行摘要
Akamai 研究人员 Ben Barnea 在 Microsoft Windows Server 2022 中发现了一个重要漏洞,为该漏洞分配的 CVE 编号为 CVE-2023-24898 ,基本评分为 7.5。
该漏洞源于 srvnet.sys 驱动程序的缓冲区分配中缺少一项检查。
该漏洞可能导致 Windows Server 2022 设备遭遇远程服务拒绝 (DoS) 攻击。未经过身份验证的攻击者可通过互联网触发此漏洞。
仅有使用 SMB over QUIC(一项相对较新的功能)的服务器存在此漏洞。启动此功能的必要前提是服务器使用 Windows Server 2022 Azure Edition 系统。
这些漏洞已披露给 Microsoft,并在 2023 年 5 月的 Patch Tuesday中得到解决。
我们为 Akamai Guardicore Segmentation 提供了 Insight 查询,可用于检测其网络中可能有此漏洞的服务器。
简介
QUIC 是一种相对较新的传输层协议,最初由 Google 设计,但有数种不同的实现方式。QUIC 的目的是提供更可靠、更安全的连接,同时解决一些常见互联网问题,例如延迟和数据包丢失。它通过 UDP 运行。
Microsoft 的 QUIC 实现称为 MsQuic。Windows 中也整合了 QUIC,将其用作 SMB 协议的传输层(相应功能称为 SMB over QUIC),并配合使用 IIS 中的 HTTP/3。SMB over QUIC 仅在 Windows Server 2022 Azure Edition中提供,而 HTTP/3 在所有基于 Windows Server 2022 的 IIS 部署中均可用。
本博文中讨论的漏洞位于实现 SMB 传输层的驱动程序中,其文件名为 srvnet.sys。
漏洞
为了保持连接状态,QUIC 会使用连接标识符,这个标识符用来唯一地标识客户端与服务器之间的连接。客户端可创建多条并发连接。一条 QUIC 连接也是多路传送的,也就是说,在一条连接上,一个客户端与一个服务器可以同时通过多个数据流交换数据。
SMB over QUIC 的代码在 srvnet.sys中实现。在服务器通过数据流接收到新数据时,会调用 SrvNetQuicServerReceiveEvent 函数。该函数的目的是读取客户端发送的完整 SMB 报文。在成功读取后,它会将报文传输到 SMB 报文列表,以便进一步处理。
为了读取 SMB 报文,代码首先会尝试读取 SMB 报文大小,此信息通过一个四字节的整数表示。如果此操作成功,它会检查大小,确保其不超过一次分配的 最大允许大小 。如果检查通过,代码会分配此大小的缓冲区,并尝试将数据包中的其余字节读取到新分配的缓冲区内。如果完成了读取整个 SMB 报文的任务,它会向 SMB 层表明,已经接收到新的 SMB 报文。
SMB 报文的结构如图 1 所示。
如果接收到的 SMB 报文大小不足四个字节,就会发生漏洞 (图 2)。在这种情况下,代码会保存所接收到的 X 个字节,还会将 PendingMessageSize 设置为“4-X”,其中的 X 是接收到的报文大小字节数。下一次再接收到数据包时,代码会读取 SMB 报文大小所需的其余的“4-X”字节。
在代码读取报文大小后,它会 立即分配 SMB 报文,而不会再将此大小 与最大允许大小进行比较。因此,通过在两个数据包(而非一个数据包)中发送 SMB 报文大小,攻击者就能绕过最大允许大小验证,并请求异常大的分配大小。
漏洞利用
为将此错误转为 DoS 漏洞,我们需要连续发送数据包来触发所述问题。
但尽管能够绕过最大允许大小,仍然存在两项限制条件:
1. SrvNetAllocateBuffer 有 16 MB 的硬性分配上限。
2.允许的未经身份验证的并发连接数受限,具体取决于服务器的可用内存量。由于存在此限制条件,仅在内存量不超过 32 GB 的服务器上才能实现这种漏洞利用。(在下一部分中,我们将从理论角度分析如何绕过此限制。)
为了利用此漏洞,我们首先尝试创建多条连接,每次发送两个数据包,促使服务器分配 16 MB。重复执行此操作确实造成了内存耗尽。由于此漏洞处于驱动程序内,并且在内核模式下运行, 整个系统都变得不稳定并停止响应。
有没有优化的漏洞利用方法?
这种漏洞利用方法要求发送许多数据包。我们相信,通过滥用 QUIC 的功能,完全有可能减少需要发送的数据包数量。
QUIC 允许在一条连接上建立多个数据流,但也支持通过 initial_max_streams_bidi 属性对此数量加以限制。SMB over QUIC 将一条连接上的并发数据流数量限制为一个。
我们无法通过利用多个 并发 数据流改进漏洞利用方法,但我们可以试着通过不同的方法利用漏洞。我们没有创建多个并发数据流,而是创建一个包含多帧的 QUIC 数据包,达到 连续 、重复地执行以下序列的效果:
1.创建数据流
2. 发送两个 DATA 帧,触发 16 MB 分配
3.关闭数据流
这样就能绕过未经身份验证的连接限制。我们把这项操作作为挑战,留给读者自行尝试。
检测和抵御
若要查找正在运行的 SMB over QUIC 服务器,Akamai Guardicore Segmentation 用户可以运行下面这个简单的 Insight 查询:
select * from registry where
path="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\EnableSMBQUIC" and data=1
我们建议您为 Windows Server 设备安装补丁程序,因为对于这个漏洞,除非关闭 SMB over QUIC 功能,别无其他缓解措施或变通方案。
总结
QUIC 是一种相对较新的网络协议,可保证实现更好的性能和更低的延迟。显然,已经有两种非常重要的协议采用并整合了 QUIC:IIS(用于 HTTP/3)和 SMB。
我们相信,QUIC 将成为 Windows 及整体环境中备受关注的一个新攻击面。除了本文所述问题之外,HTTP/3 中还修复了另外一个漏洞: CVE-2023-23392。
我们鼓励其他研究人员研究使用 MsQuic 的不同组件及 MsQuic 本身。