CVE-2023-21537 是一个 Windows 消息队列(MSMQ)驱动程序mqac.sys中的漏洞。该漏洞于 2023 年 1 月披露,并已被微软修复。漏洞并没有公开的 PoC 程序,漏洞发现者只通过文章Racing bugs in Windows kernel 透露了部分信息。笔者在其基础上深入分析了相关代码,成功地复现了此漏洞。本文就是对漏洞研究的总结。
漏洞复现环境搭建
由于此漏洞已经在较新的系统中被修复,复现漏洞需要在旧版本的系统中进行。笔者在 Hyper-V 虚拟机中安装了 Windows 10 21H1 版本,内部版本号为 19043.928。此外,由于消息队列是 Windows 的可选功能,需要在控制面板中手动启用。方法是:打开控制面板,选择「程序」,点击「启用或关闭 Windows 功能」,并开启「Microsoft 消息队列(MSMQ)服务器」。如下图所示。
ACSendMessage函数首先将用户态缓冲区复制到内核态栈上的缓冲区,之后,将执行核心的业务逻辑,调用CQueue::PutNewPacket来发送用户请求的数据,完成后再调用ACFreeDeepCopyQueueFormat进行堆内存的释放。ACFreeDeepCopyQueueFormat的第一个参数是数组的头指针,第二个参数是元素数量。该函数会根据元素数量循环释放数组中的资源。此处便存在漏洞:调用ACFreeDeepCopyQueueFormat时传入的第二个参数直接读取自用户态缓冲区中,它可能已经被篡改,使得驱动错误地判断元素个数。下面是 IDA 反编译得到的关键结果,参数UserBuffer就是指向用户缓冲区的指针。
内网穿透是一种反向代理技术,允许你从任何位置访问一台处于复杂网络环境中的机器。它的应用场景有很多,例如,你在家中使用树莓派作为 Home Assistant 家庭中枢,但家庭网络的网关没有公网 IP,那么在离开家时就无法控制家中的智能设备。而在配置内网穿透后,就可以随时随地通过代理服务器的公网 IP 连接到树莓派,从而访问 Home Assistant 的服务。