CVE-2020-25291:金山WPS Office远程堆损坏漏洞分析
字数 1116 2025-08-19 12:41:14

WPS Office远程堆损坏漏洞(CVE-2020-25291)技术分析文档

漏洞概述

漏洞编号: CVE-2020-25291
影响产品: WPS Office
影响版本: 11.2.0.9453及之前版本
漏洞类型: 远程堆损坏漏洞
危害等级: 高危
漏洞状态: 已在11.2.0.9403版本中修复

该漏洞存在于WPS Office的Qt模块中,当解析特制的PNG图像文件时,由于对内存对象处理不当,可能导致堆损坏。攻击者可利用此漏洞在当前用户上下文中执行任意代码,或导致拒绝服务。

漏洞技术细节

漏洞触发机制

漏洞触发于WPS Office处理嵌入式PNG图像文件时,具体位于QtCore模块对PLTE(调色板)结构的解析过程中。

PNG文件结构分析

PNG文件的标准结构如下:

PNG签名 --> IHDR --> gAMA --> PLTE --> pHYs --> IDAT --> IEND

在漏洞样本中,关键部分位于偏移量0x29E82到0x29E85之间,涉及调色板(PLTE)的异常解析。

崩溃分析

崩溃发生时,处理器状态如下:

eax=000000c0 ebx=006f1c48 ecx=cd2aefbc edx=cd2c6f80 esi=2ed7ae18 edi=0000001c
eip=6ba13321 esp=006f1b44 ebp=006f1b44

崩溃指令:

QtCore4!QMatrix::dy+0x48a8:
6ba13321 8b448210        mov     eax,dword ptr [edx+eax*4+10h]

根本原因

  1. 指针管理错误:EDX寄存器指向数组,而EAX寄存器却错误地指向数组索引,导致非法内存访问。
  2. 边界检查缺失:代码未对数组索引进行有效性验证,当索引值过大时导致越界访问。
  3. 堆内存损坏:错误的指针操作导致堆内存结构被破坏。

调用栈分析

崩溃前的调用栈:

00 00ee1790 6b8143ef QtCore4!path_gradient_span_gen::path_gradient_span_gen+0x6a71
01 00ee17f0 6b814259 QtCore4!QBrush::setMatrix+0x234
02 00ee58d4 6b8249a4 QtCore4!QBrush::setMatrix+0x9e
03 00ee58ec 6b80cc84 QtCore4!QImage::rect+0x22b
04 00ee5908 6b857ccc QtCore4!QTransform::inverted+0xec8
05 00ee629c 6b81c55b QtCore4!QSvgFillStyle::setFillOpacity+0x1b59
06 00ee6480 6b896844 QtCore4!QPainter::drawPixmap+0x1c98
07 00ee6574 6d1e0fbd QtCore4!QPainter::drawImage+0x325
08 00ee6594 6d0dd155 kso!GdiDrawHoriLineIAlt+0x11a1a

关键代码分析

IDA Pro反汇编的关键函数:

.text:67353315                 push    ebp
.text:67353316                 mov     ebp, esp
.text:67353318                 movzx   eax, byte ptr [ecx+edx] ; **crash here**
.text:6735331C                 mov     ecx, [ebp+arg_0]
.text:6735331F                 mov     edx, [ecx]
.text:67353321                 mov     eax, [edx+eax*4+10h]
.text:67353325                 mov     ecx, eax

内存布局分析

崩溃时的内存状态:

0:000> dc c45adfbc
c45adfbc ab69cf80 d3544100 00000003 00000280
c45adfcc 0000055a 00000012 c0c0c0c0 1c3870e2
c45adfdc 40ad870e 1c3870e2 40ad870e 00000000

索引数组内容:

0:000> dc ab69cf80
ab69cf80 00000001 0000001c 00000010 00000001
ab69cf90 ff000000 ff800000 ff008000 ff808000
ab69cfa0 ff000080 ff800080 ff008080 ff808080
ab69cfb0 ffc0c0c0 ffff0000 ff00ff00 ffffff00

漏洞利用分析

利用条件

  1. 需要诱使用户打开特制的WPS文档文件
  2. 文档中嵌入精心构造的PNG图像
  3. 利用成功可在当前用户权限下执行任意代码

利用限制

  1. 利用不成功可能导致应用程序崩溃(拒绝服务)
  2. 需要精确控制内存布局
  3. 受ASLR等缓解措施影响

漏洞修复方案

官方修复

WPS Office在版本11.2.0.9403中修复了此漏洞,修复措施包括:

  1. 增加了对PNG文件PLTE块的完整性检查
  2. 完善了数组索引的边界检查
  3. 改进了内存管理机制

临时缓解措施

  1. 避免打开来源不明的WPS文档
  2. 禁用文档中的图像加载
  3. 使用最新版本的WPS Office

时间线

  • 2020-08-04: 漏洞发现并报告给WPS团队
  • 2020-08-10: WPS团队确认收到报告
  • 2020-08-18: 提供完整技术细节和PoC
  • 2020-08-28: WPS发布修复版本11.2.0.9403
  • 2020-09-03: 提交CVE申请
  • 2020-09-14: 分配CVE-2020-25291编号

参考链接

  1. WPS安全公告: https://security.wps.cn/notices/6
  2. 官方修复版本下载: https://www.wps.cn/
WPS Office远程堆损坏漏洞(CVE-2020-25291)技术分析文档 漏洞概述 漏洞编号 : CVE-2020-25291 影响产品 : WPS Office 影响版本 : 11.2.0.9453及之前版本 漏洞类型 : 远程堆损坏漏洞 危害等级 : 高危 漏洞状态 : 已在11.2.0.9403版本中修复 该漏洞存在于WPS Office的Qt模块中,当解析特制的PNG图像文件时,由于对内存对象处理不当,可能导致堆损坏。攻击者可利用此漏洞在当前用户上下文中执行任意代码,或导致拒绝服务。 漏洞技术细节 漏洞触发机制 漏洞触发于WPS Office处理嵌入式PNG图像文件时,具体位于QtCore模块对PLTE(调色板)结构的解析过程中。 PNG文件结构分析 PNG文件的标准结构如下: 在漏洞样本中,关键部分位于偏移量0x29E82到0x29E85之间,涉及调色板(PLTE)的异常解析。 崩溃分析 崩溃发生时,处理器状态如下: 崩溃指令: 根本原因 指针管理错误 :EDX寄存器指向数组,而EAX寄存器却错误地指向数组索引,导致非法内存访问。 边界检查缺失 :代码未对数组索引进行有效性验证,当索引值过大时导致越界访问。 堆内存损坏 :错误的指针操作导致堆内存结构被破坏。 调用栈分析 崩溃前的调用栈: 关键代码分析 IDA Pro反汇编的关键函数: 内存布局分析 崩溃时的内存状态: 索引数组内容: 漏洞利用分析 利用条件 需要诱使用户打开特制的WPS文档文件 文档中嵌入精心构造的PNG图像 利用成功可在当前用户权限下执行任意代码 利用限制 利用不成功可能导致应用程序崩溃(拒绝服务) 需要精确控制内存布局 受ASLR等缓解措施影响 漏洞修复方案 官方修复 WPS Office在版本11.2.0.9403中修复了此漏洞,修复措施包括: 增加了对PNG文件PLTE块的完整性检查 完善了数组索引的边界检查 改进了内存管理机制 临时缓解措施 避免打开来源不明的WPS文档 禁用文档中的图像加载 使用最新版本的WPS Office 时间线 2020-08-04: 漏洞发现并报告给WPS团队 2020-08-10: WPS团队确认收到报告 2020-08-18: 提供完整技术细节和PoC 2020-08-28: WPS发布修复版本11.2.0.9403 2020-09-03: 提交CVE申请 2020-09-14: 分配CVE-2020-25291编号 参考链接 WPS安全公告: https://security.wps.cn/notices/6 官方修复版本下载: https://www.wps.cn/