高级安全专家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