针对 Microsoft Message Queuing 远程读取整数溢出(追踪编号为 CVE-2026-54992)的概念验证代码。
该 PoC 使用两台 Windows 虚拟机。易受攻击的目标上的普通用户请求本地 MSMQ 服务从协助方托管的队列中读取数据。协助方返回格式错误的 MS-MQRR 响应,导致目标上的 mqsvc.exe 崩溃。该 PoC 演示了拒绝服务攻击,未演示代码执行。
mqqm.dll 对每个返回的数据包段分别进行验证,但在受影响版本中,它使用 32 位值对各段的分配长度求和,而没有检查总体溢出。此 PoC 提供的段长度为 0x2000 和 0xffffe010。它们的数学和是 0x100000010,绕回至 0x10。MSMQ 使用绕回后的大小分配数据包存储,然后处理原始段长度,导致越界写入。
使用 MinGW-w64 构建两个 x64 二进制文件,然后将文件夹复制到两台 Windows 虚拟机:
make clean all
在隔离网络上使用两台一次性 Windows 虚拟机。协助方和真正的 MSMQ 服务均使用 TCP 端口 2105,因此它们必须运行在不同的机器上。
在易受攻击的目标上,从提权的 PowerShell 窗口运行:
Set-ExecutionPolicy -Scope Process Bypass
.\setup-target.ps1
在协助方虚拟机上,从提权的 PowerShell 窗口运行:
Set-ExecutionPolicy -Scope Process Bypass
.\start-emulator.ps1
然后,在目标上,从普通非提权的 PowerShell 窗口运行,将地址替换为协助方虚拟机的 IPv4 地址:
.\invoke-crash.ps1 -Server 192.168.122.53 -IUnderstandThisWillCrashMSMQ
在受影响的版本上,mqsvc.exe 终止,MSMQ 停止,服务退出代码为 1067。要重置实验环境,请在协助方上运行 restore-helper.ps1,并在目标上重启 MSMQ。