MS13-105: Zraniteľnosť v parsovaní MDB súboru s Oracle Outside In – CVE-2013-5791

MS13-105: Zraniteľnosť v parsovaní MDB súboru s Oracle Outside In – CVE-2013-5791

Ľudia sa niekedy zamýšlajú, ako je možné vedieť presnú zraniteľnosť opravenú v uzavretom kóde. V tomto blogu by sme vám to radi ukázali na príklade z Microsoft security bulletinu. V decembri 2013 vydal Microsoft opravu MS13-105 [1] na Microsoft Exchange Server, ktorá používa knižnice Oracle Outside In. Samotný Oracle vydal záplatu v októbri 2013.[2]

Zraniteľnosť sa nachádza v knižnici vsacs.dll, ktorú používa viacero produktov (Microsoft Exchange, Novell Groupwise, Oracle Fusion Middleware, IBM WebSphere Portal, atď..) a nastáva pri čítaní mena stĺpca v súbore Microsoft Access 1.x. String z haldy sa kopíruje do zásobníku vyrovnávacej pamäti s fixnou veľkosťou bez kontroly toho, že cieľový buffer je dosť veľký na uloženie stringu. Výsledkom je pretečenie zásobníku.

Analýza záplaty

CVE: CVE-2013-5791 [3]

Pred záplatou : vsacs.dll 8.3.7.0.1106281647 Po záplate : vsacs.dll 8.4.1.52.1309170927

Zaujímavá (zraniteľná) časť kódu (Imagebase: 10000000):

10002A4B                 movzx   cx, byte ptr [eax+3875h]
10002A53                 movzx   dx, byte ptr [eax+3874h]
10002A5B                 shl     cx, 8
10002A5F                 add     cx, dx          ; veľkosť (kontrolované užívateľom)
10002A62                 sub     cx, 1Ah         ; veľkosť = veľkosť - 0x1A (26)
10002A66                 movzx   edx, cx
10002A69                 xor     ebx, ebx
10002A6B                 cmp     dx, bp          ; veľkosť musí byť väčšia ako 0
10002A6E                 jle     short loc_10002A94
10002A70                 movzx   ebp, dx
10002A73                 lea     edi, [esp+78h+var_40] ; cieľ (zásobník)
10002A77                 lea     ecx, [eax+3889h] ; zdroj (meno stĺpca)
10002A7D                 movzx   ebx, bp
10002A80
10002A80 loc_10002A80:                           ; CODE XREF: sub_100028C0+1D2
10002A80                 mov     dl, [ecx]
10002A82                 add     word ptr [esi+24h], 1
10002A87                 mov     [edi], dl       ; <-- Výnimka, pretečenie zásobníku
10002A89                 add     ecx, 1
10002A8C                 add     edi, 1
10002A8F                 sub     ebp, 1
10002A92                 jnz     short loc_10002A80

Po záplate (Imagebase: 10000000):

10002E82                 movzx   ax, byte ptr [edx+esi+3875h]
10002E8B                 movzx   cx, byte ptr [edx+esi+3874h]
10002E94                 lea     edi, [edx+esi]
10002E97                 shl     ax, 8
10002E9B                 add     ax, cx          ; veľkosť (kontrolované užívateľom)
10002E9E                 sub     ax, 1Ah         ; veľkosť = veľkosť - 0x1A (26)
10002EA2                 movzx   ebp, ax
10002EA5                 cmp     bp, 28h         ; <-- pridaná kontrola (najväčšia veľkosť je 0x28 (40))
10002EA9                 jle     short loc_10002EC6
10002EAB                 mov     edx, [esi+4450h]
10002EB1                 mov     eax, [esi+444Ch]
10002EB7                 mov     ecx, [esi+4278h]
10002EBD                 push    edx
10002EBE                 push    eax
10002EBF                 push    9
10002EC1                 call    ecx             ; sccut.UTBailOutEx
10002EC3                 add     esp, 0Ch
10002EC6
10002EC6 loc_10002EC6:                           ; CODE XREF: sub_10002C90+219
10002EC6                 xor     edx, edx
10002EC8                 test    bp, bp          ; veľkosť musí byť väčšia ako 0
10002ECB                 jle     short loc_10002EF4
10002ECD                 movzx   ebp, bp
10002ED0                 lea     ecx, [esp+80h+var_40] ; cieľ (zásobník)
10002ED4                 lea     eax, [edi+3889h] ; zdroj (meno stĺpca)
10002EDA                 movzx   edx, bp
10002EDD                 lea     ecx, [ecx+0]
10002EE0
10002EE0 loc_10002EE0:                           ; CODE XREF: sub_10002C90+262
10002EE0                 mov     bl, [eax]
10002EE2                 add     word ptr [esi+24h], 1
10002EE7                 mov     [ecx], bl
10002EE9                 add     eax, 1
10002EEC                 add     ecx, 1
10002EEF                 sub     ebp, 1
10002EF2                 jnz     short loc_10002EE0

Ako môžete vidieť, záplata pridala kontrolu veľkosťi, aby predišla pretečeniu zásobníku.

Windbg Crash Log

(9d8.f58): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=0408b8ce ebx=00004127 ecx=040901f3 edx=00004104 esi=0408b580 edi=00290000
eip=62502a87 esp=0028ef2c ebp=0000308b iopl=0         nv up ei pl nz na po nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00210202
vsacs!VwStreamTell+0xd57:
62502a87 8817            mov     byte ptr [edi],dl          ds:002b:00290000=41

Výnimka nastala počas spracovania PoC súboru [4] s nezaplátanou verziou knižnice Oracle Outside In.

Veselé exploitovanie v roku 2014!

Zdroje:

  1. https://technet.microsoft.com/en-us/security/bulletin/ms13-105
  2. http://www.oracle.com/technetwork/topics/security/cpuoct2013-1899837.html
  3. http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-5791
  4. http://cms.int.citadelo.com/download/CVE-2013-5791.MDB

O autorovi

Citadelo
Citadelo
Citadelo je dom plný etických hackerov na vašej strane. Pomáhame otestovať ich informačnú bezpečnosť. Podrobte svoje IT prostredie výzve a odhaľte, do akej miery sú vaše citlivé dáta chránené.
Zobraziť viac od autora

Podobné blogy