Posted by Mateusz Jurczyk, Project Zero
In a blog post titled "The story of Adobe Reader symbols" published in October 2019, I presented an analysis of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 debug symbols shipped with some older versions of Adobe Reader for Unix-family systems released between 1997-2013. Such symbols can prove immensely useful for both understanding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 inner workings of various Reader components while reverse engineering, and for automated tasks such as crash classification and deduplication in fuzzing projects. In that blog post, I only briefly mentioned cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 macOS Reader packages as containing up-to-date symbols for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JP2K and 3D components, but missing any ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r interesting information beyond that. Upon a closer and more thorough inspection of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Mac releases, I have discovered that in fact more debug metadata made its way to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 publicly available installers, some of which is unique (i.e. not present in ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r symbol sources) and/or more recent than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latest Unix symbols. Considering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 added value of this new data, I wish to share it with you here in this follow-up post. As a reminder, legacy builds of Adobe Reader dating back to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 '90s can be downloaded from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 official ftp.adobe.com FTP server and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding paths on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ardownload.adobe.com HTTP server.
Review of core Acrobat Mach-O images
Below is a breakdown of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 six core components of Reader for macOS, and whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y included symbols in each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existing software releases. For brevity and readability, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 table starts with version 7.x from 2005, as this is where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 debug information started making first appearances:
¹ See detailed 8.x version breakdown
² See detailed 9.x version breakdown
³ Up to version 15.016.20045, stripped afterwards
As mentioned in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 annotations, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 presence of symbols for some modules varied greatly between minor versions of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 8.x and 9.x releases (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reason for which is unclear to me). Detailed tables for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se two major versions are shown below:
Clearly, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is a lot of useful information hidden in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Reader Mach-O executables, with versions 8.x and 9.x being cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most ripe with debug data. I find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following pieces of information to be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most useful and unique compared to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data previously extracted from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Unix files:
- Private symbols in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stabs format for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 3D module (version 7.x) and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CoolType font engine (most 9.x versions). This includes not only function and global variable names, but also source file paths, source line numbers corresponding to blocks of assembly code, local variable names, definitions of structures, enums etc. This kind of metadata provides us with some extremely detailed and accurate insight into how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code works. To my best knowledge, such private symbols for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se two libraries are not known to be available from any ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r public source and may cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore be a great assistance to anyone interested in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir inner workings.
- The symbols for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Acrobat, AGM, CoolType and BIB modules in versions 8.x and 9.x are generally more recent than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most recent symbols on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Unix side. Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore, for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 purpose of crash deduplication or root cause analysis, it is arguably easier to run Reader 9 on macOS than Reader 9 on SunOS/Solaris, or Reader 7 on AIX/HP-UX, simply because it is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 more common platform.
- Lastly, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 AGM component was not stripped in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DC versions between 15.006.30033 (March 2015) to 15.016.20045 (June 2016), which is also a much more recent source of information than what was previously accessible (AIX/HP-UX symbols for versions 7.x from 2007).
Out of all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, I believe that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 private CoolType symbols carry cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most interesting and practical information. What makes it especially attractive is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that it is not only applicable to Reader and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r Adobe products, but also to all ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r libraries and system components which share cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same font rasterization code – such as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows kernel drivers (win32k.sys, atmfd.dll), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows DirectWrite library (dwrite.dll), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 macOS font libraries (libTrueTypeScaler.dylib, libType1Scaler.dylib), and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JRE t2k font rasterizer (libt2k.so etc.). Let's have a deeper look into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kind of data found in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 debug builds of AdobeCoolType and how we can extract it and use it in a meaningful way.
Digging into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CoolType symbols
In total, I have found 17 unique AdobeCoolType files in various versions of Reader 9.x which contain debug data in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stabs format. The format is a largely textual one, so if we glance at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 analyzed file, we should see data similar to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following dump:
That particular snippet shows names from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 open-source AFDKO library, which is compiled into CoolType. Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r parts of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 debug section reveal more interesting and less public data, such as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 detailed stack layout of Type1InterpretCharString, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 main Postscript CharString interpreter function shown to be subject to a number of bugs in 2015:
The amount of information is stunning – within a 6.35 MB AdobeCoolType file from Reader 9.5.5, around 1.78 MB is consumed just by debug strings of various kinds. Unfortunately, IDA Pro or Ghidra don't seem to parse stabs, so while we will see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 names of functions and globals in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se disassemblers, types (structures, unions, enums, typedefs) and local variable names unfortunately won't be imported. If I missed some way to have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se symbols loaded into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 database, let me know!
The two tools I have successfully used to load stabs are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 old OS X objdump and gdb utilities, with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latter being especially powerful. In my test environment, I have Adobe Reader 9.5.5 installed on Mac OS 10.6.8 (Snow Leopard). When I cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n start Reader under gdb, I see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following output:
The debugger successfully loads cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application and embedded symbols, but it complains about missing object and source files – expecting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m to exist as such a build would typically be used for debugging on a developer's machine. At this point, we can conveniently dump various types of general information with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following gdb commands:
- info functions – list all functions found in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 loaded modules, or print information about a specific function
- info line – print information about a specific line in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 source code file (i.e. which assembly regions it corresponds to)
- info sources – list source file names
- info types – list all known types
- info variables – list all global and static variable names
This already gives us plenty of information; for example, let's go back to our favourite function and look it up:
We can set a breakpoint on it and learn in which line in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 source code it is declared:
We can get some more information on that specific line:
Finally, we can check cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 definition of one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function argument types, for example cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PFontInst structure pointer:
Analyzing issue #1888 (CVE-2019-8048)
Enumerating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 global information may prove very informative and bring answers to a number of questions one could have had while reverse engineering font rasterizers. However, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 true power of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 symbols lies in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 context information available during live debugging. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous blog post, we tried to recover cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack trace upon triggering a crash with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PoC for issue #1888. This is how far we got:
When we load cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same PDF in Adobe Reader 9.5.5 for macOS, here is what we will see under gdb:
Now that is a much more detailed call stack – we can see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 names of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ancestors of ATMBuildBitMap, and we have access to almost complete type/locals information.
Analyzing issue #1891 (CVE-2019-8042)
As anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r example, let's take a CoolType crash in TrueType font processing reported in issue #1891. When we open poc.pdf in Reader, we get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following crash:
Once again, we can obtain a very verbose stack trace:
If we wish to dig deeper and analyze cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 root cause of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem, we may start with establishing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 origin of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 unmapped 0x0a68d4cc address. The arguments of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 top-level fsg_QueryTwilightElement function are:
The 0x0a68d4cc and 0xa69b008 addresses are close to each ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, with a difference of 56124 bytes between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, so we might expect that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 former is calculated based on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latter. Let's look into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second parameter to see if we find any clues that would align with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existing data:
Two of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 structure fields seem unusually large, what do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y look like as signed numbers?
We found cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 culprit! If we open cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fsg_QueryTwilightElement function in a disassembler, we can confirm that this is indeed how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 invalid pointer is constructed prior to being dereferenced. We could now decide to continue cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 analysis to learn why cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two fields are assigned out-of-bounds values and what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 root cause of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem is, or leave it at that and provide cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extra bit of information to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendor while reporting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug.
Conclusion
As we can see, working with debug metadata can make a world of difference during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security research of a closed-source application. I am hoping that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se newly uncovered Reader symbols will make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 life of some security engineers easier in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 future. For me, it is yet anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r piece of evidence that reconnaissance is an essential part of vulnerability research and may yield results far exceeding expectations.
On cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r hand, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 recon step wouldn't be necessary had Adobe made cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 symbols available to everyone upfront. The fact that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 debug data on macOS hasn't been previously discussed means that only cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most determined offensive security researchers might have known about it in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past. We would cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore encourage closed-source companies to improve cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 inspectability of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir software by proactively sharing symbols, similarly to what Microsoft does with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir public symbol server. Such an approach would level cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 playing field and base cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security of client applications on openness and not obscurity, which we believe would consequently benefit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 users in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 long term.
No comments:
Post a Comment