引言
2025年5月,Zscaler ThreatLabz发现了 CVE-2025-50165,这是一个严重程度为“高危”的远程代码执行漏洞,CVSS评分为9.8,影响Windows图形组件。该漏洞存在于 windowscodecs.dll 中,任何使用此库作为依赖项的应用程序(例如Microsoft Office文档)都可能受到攻击。例如,攻击者可以通过创建恶意JPEG图像并将其插入任何利用 windowscodecs.dll 的文件中来利用该漏洞。如果用户打开该文件,其系统可能会被攻击者入侵,进而执行RCE并接管受害者的系统。
微软已于2025年8月12日发布了修复该漏洞的补丁。由于Windows图形组件是所有Windows系统的关键部分,此漏洞对每个受影响的Windows系统都构成了重大的安全威胁。
受影响版本
下表概述了受CVE-2025-50165影响的特定Microsoft Windows产品和版本,以及解决该漏洞的相应修补版本:
| 产品 | 受影响版本 | 已修补版本 |
|---|---|---|
| Windows Server 2025 | 10.0.26100.4851 | 10.0.26100.4946 |
| 适用于基于x64系统的Windows 11 24H2版本 | 10.0.26100.4851 | 10.0.26100.4946 |
| 适用于基于ARM64系统的Windows 11 24H2版本 | 10.0.26100.4851 | 10.0.26100.4946 |
| Windows Server 2025(服务器核心安装) | 10.0.26100.4851 | 10.0.26100.4946 |
表1:包含易受攻击的 windowscodecs.dll 的受影响Windows版本及其修补版本。 |
建议
ThreatLabz建议Windows用户根据上表更新应用程序并安装指定的修补版本。
攻击链
攻击链始于一个专门设计用于利用该漏洞的恶意JPEG图像。当通过 windowscodecs.dll 渲染此恶意图像时,将触发该漏洞。通过将图像嵌入到另一个文件(如Microsoft Office文档)中,也可以间接触发该漏洞。当漏洞被触发时,攻击者可以执行任意代码。
工作原理
本节参考ThreatLabz发现和分析CVE-2025-50165所使用的方法论。我们将介绍ThreatLabz如何识别易受攻击的代码路径、分析崩溃过程以及开发概念验证漏洞利用程序。
识别用于模糊测试的脆弱路径
在下图中,第51行作为模糊测试的入口点。在这一行,原始的 FileSize 值可以被 MutatedBufferSize 替换。此修改控制了 MapViewOfFile 返回的缓冲区内容,并为后续的模糊测试操作定义了快照的入口点。
图1:函数 GpReadOnlyMemoryStream::InitFile 的IDA反编译结果。
崩溃分析 模糊测试过程成功识别了一次崩溃,如下图所示。 图2:在WinDbg中捕获的Microsoft Visio崩溃分析。
WinDbg输出指出崩溃指令为 call qword ptr [r8+10h] ds:0000080667c170=c0c0c0c0c0c0c0c0。这表明程序正在解引用 r8+10h,但它指向未初始化的内存,这种状态可以通过Gflags使用的 c0c0c0c0c0c0c0c0 模式识别。对 r8 寄存器内存转储的进一步检查(如下图所示)显示,这种未初始化的内存可以通过堆喷射技术由用户控制。
图3:WinDbg中 r8 寄存器的内存转储。
地址 0000015fc1cab170 包含不受信的函数指针。该指针在 windowscodecs!jpeg_finish_compress+0xcc 指令处被解引用,直接导致了崩溃。为了理解导致此点的执行流程,ThreatLabz进行了栈回溯分析,如下所示。
|
|
WinDbg栈回溯突出了 windowsCodecs.dll 中的三个重要函数:
jpeg_finish_compressCJpegTurboFrameEncode::HrWriteSourceCFrameEncodeBase::WriteSource
对栈回溯的进一步调查和额外研究揭示了漏洞的确切起源和对应的代码片段。通过修改指向精心构造的JPEG文件的路径,漏洞触发器的确切位置被定位到执行 piFrameEncode->WriteSource,如下例所示。
|
|
漏洞利用
分析员说明:对于32位版本的 windowscodecs.dll,控制流防护默认是禁用的。然而,64位版本需要绕过CFG才能成功利用该漏洞。
通过利用堆喷射和不受信的指针解引用漏洞,可以获得指令指针的控制权,从而通过面向返回的编程实现进一步的利用。这是通过以下步骤实现的:
- 分配一系列大小为
0x3ef7的堆块,其中存储ROP链数据。 - 释放其中一些堆块,将它们返回到空闲列表,以便其中一个被重新分配为受害者块。
- 触发不受信的指针解引用漏洞。
- 利用RIP控制,使用栈旋转小工具并将执行重定向到堆中存储的ROP链。
下图展示了利用过程以及由此产生的崩溃输出。 图4:利用步骤的图示以及WinDbg中捕获的崩溃输出。
通过利用过程建立了对IP的控制后,下一阶段涉及利用ROP小工具来实现任意代码执行。这些小工具用于使用 VirtualAlloc 之类的函数创建可读-可写-可执行内存区域。一旦RWX内存设置完成,就会使用额外的ROP小工具(如 mov dword [rax], rcx,其中 RAX 指向shellcode地址,RCX 包含shellcode数据)将恶意shellcode写入这个新创建的内存区域。最后,通过跳转到RWX内存的地址,将执行重定向到shellcode。
概念验证 为了演示该漏洞的利用,ThreatLabz创建了一个示例应用程序,允许用户控制堆并使用三个函数处理JPEG图像。
- 启用分配堆内存:根据用户指定的输入创建堆分配。
索引:指定全局数组中的位置,用于存储分配的堆地址(例如索引0,1,…)。大小:确定要分配的堆内存块的大小。数据:表示要存储在分配的堆内存块中的值。
- 释放堆分配:根据提供的索引值释放堆分配。
- 处理JPEG图像:接受Base64编码的JPEG图像数据,并使用JPEG重新编码示例代码处理图像。
- 终止应用程序。
在下图中,内存地址 0X00007FF7F0BB448(显示为Reward)代表应用程序主函数的虚拟内存地址。此地址允许用户计算应用程序进程映射到内存中的基址,为利用提供了关键信息。使用选项1和2,用户可以通过密集分配和释放堆内存块来执行堆喷射攻击,以控制内存中的数据布局。然后,选项3通过处理一个精心构造的JPEG图像来触发漏洞,利用堆喷射设置来操纵应用程序的控制流,并获取利用所需的内存访问权限。
图5:用于演示PoC的可执行文件的核心功能。
查看此视频以获取示例应用程序中RIP控制的详细演示,展示在利用过程中如何实现RCE。
结论
凭借9.8的CVSS评分,CVE-2025-50165对所有Windows环境构成了重大风险,因为微软图形组件是所有Windows环境不可或缺的一部分。Windows用户及时更新应用程序并安装修补版本至关重要。
Zscaler防护覆盖
Zscaler ThreatLabz团队已为CVE-2025-50165部署了防护措施。