Friday, July 31, 2015

One font vulnerability to rule cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m all #1: Introducing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BLEND vulnerability

Posted by Mateusz Jurczyk of Google Project Zero

Last month, I presented parts of my PostScript font security research at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 REcon security conference in Montreal, in a talk titled “One font vulnerability to rule cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m all: A story of cross-software ownage, shared codebases and advanced exploitation”. This talk discussed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploitation process of a vulnerability found in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 implementation of a BLEND Charstring instruction, discovered in a user-mode Adobe Reader’s CoolType library and a kernel-mode Adobe Type Manager Font Driver (ATMFD.DLL) used by Windows, both of which are responsible for supporting Type 1 and OpenType fonts in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Reader and system GDI environments. This research was performed as part of my Project Zero work, and more generally resulted in a multitude of vulnerabilities discovered in different modern font engines, which all share a common ancestor of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Charstring interpreter routine – ranging from low to critical severity flaws. The full breakdown of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 identified security issues can be found below, with links pointing to corresponding google-security-research bug tracker entries, containing reports with detailed analysis of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerabilities togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r with Proof of Concept files, as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y were provided to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendors:


Microsoft Windows (ATMFD)
Adobe Reader (CoolType)
DirectWrite
Windows Presentation Foundation
Unlimited Charstring execution
Out-of-bounds reads from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Charstring stream
Off-by-x out-of-bounds reads/writes relative to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operand stack
Memory disclosure via uninitialized transient array
Read/write-what-where in LOAD and STORE operators
Buffer overflow in Counter Control Hints
Buffer underflow due to integer overflow in STOREWV
Unlimited out-of-bounds stack manipulation via BLEND operator


As shown above, most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerabilities were present in more than one font engine, running in different security contexts or privilege levels. All of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m were reported to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 respective vendors shortly after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir discovery, and were subsequently patched by Microsoft in two security bulletins: MS15-021 (March) and MS15-044 (May), while Adobe issued a single APSB15-10 bulletin in May to address all issues affecting Reader.

Some background story on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 research can be found in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Results of my recent PostScript Charstring security research unveiled” blog post, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 slide deck used during my REcon presentation is linked below:


To make a long story short, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one vulnerability mentioned in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 title is CVE-2015-0093 (also dubbed CVE-2015-3052 by Adobe). What makes it unique is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that it provides an extremely powerful primitive, making it possible to perform arbitrary PostScript operations (e.g. arithmetic, logic, conditional and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r) anywhere on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploited thread’s stack, with full control over what is overwritten and how. This, in turn, could be used by an attacker to craft a self-contained malicious Type 1 font which, once loaded in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerable environment, reliably and deterministically builds a ROP chain in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Charstring program, consequently defeating all modern exploit mitigations techniques such as stack cookies, DEP, ASLR, SMEP and so on. It also affected both Adobe Reader and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows kernel (32-bit), enabling cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 creation of a single PDF file, which would first achieve arbitrary code execution within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PDF viewer’s process, and furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r escape cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sandbox by exploiting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 very same bug in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operating system, elevating chosen process’ privileges in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system and removing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 associated job’s restrictions.

In order to demonstrate that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above scenario was in fact possible, I created a Proof of Concept file which does exactly that, targeting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latest versions of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 software affected by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bugs: Adobe Reader 11.0.10 and Windows 8.1 Update 1 (32-bit). Considering that 64-bit builds of Windows were not affected by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BLEND vulnerability, I also devised an x64 way to achieve reliable elevation of privileges using anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r Charstring vulnerability (CVE-2015-0090) found during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 research, which also adheres to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “100% reliability” and “all mitigations bypassed” philosophy.

In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 upcoming series of blog posts, I will discuss cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploitation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BLEND vulnerability in more detail, and furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r extend some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 thoughts mentioned in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 slides, sharing my insights and providing more context to those who didn’t get a chance to attend cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 REcon talk in person. Today’s part will cover a brief introduction to digital typography and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 role PostScript fonts play in it, a Type 1 / OpenType primer, a short guide to reverse engineering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 program interpreter found in ATMFD.DLL, and finally a description of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security flaw in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “blend” operator itself. Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r posts released in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 upcoming weeks will subsequently provide details on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process of exploiting Adobe Reader for remote code execution, and Windows 8.1 32/64-bit for sandbox escapes on both builds of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operating system. Let’s start with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 beginning!

Some (pre)history

The history of digital typography is almost as old as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 history of computing itself. Early personal computers seen in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 very early 80’s offered a minimalistic user interface, which only allowed input and output to be passed around as text – text that had to be displayed on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 screen somehow. Since both hardware and software were very simple and had limited capabilities, text formatting on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 display were not an utmost priority back cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n (more so in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 printing industry) with mostly predefined, fixed-width bitmap fonts used at first. Figure 1 shows cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 different typefaces (implemented in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form of bitmap fonts) designed by Susan Kare and released with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original Mac OS operating system in 1984.

Figure 1. Original typefaces shipped with Mac OS in 1984 (source: https://en.wikipedia.org/wiki/Susan_Kare)

A number of bitmap font formats were designed in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 80’s, with some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m still supported by software nowadays, such as Portable Compiled Format (PCF, supported by FreeType), Glyph Bitmap Distribution Format (BDF, supported by FreeType) or Microsoft Windows Bitmapped Font (FON, supported by FreeType and Windows GDI).

Also in 1984, Adobe introduced two outline font formats based on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PostScript language, itself created two years before: Type 1 fonts, which could use a specific subset of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PostScript specification, and Type 3 fonts, which could make use of all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 language’s features. This was a huge leap forward, as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se fonts would specify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 glyph shapes instead of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir bitmap representation at a specific point size, making cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m more extensible, adjustable and universal. These formats were originally proprietary and licensed to Adobe partners; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y were only publicly documented in 1990, following Apple’s work on an independent format, TrueType. As security researchers looking into PostScript fonts, we should be interested primarily in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Type 1 format (not Type 3), which is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one supported by popular software on desktop computers. The two most important documents are:


A year later in 1991, Adobe released an extension to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Type 1 font format, called Multiple Master fonts, which enabled specifying two or more masters (font styles: weight, width, optical size, style) and interpolating between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m along a continuous range of “axes”, as shown in Figure 2. From a technical perspective, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extension was implemented by introducing several new Dictionary fields in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Type 1 header, togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r with several new Charstring instructions. The details of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 technology can be found in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Type 1 Font Format Supplement” linked above. The interesting bit about it is that while it is officially part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 specification and is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore supported by many modern font engines, it was never commonly adopted worldwide, with just a handful of Multiple Master fonts ever coming to existence, mostly created by Adobe itself. This is something to keep in mind as old, sparse, unknown features of common file formats are often great vulnerability hunting targets. More information about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 development of Multiple Master typefaces in Adobe can be found in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “The Adobe Originals Silver Anniversary Story: How cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Originals endured in an ever-changing industry” article [1], but we actually recommend cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire “Celebrating 25 Years of Adobe Originals” series [2] for anyone curious about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 history of digital typography and Adobe’s role in it.


In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same year of 1991, Apple designed a completely new outline font format called TrueType as a competitor to Type 1. It was based on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SFNT general file structure (a short header and a number of data sections described by four-byte tag, offset, length and checksum), represented glyph outlines using quadratic bézier curves, and defined a dedicated turing-complete hinting programming language. The format was first supported in Mac OS System 7 released in May 1991, but Apple also licensed it to Microsoft for free in order to ensure wide adoption. As a result, TTF support was introduced in Windows 3.1 released in 1992. It is largely cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same code that rasterizes TTF fonts in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most recent versions of Windows today.

Three years later, Apple extended TrueType with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 launch of TrueType GX, which introduced new, advanced features such as morphing (similar to Adobe’s Multiple Masters) or Line Layout Manager. Microsoft failed to license cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 format from Apple [3] and started working on a new one, originally called TrueType Open. Adobe would later join Microsoft in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se efforts in order to create technology which would supersede both TrueType and Type 1, eventually named OpenType. While OpenType shares cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same overall SFNT structure as TrueType, it uses a different set of tables. Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore, it can specify glyph outlines in eicá 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ý bet365 old TrueType format (“glyf” table) or a new one called “Compact Font Format” (CFF), which is essentially an extended and binary-encoded equivalent of Type 1. As cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most common flavor nowadays, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 term "OpenType font" is often used for short of OpenType/CFF.

Basic support for OpenType was implemented in Adobe Type Manager in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 early years of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 format’s development, but in order to have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fonts working in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows environment, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 program had to be installed separately in Windows 3.0, 3.1, 95, 98, Me and NT. Microsoft cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n added official support for external font drivers in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operating system, and worked with Adobe to include an Adobe Type Manager Font Driver (ATMFD.DLL) module in default installations starting with Windows 2000. The driver has remained in all furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r editions of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OS, up to and including Windows 8.1. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 meanwhile, Adobe used cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same code to handle OpenType fonts in some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r products, such as Adobe Reader (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CoolType library), and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r projects and vendors followed by also implementing support for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 format, too. Overall, OpenType was widely recognized and is now one of two most commonly used font formats togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r with TrueType.

More recent times

Since late 90's, no groundbreaking revolution has taken place in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form of new font formats. Instead, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existing standards for TrueType and OpenType have been evolving, going through a number of official specification revisions and unofficial extensions implemented by various vendors, often with little to no collaboration with ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r major actors. For example, Apple introduced SFNT tables enabling more advanced font features supported by AAT (Apple Advanced Typography), Microsoft introduced new math tables supported by Office, Windows 8 (RichEdit 8.0) and Gecko, Mozilla and Adobe proposed adding full SVG support to OpenType and so forth. As a result, security researchers nowadays would be mostly interested in four font formats: FON bitmap fonts as still supported by Microsoft Windows and FreeType, Type 1 PostScript fonts supported by Microsoft Windows, Adobe Reader, FreeType and Oracle Java, as well as TrueType and OpenType fonts (with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir various vendor-specific extensions) supported by pretty much every modern font engine. The three most exposed pieces of software would be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 FreeType open-source library used by a majority of UNIX-based software (GNU/Linux, iOS, Android, Chrome OS etc.), and Windows GDI / DirectWrite, which are used by most desktop applications running on Windows for font rasterization (e.g. Internet Explorer, Google Chrome, Mozilla Firefox, Microsoft Office etc.).

As it turns out, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above historical background is quite important in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 context of today's software security. Considering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extensive collaboration between vendors decades ago, a great number of modern widely used programs and systems share a common ancestor of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir font rasterization code. For example, most TTF engines are based on Microsoft's original implementation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 format, including Windows GDI (win32k.sys), Microsoft GDI+, Microsoft DirectWrite, Adobe Reader and Adobe Flash. Likewise, most OTF engines are based on Adobe's original implementation, including Microsoft GDI (ATMFD.DLL), Microsoft DirectWrite, Microsoft Presentation Foundation and Adobe Reader. As a direct outcome, any bugs present in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original implementation that was later branched and included in multiple products were likely propagated, and may affect various programs or operating systems. This is of course an extremely frightful scenario, with a single 0-day vulnerability potentially being used in targeted or mass campaigns against users of different software, or chained to accomplish both remote code execution and a sandbox escape, leading to complete system compromise. Consequently, I believe that due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 high sensitivity of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code area, it deserves special attention from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security community.

Figure 3. Potential security impact of vulnerabilities present in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shared PostScript font implementation.

It is important to note that while cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same pieces of code can be found in a variety of modern programs and environments, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y have been living in different branches and maintained by different groups of people for many years now. They have very likely received a varied degree of auditing and fuzzing (being more or less valuable targets), which means that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y don’t have to be affected by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exact same set of bugs today. On one hand, this can be considered good news, since a bug in one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 products won’t necessarily affect all 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 ones, limiting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 impact. 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, security relevant differences in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 codebases can reveal issues in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 unpatched software through missing sanity checks and similar patterns easy to recognize by reverse engineers using binary diffing tools.

What makes font engines even more sensitive and susceptible to attacks is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attackers can choose from any of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existing file formats, most of which are extremely complex both structurally and semantically, making it very difficult to get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m 100% right in implementation. If we also consider that a majority of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 parsers were in a large part developed in C/C++ several decades ago, that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are easily reachable via numerous channels (websites, documents, USB sticks etc.), and that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y support extensive, turing-complete virtual machine environments for running untrusted TTF/PostScript Charstring programs, it becomes clear that fonts are one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best imaginable attack vectors. This is true even despite cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 great number of vulnerabilities that have already been fixed in virtually every font engine in existence, conference talks given in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past (nearly every major one having a font-related presentation in agenda), and font vulnerabilities being used both “in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wild” (e.g. cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Duqu TTF exploit [4], or comex’ iOS jailbreak via a FreeType Type 1 vulnerability [5]) and in various hacking competitions such as pwn2own 2013 (Joshua Drake’s Java 7 SE OpenType memory corruption vulnerability [6]), or pwn2own 2015 (K33n Team’s TTF vulnerability [7]).

Before we dive into discussing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Charstring related vulnerabilities discovered in Type 1 / OpenType handling implemented in ATMFD.DLL and related font engines, let’s briefly go through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 format and structure of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two PostScript formats.

Type 1 font primer

In essence, Type 1 fonts are a set of so-called “dictionaries” (associative name → value arrays with field-specific primitive types or ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r nested dictionaries) responsible for specifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 general font properties, and PostScript programs called “Charstrings” describing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shapes of all glyphs supported by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 font. An overview of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 general font structure is shown in Figure 4.

Figure 4. Typical dictionary structure of a Type 1 font (source: Adobe Type 1 Font Format, Adobe Systems Inc.)

There are a number of file formats related to Type 1 fonts:

  • .AFM (Adobe Font Metrics), .ACFM (Adobe Composite Font Metrics), .AMFM (Adobe Multiple Font Metrics) – textual metrics files.
  • .PFA (Printer Font ASCII) – textual representation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 core font file.
  • .PFB (Printer Font Binary) – binary representation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 core font file.
  • .PFM (Printer Font Metric) – binary representation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 font metrics.
  • .MMM (Multiple Master Metric) – binary representation of Multiple Master font metrics.

Depending on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 environment, various subsets of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above files are necessary to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 font, with .PFB (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 main, partially binary encoded font file) and .PFM (binary encoded font metrics) being cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most common ones. For example, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 AddFontResource Windows API function requires paths to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 .PFB and .PFM files separated by a pipe character, with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 potential addition of an .MMM file if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 font supports multiple masters.

Examining and modifying .PFB files (and especially cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Charstrings contained within) is inconvenient due to two major reasons: binary encoding and encryption. As it turns out, Adobe introduced a simple encryption scheme in Type 1 fonts in order to prevent casual inspection by third parties. The full details of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 algorithm used to “protect” (or obfuscate, racá 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ý bet365 Private dictionary and Charstrings were only documented when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Type 1 format specification came to light in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 90’s. The encryption routine is shown below, with decryption achieved using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same function with minor changes:

unsigned short int r;
unsigned short int c1 = 52845;
unsigned short int c2 = 22719;
unsigned char Encrypt(plain) unsigned char plain;
{unsigned char cipher;
cipher = (plain ^ (r>>8));
r = (cipher + r) * c1 + c2;
return cipher;
}
(source: Adobe Type 1 Font Format, Adobe Systems Inc.)

In order to work around cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 encryption and Charstring encoding, we can conveniently use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 type1 and detype1 utilities as part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Adobe Font Development Kit for OpenType (AFDKO) (open source code available on GitHub), which can convert between .PFB and .PFA (textual, human readable) font files:

$ detype1 font.pfb > font.pfa
$ type1 font.pfa > font.pfb

At this point, we can freely work with Type 1 fonts, analyzing and modifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m as needed. If we take a quick look into any .PFA file, we will see a number of PostScript programs of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following form:

/at ## -| { 36 800 hsbw -15 100 hstem 154 108 hstem 466 108 hstem 666 100 hstem 445 85 vstem 155 120 vstem 641 88 vstem 0 100 vstem 275 353 rmoveto 54 41 59 57 vhcurveto 49 0 30 -39 -7 -57 rrcurveto -6 -49 -26 -59 -62 0 rrcurveto -49 -27 43 48 hvcurveto closepath 312 212 rmoveto -95 hlineto -10 -52 rlineto -30 42 -42 19 -51 0 rrcurveto -124 -80 -116 -121 hvcurveto -101 80 -82 88 vhcurveto 60 0 42 28 26 29 rrcurveto 33 4 callsubr 8 -31 26 -25 28 -1 rrcurveto 48 -2 58 26 48 63 rrcurveto 40 52 22 75 0 82 rrcurveto 0 94 -44 77 -68 59 rrcurveto -66 59 -81 27 -88 0 rrcurveto -213 -169 -168 -223 hvcurveto -225 173 -165 215 vhcurveto 107 0 92 31 70 36 rrcurveto -82 65 rlineto -32 -20 -64 -12 -83 0 rrcurveto -171 -125 108 182 hvcurveto 172 111 119 168 vhcurveto 153 0 118 -84 -9 -166 rrcurveto -5 -86 -51 -81 -36 -4 rrcurveto -29 -3 12 43 5 24 rrcurveto closepath endchar } |-

As clearly visible, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 instruction stream consists of various outline-related instructions interlaced with immediate numbers (operands). To better understand how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 program execution works, let’s discuss cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 various components of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 execution environment:

  • Instruction stream - cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stream of encoded instructions used to fetch operators and execute cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m. Not accessible by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Type 1 program itself.
  • Operand stack - a LIFO structure holding up to 24 numeric (32-bit) entries. Similarly to regular PostScript, it is used to store instruction operands. It’s important to note that while cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 maximum width of each entry is 32 bits, different instructions may interpret cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m in a variety of ways, e.g. as 16.16 fixed points, 16-bit values (discarding part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 information) etc.
  • Transient array or BuildCharArray - a fully accessible array of 32-bit numeric entries; can be pre-initialized by specifying a /BuildCharArray array in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Private dictionary, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 size can be controlled via a /lenBuildCharArray entry of type “number”.

Most instructions are encoded with a single byte, with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exception of some immediate numbers and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “escape” instructions. The entirety of operators can be divided into six groups depending on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir functions:

Byte range 0 - 31:
  1. Commands for starting and finishing a character’s outline,
  2. Path construction commands,
  3. Hint commands,
  4. Arithmetic commands,
  5. Subroutine commands.
Byte range 32 - 255:
  1. Immediate values pushed on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operand stack, encoded with a varying number of bytes depending on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 size of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number.

All instructions documented in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latest version of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Type 1 format specification are shown in Figure 5.

Figure 5. Currently documented Charstring commands (source: Adobe Type 1 Font Format, Adobe Systems Inc.)

While cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current list of Type 1 instructions seems racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r short, it is important to remember that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PostScript font formats have been evolving over decades, going through a number of iterations which introduced and removed various operators along cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way. As a result, font engines which are supposed to maintain backwards compatibility with most/all fonts ever created likely support instructions that are not on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above list (but may still be interesting from a security point of view). In this context, old revisions of said specifications may be a very valuable source of information.

The Type 1 font specification discusses a number of interesting mechanisms used by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 format (such as subroutines or so-called “ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rsubrs”), but since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are not necessary to understand or exploit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BLEND vulnerability covered in this post, we will not explain cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m here. If you’re interested in font internals or ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r vulnerabilities discovered during my Charstring security research, we encourage you to study cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 full specification.

OpenType font primer

The following two documents should work as solid foundation for any OpenType/CFF related research:


Since OpenType is a fully binary format, it’s similarly inconvenient to inspect or modify manually. In this case, you can use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ttx.py tool (part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Fonttools suite) to convert TrueType and OpenType fonts to a human-readable XML form and back. The fact that it supports a majority of modern SFNT tables and TrueType/PostScript programs makes it a very useful tool.

Overall, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OpenType/CFF format is largely similar to Type 1. There are only a handful of major differences:
  • cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 font is always contained within a single file (.OTF) instead of two or more.
  • previously textual data (such as some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Dictionaries) is now encoded in binary form in order to reduce memory/disk consumption.
  • cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Charstring specification was greatly extended, introducing many new instructions and deprecating some older ones.

A full listing of Type 2 Charstring operators defined in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latest revision of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 specification is shown in Figure 6.

Figure 6. All currently documented Type 2 Charstring operators (source: The Type 2 Charstring Format, Adobe Systems Inc.)

A careful reader will notice that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 encodings of Type 1 and Type 2 Charstring instructions are binary compatible: cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 now-unused Type 1 operators are always marked as “-Reserved-” and never reused in Type 2, while all new commands use previously vacant opcodes (eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 main or “escape” namespace). This makes it possible to create a PostScript program containing instructions from both Type 1 and Type 2 specs, which might have been intentional, so that Type 1 and OpenType/CFF fonts could be converted to each ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r without information loss. However, this behavior might also have some interesting security implications – something to keep in mind for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 future.

If we look closely at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 list above, we can see that a number of seemingly interesting instructions were added:

  • with new global and local type subroutines in OpenType, a callgsubr instruction was introduced,
  • hinting-related instructions (hstemhm, hintmask, cntrmask, ...),
  • arithmetic and logic instructions (and, or, not, abs, add, sub, neg, ...),
  • miscellaneous instructions (random),
  • instructions operating on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 transient array (get, put).

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 “Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rSubrs” functionality was dropped and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 callocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rsubr instruction removed. The execution environment didn’t fundamentally change as compared to Type 1 – it still consists of an instruction stream, operand stack (extended from 24 to 48 entries) and a transient array (converted to a fixed-size array of 32 items).

One ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r interesting part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CFF specification is a table defining cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 various limits of data structures used to implement CFF font support (Figure 7). It is a great starting point for auditing any implementation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 format, as it explicitly indicates cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 places where things can go wrong due to some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se limits not being properly enforced.

Figure 7. Implementation limits of Type 2 Charstring interpreters (source: The Type 2 Charstring Format, Adobe Systems Inc.)

Armed with some general knowledge of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Type 1 / OpenType formats and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Charstring execution environment, let’s dive into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Adobe Type Manager Font Driver, which is one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most complete implementations among PostScript font engines, and is still used in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows kernel to rasterize fonts in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operating system.

Adobe Type Manager Font Driver

The ATMFD.DLL library is a third-party Windows kernel module provided by Adobe, which handles all Type 1 and OpenType fonts loaded via cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GDI interface. It is based on Adobe Type Manager, a family of programs developed by Adobe alongside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PostScript font specification, used to manage fonts, rasterize cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m on computer monitors and print text on non-PostScript printers. ATM was available for Windows starting with Windows 3.0 as an optional component, and was first shipped by default in Windows 2000. For cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last 15 years, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 module has always been cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re, supporting PostScript fonts in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows environment.

In order to make use of ATMFD.DLL, Microsoft introduced a universal interface for installing external font drivers through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Font Drivers registry key. To our current knowledge, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only value residing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re in any default Windows installation is "Adobe Type Manager"="atmfd.dll", and we are not aware of any ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r third-party font drivers in existence. However, it should be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365oretically possible to develop and plug a custom driver supporting any font format we would wish.

When one starts looking into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 internals of ATMFD, one thing becomes immediately clear – as opposed to a majority of Windows libraries, this one doesn’t have debug symbols available from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Microsoft symbol server. This makes it considerably more difficult to do any reverse-engineering from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 start, and might also be one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reasons why cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrueType font handling implemented in win32k.sys (Microsoft’s component) is arguably more thoroughly audited. In order to (partly) work around cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem, we can make use of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that function symbols are available for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OpenType implementations found in DirectWrite (DWrite.dll) and Windows Presentation Foundation (PresentationCFFRasterizerNative_v0300.dll). By cross-diffing eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se modules with ATMFD.DLL, it is possible to recover cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 names of some functions, which might subsequently help with furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r analysis.

Quite interestingly, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is also anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r approach to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem of missing symbols. As Halvar Flake noticed, some ancient builds of Adobe Reader (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ones we know about are Reader 4 for AIX and Reader 5 for Windows) shipped with debug symbols, including cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CoolType.dll font processing library. As cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code has not fundamentally changed since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n, it is also possible to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 old CoolType as a source of symbols which can be matched with modern ATMFD.DLL code; or better yet, all three pieces of software sharing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same common ancestor as ATMFD (DirectWrite, WPF, CoolType) could be used togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r to get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most complete picture of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reverse engineered module.

There are also ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r sorts of information included in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Adobe Type Manager which can help us find our way in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 assembly – cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 font driver is full of debug messages which contain a variety of information, like local/global variable names, function names, expressions used in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code and source file paths. Additionally, we can also find a number of string literals related to Type 1 fonts (e.g. names of dictionary fields) which reveal cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 locations of functions dealing with those entries through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir cross-references in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DLL. Examples of such useful strings are shown below:


... and many ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rs. All this information makes it relatively easy to spot cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 target we are after in this research - cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Charstring processing routine - as it directly references many such Charstring related debug strings:


Incidentally, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function is also by far cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 largest one in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DLL file, with a size of more than 20kB, while cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second largest routine is “only” 4kB long. The magnitude and complexity of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function is best illustrated by a control flow graph, as presented in Figure 8. In order to display cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 graph, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 maximum number of nodes in IDA had to be increased from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 default value of 1000.

Figure 8. Control flow graph representation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Charstring processing function found in ATMFD.DLL.

We can furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r confirm that this is in fact cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 desired function by using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 methods discussed above to acquire its name from one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 libraries with available symbols. If we look into DirectWrite or Windows Presentation Foundation, we will learn that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 caller of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function is named “Type1InterpretCharString”; in CoolType, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function itself is called “DoType1InterpretCharString”, affirming that this in fact cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 piece of code we want to look into.

As indicated by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shape and structure of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above graph, we can deduce that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 routine most likely consists of a giant switch/case construct, handling each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 various supported PostScript operators accordingly. A deeper analysis of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function shows that this is in fact cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case – during each iteration of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 execution loop, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function fetches cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next command opcode and enters a corresponding block of code:

BYTE op = *charstring++;
switch (op) {
  case HSTEM:
  ...
  case VSTEM:
  ...
  case VMOVETO:
  ...
  .
  .
  .
}

However, this construct alone doesn’t justify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 size of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function. In part, it is caused by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that it is a universal interpreter used for both Type 1 and Type 2 Charstrings, which are binary compatible formats as mentioned above. This already bodes well for an attacker, as it enables Type 1 Charstrings to make use of all Type 2 (OpenType/CFF) features and vice versa – for example, if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re was a vulnerability in a Type 1 specific operator (unrelated to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 general structure of Type 1 fonts), an exploit for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability could also be delivered via an OpenType file, which might sometimes be more convenient for an attacker (.OTF being cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 more widespread and generally trusted file format).

Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r inspection also shows cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 real reason for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bloated interpreter – it implements every single feature that has ever been part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Type 1 or Type 2 specifications, including cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 strictly experimental ones or those officially deprecated many years ago. As cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 formats have been evolving for decades, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 currently officially supported Charstring commands are only a small subset of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entirety of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operators that have ever seen daylight. While presumably done to maintain compatibility with all fonts in existence (including ones created many years ago), this situation is also favorable to a vulnerability hunter, since:

  1. it significantly increases cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack surface open for analysis and exploitation,
  2. cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 implementations of legacy or deprecated features that have not been heard of for a long time are frequently affected by security vulnerabilities, as ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r developers or researchers might have not been aware of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “hidden” functionality, which may thus have remained untested for many years.

The last noteworthy discovery I made while delving into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interpreter was that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PostScript operand stack (with a maximum of 48 32-bit elements) was implemented in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form of a local array on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interpreter’s function stack, and called “op_stk” according to various debug messages referring to it. The current position on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack was indicated by a local pointer called “op_sp”, which would be originally set to &op_stk[0], and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n incremented or decremented depending on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 executed PostScript commands. While this isn’t a bug or bad behavior in itself, it makes it easy for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 developer to slip, as somewhat advanced pointer arithmetic needs to be employed to correctly performs all bounds checks affecting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value of “op_sp” – and if one of such checks is missing or faulty, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 consequences of having an out-of-bounds operand stack pointer pointing somewhere on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 local thread’s stack while executing subsequent Charstring instructions might have catastrophic consequences for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 affected software. However, let’s not jump cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 gun. :-)

All of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above kept my hopes high for some interesting discoveries – and, as shown at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 top of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 post, I didn’t end up disappointed. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following section, I will discuss my most impactful finding, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BLEND vulnerability, which provided a primitive allowing for a complete and fully reliable bypass of all currently available software exploit mitigations, and affected both Adobe Reader and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows Kernel (ATMFD.DLL) at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same time. Read on.

The BLEND vulnerability (CVE-2015-0093, CVE-2015-3052)

In order to understand cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability being cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 main subject of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 post, we first have to get a grasp on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 functionality it was discovered in – cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “blend” PostScript operator. It is strongly related to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 forgotten Multiple Masters font extension, and was originally introduced in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “The Type 2 Charstring Format” document on 5 May 1998. It was cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time when “Multiple Masters” - originally an extension of Type 1 PostScript fonts - was also considered as an addition to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new OpenType/CFF format, resulting in a number of MM-related operators added to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 1998 revision of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Charstring specification (togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r with new fields introduced into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CFF format). However, since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 idea of OpenType/MM was not widely adopted (with just a few such fonts ever coming into existence, none of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 publicly used), all references to Multiple Masters were soon removed from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 document on 16 March 2000, as shown in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 excerpt in Figure 9.

Figure 9. An excerpt from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 change log of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “The Type 2 Charstring Format” document from 16 March 2000.

Less than two years of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 feature’s existence already warranted it a place in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Charstring interpreter found in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows kernel and Adobe Reader.

The details of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operation performed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 instruction are explained in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Type 2 Charstring specs from 1998. From a security perspective, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 outcome of executing a “blend” operator boils down to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following actions:

  • Loading a signed 16-bit integer value from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operand stack (let’s call it n).
  • Loading k*n furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r elements from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack, where k is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 font’s master designs (2-16, controlled via cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 /WeightVector Type 1 table).
  • Pushing n values back to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operand stack.

In ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r words, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 instruction “blends” k*n values into n numbers on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PostScript stack, with k being a controlled small number and n being an arbitrary 15-bit number with sign. With such complex functionality, involving shifting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack pointer in various directions based on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 result of an arithmetic operation where factors are user-controlled, a number of things can obviously go wrong. The authors of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code were definitely aware of this too, as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y included a number of sanity checks executed prior to performing any actual operations on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operand stack:
  1. Is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack pointer within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bounds of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operand stack?
    op_sp >= op_stk && op_sp <= &op_stk_end
  2. Is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re at least one item on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operand stack (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 n value)?
    op_sp >= &op_sp[1]
  3. Are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re at least k*n items on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operand stack to load?
    &op_stk[n * master_designs] <= op_sp
  4. Is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re enough space left on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack to push cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 output parameters?
    master_designs != 0 || &op_sp[n] < &op_stk_end

The checks were also made easier to understand thanks to a number of debug messages referenced in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code:
"stack underflow in cmdBLEND",
"stack overflow in cmdBLEND"
"DoBlend would underflow operand stack", "op_stk + inst->lenWeightVector*nArgs <= op_sp"

While cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 developers went to some great lengths to make sure that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operation would be safe, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y missed one corner case: a negative value of n, which is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 culprit of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability. In such case, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 control flow reaches a “DoBlend” function, which is where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 actual blending operation is performed. If we disregard cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 specific values loaded from and pushed to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only thing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 routine does is perform cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following operation on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operand stack pointer:
op_sp -= n * (master_designs - 1) * 4

which is a different way of expressing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 popping of k*n values, and pushing n values back. In fact, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “DoBlend” function is fortunately constructed such that for a negative n, no actual popping/pushing takes place, avoiding unnecessary corruption of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack data; however, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “op_sp” pointer is still adjusted accordingly to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 formula above. This means that with a controlled 16-bit n, we can increase cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack pointer arbitrarily beyond cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “op_stk” array. Since having “op_sp” always point to inside of “op_stk” is one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fundamental assumptions made by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interpreter code, it is also a security boundary which can be crossed with a sufficiently small negative n number.

It should be noted that while cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “blend” operator was documented as part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Type 2 Charstring specs (used in OpenType files), nowadays it is only functional in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 context of Type 1 fonts. This is due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of master designs (referred to as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 k factor) can only be controlled via cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 /WeightVector array in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Top DICT of Type 1 fonts, as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding CFF entries are no longer supported by ATMFD. Hence, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability is limited to Type 1 fonts only.

It turns out that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rest of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code continues to work in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker’s favor. Once we execute cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “blend” instruction which increases “op_sp” beyond cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end of “op_stk”, anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r iteration of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interpreter loop takes place, which starts with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following lines of code:

if (op_sp < op_stk) {
 AtmfdDbgPrint("windows\\core\\ntgdi\\fondrv\\otfd\\bc\\t1interp.c",
                4475, "underflow of Type 1 operand stack",
                "op_sp >= op_stk");
 abort();
}

That’s right – at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 beginning of each instruction’s execution, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function checks that “op_sp” is not below cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operand stack array, but at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same time doesn’t verify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 upper boundary, making it possible for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Charstring to continue normal execution with an inconsistent state of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interpreter (an out-of-bounds stack pointer).

Considering that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are two factors of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 product used to shift cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operand stack pointer (n and k), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 maximum number of bytes we can increase “op_sp” by is 32768 (maximum negative value of n) times 15 (maximum number of k - 1) times 4 (size of a single stack item) = 1966080 (0x1E0000), or almost 2MB. Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploited thread’s stack will probably always be smaller than that, it would allow us to operate on ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r types of nearby memory regions such as heaps/pools, executable images etc. 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, with k=2, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack pointer is shifted by exactly -n*4 bytes (-n DWORDs), which provides a great granularity for out-of-bounds memory access. By using a simple two-command “-x BLEND” instruction sequence, we can set “op_sp” to any 4-byte aligned offset relative to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “op_stk” array!

The impact of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 context of ATMFD.DLL can be easily illustrated by using a short stream of four Charstring instructions, which perform cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following actions:

  1. Shift cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operand stack pointer so that it points at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interpreter function’s return address.
  2. Trigger an “exchange” operation, swapping cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two topmost operand stack entries, which in this case are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack frame pointer (saved EBP) and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 return address.
  3. Use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ENDCHAR command to cause cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 control flow to leave cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interpreter, thus triggering a bugcheck upon an attempt to execute data from stack while using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corrupted return address.

This process is also shown in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 animation below:
an54_100.gif

And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 resulting kernel crash would look as follows:
ATTEMPTED_EXECUTE_OF_NOEXECUTE_MEMORY (fc)
An attempt was made to execute non-executable memory.  The guilty driver
is on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack trace (and is typically cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current instruction pointer).
When possible, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 guilty driver's name (Unicode string) is printed on
cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bugcheck screen and saved in KiBugCheckDriver.
Arguments:
Arg1: 97ebf6a4, Virtual address for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attempted execute.
Arg2: 11dd2963, PTE contents.
Arg3: 97ebf56c, (reserved)
Arg4: 00000002, (reserved)

The impact of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability is greatly elevated by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that we can use all implemented operators (arithmetic, storage, etc.) over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 out-of-bounds “op_sp” pointer, making it possible to add, subtract, move data around cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack, insert constants and so on. In ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r words, it provides us with all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 primitives necessary to build a full ROP chain used to achieve arbitrary code execution. This, in turn, enables cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 creation of a 100% reliable exploit subverting all modern exploit mitigations such as stack cookies, DEP, ASLR or SMEP. The entire exploitation process takes place during Charstring execution, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore doesn’t require any interaction with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerable software ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than loading a specially crafted font.

The only downside of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug is that it doesn’t affect 64-bit platforms. This is caused by one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bounds checks in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “blend” operator implementation, which does in fact prevent negative values of n from passing through, thanks to a subexpression being cast to a 32-bit unsigned integer value before being added to a 64-bit pointer:
if ((uint64)(&op_stk + 4 * (uint32)(n * master_designs)) > op_sp)

The behavior effectively eliminates cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 compiled code – however, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re isn’t so much to worry about from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploitation angle. At cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time of this writing, Adobe only ships 32-bit builds of Reader, making all unpatched installations of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 software affected by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 flaw. While x64 builds of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows kernel might be more troublesome, ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r vulnerabilities discovered during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 research could be used to escape cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sandbox in our proof of concept exploit, which will also be discussed later in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 series.

That’s it for today. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subsequent upcoming posts, we will discuss cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process of developing a universal, fully reliable proof-of-concept PDF file, which will spawn an elevated calc.exe running with high integrity level and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “System” security token when opened with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most recent vulnerable versions of Adobe Reader and Windows 8.1 32/64-bit.

References