欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【漏洞分析】Foxit Reader BMP biWidth 堆溢出漏洞(CVE-2017-17557)

程序员文章站 2022-07-15 14:22:12
...

0x00 前言

总体来说,坑不多,走下来很平坦。毕竟只是简单的整数溢出漏洞,没有太多知识点。

0x01 简介

Foxit Reader 在2018年5月18日的安全公告中提及修复了因恶意调用特定函数,导致程序可能遭受堆缓冲区溢出远程代码执行漏洞攻击的问题(CVE-2017-17557/ZDI-CAN-5472/ZDI-CAN-5895/ZDI-CAN-5473。

受影响版本为Foxit Reader and PhantomPDF 8.3.5版本及更低版本

0x02 漏洞原理

Foxit Reader的 ConvertToPDF_x86.dll模块在转化一个恶意构造的biWidth 属性数值超长的bmp文件时,会导致堆溢出。

0x03 漏洞分析

运行环境:

  • windows 7 sp1 64bit
  • windbg 6.12 32 bit
  • FoxitReader_8.2.1
  • 010editor
  • IDA 7.0

poc 如下图所示,biWidth属性设置为超大值40 00 00 01h,途中的数值是小字节序。(poc传送门
【漏洞分析】Foxit Reader BMP biWidth 堆溢出漏洞(CVE-2017-17557)

使用windbg调试前需要通过windbg安装目录中自带的gflags.exe开启page heap,命令需要在windows命令行中执行。page heap是将进程中使用的堆空间独立开,一旦出现越界操作就会报错。开启page heap的同时,会消耗更多的运行时间。

gflags.exe /p /enable Foxit Reader.exe /full

注意:Foxit Reader.exe为应用程序的名字,不是绝对路径,否则不能开启该程序的page heap。

运行windbg,触发crash

(3250.3480): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\Program Files (x86)\Foxit Software\Foxit Reader\Plugins\Creator\x86\ConvertToPDF_x86.dll -
eax=00000004 ebx=00000000 ecx=00000008 edx=15db5ef8 esi=15db9f38 edi=15dc2000
eip=5f5f9d17 esp=1866f904 ebp=1866f920 iopl=0         nv up ei pl nz na po cy
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010203
ConvertToPDF_x86!CreateFXPDFConvertor+0x1f42e7:
5f5f9d17 8807            mov     byte ptr [edi],al          ds:002b:15dc2000=??

程序崩在了mov byte ptr [edi],al,一眼看上去感觉是buffer overflow,byte ptr [edi]这段内存被写越界了。为啥不是al呢?al是AX寄存器的低8位数值,寄存器怎么越界啊!只能是edi寄存器指向的内存地址空间。

check这段堆空间的函数调用栈:

0:012> !heap -p -a edi
    address 15dc2000 found in
    _DPH_HEAP_ROOT @ 157e1000
    in busy allocation ( DPH_HEAP_BLOCK:  UserAddr  UserSize -  VirtAddr  VirtSize)
                               15ce264c:  15dc1ff8         4 -  15dc1000      2000
    65688e89 verifier!AVrfDebugPageHeapAllocate+0x00000229
    7748103e ntdll!RtlDebugAllocateHeap+0x00000030
    7743abe2 ntdll!RtlpAllocateHeap+0x000000c4
    773e34a1 ntdll!RtlAllocateHeap+0x0000023a
    5f564b50 ConvertToPDF_x86!CreateFXPDFConvertor+0x0015f120
    5f6de073 ConvertToPDF_x86!CreateFXPDFConvertor+0x002d8643
    5f6ddead ConvertToPDF_x86!CreateFXPDFConvertor+0x002d847d
    5f6de124 ConvertToPDF_x86!CreateFXPDFConvertor+0x002d86f4
   *5f5f9975 ConvertToPDF_x86!CreateFXPDFConvertor+0x001f3f45
    5f5d8598 ConvertToPDF_x86!CreateFXPDFConvertor+0x001d2b68

最近一个堆操作是RtlAllocateHeap函数,没有free,说明不是UAF。
再一个一个排查CreateFXPDFConvertor的函数,找到BMP文件的转换函数,定位地址为5f5f9975,上面已经用*号标记出来了。

经过对bmp图形扫描算法的研究和IDA伪代码的对比,发现biwidth值为两个字节,poc在biwidth* biBitCount 后,乘积大于两个字节,强制转换后被截断,导致malloc出来的空间过小。后面在copy像素点数组时导致写越界,最后崩溃。

0x04漏洞解决方案

福昕阅读器最新版本已经关闭了bmp图片转换的功能,然而只是一种取巧的办法,经过对ConvertToPDF_x86.dll 的新旧对比,发现问题没有真正解决。。只是不会就到这条问题分支路径上了而已,Orz…

0x05 小结

  1. 之前不知道gflags,heap的调用堆栈怎么也打印不出来,状态一直是BUSY。
  2. 没有找到好用的补丁对比工具,自己反汇编之后,定位问题函数,再diff的,心累。
  3. 花了半天时间看bmp扫描行算法,其实没啥大用。

0x06 参考文献

https://blog.0patch.com/2018/05/0patching-foxit-reader-buffer-oops.html
https://srcincite.io/advisories/src-2018-0009/
BMP文件结构详解
【漏洞分析】Foxit Reader BMP biWidth 堆溢出漏洞(CVE-2017-17557)

相关标签: 福昕 windbg