需要云计算吗? 即刻开始体验

QUIC 关闭:运行 SMB over QUIC 的 Windows Server 系统中的 DoS 漏洞

Akamai Wave Blue

寫於

Ben Barnea

September 28, 2023

Akamai Wave Blue

寫於

Ben Barnea

Ben Barnea 是 Akamai 的安全研究人员,他专注于 Windows、Linux、物联网及移动设备等各种架构方面的低级别安全研究和漏洞研究并拥有丰富的经验。他喜欢了解复杂机制的工作原理,尤其是它们是如何失效的。

该漏洞可能导致 Windows Server 2022 设备遭遇远程服务拒绝 (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 报文 图 1:srvnet.sys 中的一条 SMB 报文

如果接收到的 SMB 报文大小不足四个字节,就会发生漏洞 (图 2)。在这种情况下,代码会保存所接收到的 X 个字节,还会将 PendingMessageSize 设置为“4-X”,其中的 X 是接收到的报文大小字节数。下一次再接收到数据包时,代码会读取 SMB 报文大小所需的其余的“4-X”字节。

如果接收到的 SMB 报文大小不足四个字节,就会发生漏洞 图 2:报文大小可能不到四字节的一个恶意数据包

在代码读取报文大小后,它会 立即分配 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 本身。



Akamai Wave Blue

寫於

Ben Barnea

September 28, 2023

Akamai Wave Blue

寫於

Ben Barnea

Ben Barnea 是 Akamai 的安全研究人员,他专注于 Windows、Linux、物联网及移动设备等各种架构方面的低级别安全研究和漏洞研究并拥有丰富的经验。他喜欢了解复杂机制的工作原理,尤其是它们是如何失效的。