1. 程式人生 > >【漏洞分析】Foxit Reader BMP biWidth 堆溢位漏洞(CVE-2017-17557)

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

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傳送門
這裡寫圖片描述

使用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檔案結構詳解
這裡寫圖片描述