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]
根本原因
- 指针管理错误:EDX寄存器指向数组,而EAX寄存器却错误地指向数组索引,导致非法内存访问。
- 边界检查缺失:代码未对数组索引进行有效性验证,当索引值过大时导致越界访问。
- 堆内存损坏:错误的指针操作导致堆内存结构被破坏。
调用栈分析
崩溃前的调用栈:
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
漏洞利用分析
利用条件
- 需要诱使用户打开特制的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/