高级安全专家Behzad Najjarpour Jabbari

2016年10月18日,Oracle发布了针对Oracle Outside-In Technology的更新,作为2016年10月Oracle重要补丁更新的一部分[1],用于修复已发现的基于堆的缓冲区溢出和释放后使用漏洞。由Secunia研究[2]。两者最终都可能通过使用并公开Oracle Outside-In Technology受影响功能的应用程序导致系统受损,因此被Secunia Research评为``高度关键''。

此外,Oracle还解决了Secunia Research发现的另外三个漏洞,这些漏洞可能导致所谓的“Denial of Service”使用Oracle Outside-In Technology的应用程序的(DoS)条件。

这篇博客文章重点介绍基于堆的缓冲区溢出漏洞。

产品背景:

Oracle Outside-In Technology为软件开发人员提供了一种全面的解决方案,可以访问,转换和控制500多种非结构化文件格式的内容[3]。

该Oracle产品经常捆绑在一起,并用于许多流行的应用程序中,例如Microsoft Exchange,Novell GroupWise和IBM WebSphere Portal。

文件格式背景:

StarWriter文件(SDW)是StarSuite 5.x之前版本的StarWriter组件使用的默认文件格式。

漏洞摘要:

该漏洞是由于内部的边界错误引起的“VwStreamRead()”函数(vssdw.dll),可利用该函数通过特制的SDW文件导致越界写存储器访问,并随后导致使用该产品的应用程序崩溃或可能在该应用程序的上下文中执行任意代码Oracle由外而内。

该漏洞已在8.5.3版(vssdw.dll版本8.5.3.1604151004)中得到确认。

技术细节:

固定大小的堆内存块由“ VwAllocProc()”函数分配,该函数正在处理SDW文件时使用:

.text:67AA1400                 push    esi
.text:67AA1401                 push    8FCh            ; dwBytes
.text:67AA1406                 push    0               ; dwFlags
.text:67AA1408                 call    ds:GetProcessHeap
.text:67AA140E                 push    eax             ; hHeap
.text:67AA140F                 call    ds:HeapAlloc
.text:67AA1415                 mov     esi, eax
.text:67AA1417                 test    esi, esi
.text:67AA1419                 jnz     short loc_67AA141D
.text:67AA141B                 pop     esi
.text:67AA141C                 retn
.text:67AA141D ; ---------------------------------------------------------------------------
.text:67AA141D
.text:67AA141D loc_67AA141D:                           ; CODE XREF: VwAllocProc+19
.text:67AA141D                 push    8FCh            ; size_t
.text:67AA1422                 push    0               ; int
.text:67AA1424                 push    esi             ; void *
.text:67AA1425                 call    memset
.text:67AA142A                 add     esp, 0Ch
.text:67AA142D                 mov     [esi+8F8h], esi
.text:67AA1433                 mov     eax, esi
.text:67AA1435                 pop     esi
.text:67AA1436                 retn
.text:67AA1436 VwAllocProc     endp

函数“ VwStreamRead()”在处理SDW文件时使用并管理该内存块。进行一些初始化之后,该函数尝试读取嵌入在SDW文件中的位图流:

.text:67AA39F3 loc_67AA39F3:                           ; CODE XREF: VwStreamRead+13A4
.text:67AA39F3                 mov     eax, [esi+3Ch]
.text:67AA39F6                 dec     dword ptr [eax]
.text:67AA39F8                 js      short loc_67AA3A09
.text:67AA39FA                 mov     ecx, [esi+3Ch]
.text:67AA39FD                 mov     eax, [ecx+10h]
.text:67AA3A00                 movzx   edx, byte ptr [eax]
.text:67AA3A03                 inc     eax
.text:67AA3A04                 mov     [ecx+10h], eax
.text:67AA3A07                 jmp     short loc_67AA3A17
.text:67AA3A09 ; ---------------------------------------------------------------------------
.text:67AA3A09
.text:67AA3A09 loc_67AA3A09:                           ; CODE XREF: VwStreamRead+1378
.text:67AA3A09                 push    dword ptr [esi+3Ch]
.text:67AA3A0C                 call    sub_67AA3D90
.text:67AA3A11                 add     esp, 4
.text:67AA3A14                 movsx   edx, ax
.text:67AA3A17
.text:67AA3A17 loc_67AA3A17:                           ; CODE XREF: VwStreamRead+1387
.text:67AA3A17                 movzx   eax, di
.text:67AA3A1A                 inc     edi
.text:67AA3A1B                 mov     [eax+esi+470h], dl
.text:67AA3A22                 test    dl, dl
.text:67AA3A24                 jnz     short loc_67AA39F3

当循环到达流中的Null字节时,此循环结束。由于流是由用户控制的,并且没有边界检查,因此有可能触发越界写存储器访问。通过覆盖vftable指针,可以更改应用程序的流程:

.text:67AA3A59                 lea     ecx, [esi+470h]
.text:67AA3A5F                 lea     eax, [edi-2]
.text:67AA3A62                 mov     [ecx], ax
.text:67AA3A65                 push    dword ptr [esi+8F0h]
.text:67AA3A6B                 mov     eax, [esi+854h]
.text:67AA3A71                 push    dword ptr [esi+8ECh]
.text:67AA3A77                 push    ecx
.text:67AA3A78                 push    edi
.text:67AA3A79                 push    326h
.text:67AA3A7E                 call    eax
.text:67AA3A80                 push    dword ptr [esi+8F0h]
.text:67AA3A86                 mov     eax, [esi+854h]
.text:67AA3A8C                 push    dword ptr [esi+8ECh]
.text:67AA3A92                 push    0
.text:67AA3A94                 push    0
.text:67AA3A96                 push    327h
.text:67AA3A9B                 call    eax
.text:67AA3A9D                 push    dword ptr [esi+8F0h]
.text:67AA3AA3                 mov     eax, [esi+854h]
.text:67AA3AA9                 mov     ebx, 1
.text:67AA3AAE                 push    dword ptr [esi+8ECh]
.text:67AA3AB4                 push    0
.text:67AA3AB6                 push    0
.text:67AA3AB8                 push    325h
.text:67AA3ABD                 call    eax
.text:67AA3ABF                 mov     eax, 0E10h
.text:67AA3AC4                 add     esp, 3Ch
.text:67AA3AC7                 cmp     word ptr [esp+0D8h+var_C4], ax
0:000> g
ModLoad: 777d0000 77830000   C:\Windows\SysWOW64\IMM32.DLL
ModLoad: 75f40000 7600c000   C:\Windows\syswow64\MSCTF.dll
ModLoad: 709c0000 709ea000   C:\Users\behzad\Desktop\vw-8-5-3-win-x86-32\sdk\demo\scclo.dll
ModLoad: 709b0000 709bb000   C:\Users\behzad\Desktop\vw-8-5-3-win-x86-32\sdk\demo\SCCSD.DLL
ModLoad: 709a0000 709ad000   C:\Users\behzad\Desktop\vw-8-5-3-win-x86-32\sdk\demo\SCCXT.DLL
ModLoad: 70990000 70999000   C:\Users\behzad\Desktop\vw-8-5-3-win-x86-32\sdk\demo\vssdw.dll
(c04.f64): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=34333231 ebx=00000d0d ecx=070bdb70 edx=00000000 esi=070bd700 edi=0001041d
eip=34333231 esp=0044e6bc ebp=070bffd8 iopl=0         nv up ei ng nz ac pe cy
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010297
34333231 ??              ???

这种控制使攻击者最终可以利用Oracle Outside-In Technology潜在地破坏应用程序。

参考文献:

[1] http://www.oracle.com/technetwork/security-advisory/cpuoct2016-2881722.html#AppendixFMW
[2] http://secunia.com/advisories/65000/
[3] http://www.oracle.com/us/technologies/embedded/025613.htm