文章总结: ESETresearchersanalyzedCVE-2025-50165,acriticalvulnerabilityinWindowsImagingComponentaffectingJPGre-encoding.Rootcauseanalysisidentifieduninitializedfunctionpointersfor12-bitand16-bitdepthimagesinWindowsCodecs.dll,causingcrashesduringcompressionratherthandecoding.Theanalysisconfirmsexploitabilityislow,requiringspecificapplicationbehaviorslikesavingorthumbnailgenerationalongsideaddressleaks.Thishighlightstheimportanceoftimelyupdatesforthird-partylibrariesanddemonstratestheeffectivenessofcombiningrootcauseanalysiswithpatchdiffingtounderstandsecurityflaws. 综合评分: 86 文章分类: 漏洞分析,逆向分析,漏洞POC,二进制安全,漏洞预警

图 5. re-encoding 示例应用在处理 12-bit JPG 图像的压缩流程中发生崩溃
内存地址指向的重复十六进制值 0xBAADF00D,是 C runtime (CRT) heap 在程序调用 HeapAlloc分配内存时使用的魔数 (magic value),用于标记这段内存“尚未初始化” (参见 https://www.nobugs.org/developer/win32/debug_crt_heap.html)。
如前所述,我们分析的两个 WindowsCodecs.dll版本看起来都能够处理 16-bit 精度的 JPG 图像。但在测试此类图像时,re-encoding 应用在解引用 compress_data_16函数指针时发生崩溃,如图 6 所示。
图 6. re-encoding 示例应用在处理 16-bit JPG 图像的压缩流程中发生崩溃
在成功复现崩溃后,我们进一步思考:这一具体漏洞是否也存在于 libjpeg-turbo 的源代码中?
Exploring the source code
梳理 libjpeg-turbo 的提交记录后我们发现,类似问题已在 2024 年 12 月 18 日通过提交 e0e18de 被修复,并在版本 3.1.1 中引入。该提交的核心思路是:确保结构体被 zero-initialized,并在指针为 NULL 时抛出错误。值得注意的是:这次提交引入的初始化与检查,在存在漏洞的 WindowsCodecs.dll版本以及已修复的 WindowsCodecs.dll版本中都不具备。
该提交信息还暗示了其他潜在的易受攻击代码路径;更重要的是,它指出在处理 JPG 图像时,崩溃也可能发生在解压 (decompression) 流程中。这一点在文件 jdapistd.c的 diff 中尤为明显,如图 7 所示。
图 7. 在 jdapistd.c 中实现的解压 (decompression) 例程差分
正如该提交说明所明确指出的那样:调用方应用程序 仅会在一种情况下崩溃 (原因是解引用未初始化的函数指针),即它在调用 jpeg_start_compress或 jpeg_start_decompress例程之后错误地修改了 data_precision字段。这构成了一个非常特定、且很可能并不现实的场景:使用 WindowsCodecs.dll的应用去改变内部结构体状态。尽管此类应用可能存在,但从 Windows Imaging Component API 的设计来看,它似乎并不允许这种行为。
Exploitability
根因分析显示,CVE‑2025‑50165 的核心问题在于 WindowsCodecs.dll对非标准 8-bit 的“data precision”JPG 图像的处理。在压缩过程中,两条与精度相关的函数指针 (compress_data_12和 compress_data_16) 未被初始化,从而形成两条易受攻击的代码路径;它们似乎 仅在对 JPG 图像进行 (re-)encoding 时才可达。仅仅打开 (即解码并渲染) 一张特制图片,并不会触发漏洞;但如果图片被保存,或宿主应用 (例如 Microsoft Photos) 为图片生成缩略图时,就可能调用到存在问题的函数 jpeg_finish_compress,如图 8 所示。
图 8. 在为图片创建缩略图的过程中会调用到存在漏洞的 jpeg_finish_compress 函数
要将一个程序认定为“存在漏洞”,它需要满足以下特征:
- 使用了受影响版本的
WindowsCodecs.dll; - 在解码 12-bit 或 16-bit JPG 文件时不会崩溃或中止;
- 允许对图像进行重新编码 (re-encode)。
此外,正如 Zscaler 研究人员所提到的,要利用该漏洞还需要地址泄露 (address leak) 以及对堆 (heap) 的足够控制能力。
Conclusion
尽管 JPG 历史悠久、使用广泛,并且可能是 fuzz testing 中最常见的数字图像格式之一,某些编解码器 (codec) 中仍然可能出现漏洞。对 CVE‑2025‑50165 的研究也提醒我们:使用第三方库时,及时跟进安全更新至关重要。
根因分析结合补丁差分是一种非常有效的组合,使我们得以回答最初的问题。我们发现,当 WindowsCodecs.dll编码 12-bit 或 16-bit 精度的 JPG 数据流时,该缺陷可能被触发:两条与精度相关的函数指针在被解引用之前既没有初始化,也没有做检查。此外,我们还确认这一流程通常发生在保存图像,或从图像创建缩略图时。
本次调查在“可利用性”方面的结论与 Microsoft 类似。由于 WindowsCodecs.dll是一个库,只有当宿主应用允许对 JPG 图像进行 (re-)encode 时,它才可能被视为受影响;而要实现利用,攻击者还需要对应用具备足够控制 (例如 address leak、heap manipulation)。综合来看,现实中的利用确实不太可能。
最后值得一提的是:截至本文撰写时,根据我们的测试,更新版本的 WindowsCodecs.dll(例如 10.0.22621.6133,SHA-1: 3F3767D05E5A91184005D98427074711F68D9950) 已经实现了 libjpeg-turbo 该提交中提到的多项改动,从而有效修复了“缺少初始化”与“函数指针未验证”等问题。
Revisiting CVE-2025-50165: A critical flaw in Windows Imaging Component
免责声明:本博客文章仅用于教育和研究目的。提供的所有技术和代码示例旨在帮助防御者理解攻击手法并提高安全态势。请勿使用此信息访问或干扰您不拥有或没有明确测试权限的系统。未经授权的使用可能违反法律和道德准则。作者对因应用所讨论概念而导致的任何误用或损害不承担任何责任。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:securitainment Romain Dumont《重访 CVE-2025-50165:WIC 的 JPG 重新编码漏洞分析与可利用性评估》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论