1. 极安网首页
  2. 网络安全技术

金山WPSOffice远程堆溢出漏洞分析(CVE-2020-25291)

WPS Office软件中存在一个远程执行代码漏洞,是当Office软件在分析特制Office文件时不正确地处理内存中的对象时引起的。成功利用此漏洞的攻击者可以在当前用户的上下文中运行任意代码。

金山WPSOffice远程堆溢出漏洞分析(CVE-2020-25291)-极安网

0x01 漏洞描述

WPS Office是适用于Microsoft Windows,macOS,Linux,iOS和Android的办公软件,由总部位于珠海的中国软件开发商金山软件公司开发。WPS Office由三个主要组件组成:WPS Writer,WPS Presentation和WPS Spreadsheet。个人基本版本可以免费使用,WPS Office软件中存在一个远程执行代码漏洞,是当Office软件在分析特制Office文件时不正确地处理内存中的对象时引起的。成功利用此漏洞的攻击者可以在当前用户的上下文中运行任意代码。漏洞可能会导致拒绝服务,易受攻击的产品WPS Office,影响版本11.2.0.9453。

0x02 漏洞分析

在WPS Office中用于图像格式解析的Qt模块中发现存在堆溢出。嵌入WPS office的特制图像文件可能会触发此漏洞。打开特制的文档文件时,触发访问冲突。EDX指向数组的指针,而EAX是指向数组的索引。

  1. 0:000> g
  2. (c50.b4): Access violation - code c0000005 (first chance)
  3. First chance exceptions are reported before any exception handling.
  4. This exception may be expected and handled.
  5. eax=000000c0 ebx=006f1c48 ecx=cd2aefbc edx=cd2c6f80 esi=2ed7ae18 edi=0000001c
  6. eip=6ba13321 esp=006f1b44 ebp=006f1b44 iopl=0         nv up ei pl nz na po nc
  7. cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00210202
  8. QtCore4!QMatrix::dy+0x48a8:
  9. 6ba13321 8b448210        mov     eax,dword ptr [edx+eax*4+10h] ds:002b:cd2c7290=????????

崩溃是如何触发的?让我们看一下PNG标头格式。

  1. 00029E30  FF 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44  ÿ‰PNG........IHD
  2. 00029E40  52 00 00 02 80 00 00 01 C6 04 03 00 00 00 16 0A  R...€...Æ.......
  3. 00029E50  27 FC 00 00 00 04 67 41 4D 41 00 00 B1 88 95 98  'ü....gAMA..±ˆ•˜
  4. 00029E60  F4 A6 00 00 00 30 50 4C 54 45 00 00 00 80 00 00  ô¦...0PLTE...€..
  5. 00029E70  00 80 00 80 80 00 00 00 80 80 00 80 00 80 80 80  .€.€€...€€.€.€€€
  6. 00029E80  80 80 C0 C0 C0 FF 00 00 00 FF 00 FF FF 00 00 00  €€ÀÀÀÿ...ÿ.ÿÿ...
  7. 00029E90  FF FF 00 FF 00 FF FF FF FF FF 7B 1F B1 C4 00 00  ÿÿ.ÿ.ÿÿÿÿÿ{.±Ä..

从偏移量0x29E31开始-0x29E34是PNG文件格式的签名标头。PNG头文件的结构:

  1. PNG signature --> IHDR --> gAMA --> PLTE --> pHYs --> IDAT --> IEND

在这种情况下,当WPS Office Suite中使用的QtCore库解析PLTE结构并触发堆溢出时,该漏洞位于Word文档中的嵌入式PNG文件中。在偏移量0x29E82到0x29E85处,调色板的解析失败,从而触发了堆中的内存损坏。崩溃触发之前的堆栈跟踪:

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

在QtCore4解析嵌入式图像之前,我们可以看到来自KSO模块的最后一次调用,试图处理图像kso!GdiDrawHoriLineIAlt。使用IDA Pro分解应用程序来分析发生异常的函数。最后的崩溃路径如下(WinDBG结果):

  1. QtCore4!QMatrix::dy+0x48a8:
  2. 6ba13321 8b448210        mov     eax,dword ptr [edx+eax*4+10h] ds:002b:cd2c7290=????????

原创文章,作者: Admin ,转载请注明出处:https://secvery.com/3192.html