CVE-2022-24494
该漏洞是一个任意内存读取漏洞。根本原因在于:用于 memcpy 操作的内存地址缺乏验证,该地址由用户态提供,memcpy 操作将该内存地址中的数据复制到池内存中。 缺少检查的地址位于 Afd!AfdTliIoControl+0x40B

如上图截图所示,该用户态内存地址第一次从 InputBuffer+0x20 复制时,会使用 MmUserProbeAddress 正确检查该内存地址是否位于用户态内存地址空间内。然而,第二次将该内存地址从 InputBuffer+0x20 复制到 RAX 寄存器时,却没有使用 MmUSerProbeAddress 正确检查该内存地址。由于缺乏验证,攻击者可以提供任意内核地址。 该地址随后会通过 memcpy 操作被复制到一个池内存分配(标签:AfdL)中,如下方 AfdTliIoControl+0x5AB 处所示:

下面的 PoC 展示了从用户态提供的内核地址(0xffffffdeadbeef01)

驱动程序尝试从该无效内存地址读取数据,导致蓝屏死机(BSOD):

memcpy 操作中复制到 dst 指针的值随后被传递给 tcpip.sys 驱动程序。我尚未深入研究哪些内部对象会受到影响,以及是否有可能从用户态调用 API 来泄露内存,从而获取这些潜在内部对象中的数据。
几个月后,微软发布了一项研究,讨论了此类漏洞(任意内存读取)潜在的权限提升(EoP)影响:
https://msrc-blog.microsoft.com/2022/03/22/exploring-a-new-class-of-kernel-exploit-primitive/