Monday, July 24, 2017

Trust Issues: Exploiting TrustZone TEEs

Posted by Gal Beniamini, Project Zero

Mobile devices are becoming an increasingly privacy-sensitive platform. Nowadays, devices process a wide range of personal and private information of a sensitive nature, such as biometric identifiers, payment data and cryptographic keys. Additionally, modern content protection schemes demand a high degree of confidentiality, requiring stricter guarantees than those offered by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “regular” operating system.

In response to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se use-cases and more, mobile device manufacturers have opted for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 creation of a “Trusted Execution Environment” (TEE), which can be used to safeguard cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 information processed within it. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Android ecosystem, two major TEE implementations exist - Qualcomm’s QSEE and Trustonic’s Kinibi (formerly

In this blog post we’ll explore cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security properties of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two major TEEs present on Android devices. We’ll see how, despite cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir highly sensitive vantage point, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se operating systems currently lag behind modern operating systems in terms of security mitigations and practices. Additionally, we’ll discover and exploit a major design issue which affects cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security of most devices utilising both platforms. Lastly, we’ll see why cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 integrity of TEEs is crucial to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overall security of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device, making a case for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 need to increase cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir defences.

Unfortunately, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 design issue outlined in this blog post is difficult to address, and at times cannot be fixed without introducing additional dedicated hardware or performing operations that risk rendering devices unusable. As a result, most Qualcomm-based devices and all devices using Trustonic’s Kinibi TEE versions prior to 400 (that is, all Samsung Exynos devices ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Galaxy S8 and S8 Plus) remain affected by this issue. We hope that by raising awareness to this issue we will help push for a more secure designs in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 future.

I would like to note that while cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current designs being reviewed may be incompatible with some devices’ use-cases, improved designs are being developed as a result of this research which may be accessible to a larger proportion of devices.

TrustZone TEEs


TrustZone forms a hardware-based security architecture which provides security mechanisms both on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 main application processor, as well as across cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SoC. TrustZone facilitates cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 creation of two security contexts; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Secure World” and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Normal World”. Each physical processor is split into two virtual processors, one for each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned contexts.

As its name implies, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Secure World” must remain protected against any attacks launched by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Normal World”. To do so, several security policies are enforced by hardware logic that prevents cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Normal World” from accessing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Secure World”’s resources. What’s more, as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current security state is accessible on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system bus, peripherals on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SoC can be designated to eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r world by simply sampling this value.

TrustZone’s software model provides each world with its own copies of both lower privilege levels -- EL0 and EL1. This allows for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 execution of different operating system kernels simultaneously - one running in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Secure World” (S-EL1), while anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r runs in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Normal World” (EL1). However, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 world-split is not entirely symmetrical; for example, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hypervisor extensions (EL2) are not available in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Secure World”.

context_map.png
*TOS: Trusted Operating System

On Android devices, TrustZone technology is used among ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r things to implement small “security-conscious” operating systems within which a set of trusted applications (TAs) may be executed. These TrustZone-based TEEs are proprietary components and are provided by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device’s manufacturers.

To put it in context - what we normally refer to as “Android” in our day to day lives is merely cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code running in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Normal World”; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Linux Kernel running at EL1 and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user-mode applications running at EL0. At cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same time, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE runs in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Secure World”; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE OS runs in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Secure World”’s EL1 (S-EL1), whereas trusted applications run under S-EL0.

Within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Android ecosystem, two major TEE implementations exist; Qualcomm’s “QSEE” and Trustonic’s “Kinibi”. These operating systems run alongside Android and provide several key features to it. These features include access to biometric sensors, hardware-bound cryptographic operations, a “trusted user-interface” and much more.

Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Secure World”’s implementation is closely tied to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hardware of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 available security mechanisms on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SoC, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE OSs require support from and integration with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 earlier parts of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device’s bootchain, as well as low-level components such as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bootloader.

Lastly, as can be seen in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 schematic above, in order for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Normal World” to be able to interact with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 applications within it, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 authors of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE must also provide user-libraries, daemons and kernel drivers for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Normal World”. These components are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n utilised by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Normal World” in order to communicate with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE.

Exploring cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEEs


Like any ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r operating system, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security of a Trusted Execution Environment is hinged upon cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 integrity of both its trusted applications, and that of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE OS’s kernel itself. The interaction with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE’s kernel is mostly performed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trusted applications running under it. As such, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 logical first step to assessing 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 TEEs would be to get a foothold within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE itself.

To do so, we’ll need to find a vulnerability in a trusted application and exploit it to gain code execution. While this may sound like a daunting task, remember that trusted applications are merely pieces of software that process user-supplied data. These applications aren’t written in memory safe languages, and are executed within opaque environments - a property which usually doesn’t lend itself well to security.  

Bearing all this in mind, how can we start analysing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trusted applications in 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 platforms? Recall that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 implementations are proprietary, so even cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file formats used to store cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 applications may not be public.

Indeed, in Qualcomm’s case cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 format used to store cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 applications was not documented until recently. Nonecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365less, some attempts have been made to reverse engineer cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 format resulting in tools that allow converting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 proprietary file format into a regular ELF file. Once an ELF file is produced, it can subsequently be analysed using any run-of-cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365-mill disassembler. What’s more, in a recent positive trend of increased transparency, Qualcomm has released official documentation detailing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file format in its entirety, allowing more robust research tools to be written as a result.
Screenshot from 2017-07-13 12:03:18.png

As for Trustonic, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trusted applications’ loadable format is documented within Trustonic’s publically available header files. This saves us quite some hassle. Additionally, some plugins are available to help load cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se applications into popular disassemblers such as IDA.

mclf header (1).png

Now that we’ve acquired cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tools needed to inspect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trusted applications, we can proceed on to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next step - acquiring cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet images (from a firmware image or from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device), converting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m to a standard format, and loading cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m up in a disassembler.

However, before we do so, let’s take a moment to reflect on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet model!

Revisiting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Trustlet Model


To allow for increased flexibility, modern TEEs are designed to be modular, racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than monolithic chunks of code. Each TEE is designed as a “general-purpose” operating system, capable of loading arbitrary trustlets (conforming to some specification) and executing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m within a “trusted environment”.  What we refer to as a TEE is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 combination of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE’s operating system, as well as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 applications running within it.

There are many advantages to this model. For starters, changes to a single trustlet only require updating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application’s binary on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filesystem, without necessitating any change in ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r components of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE. This also allows for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 creation of a privilege separation model, providing certain privileges to some trustlets while denying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m to ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rs. Perhaps most importantly, this enables cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE OS to enforce isolation between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlets cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves, thus limiting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 potential damage done by a single malicious (or compromised) trustlet. Of course, while in principle cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se advantages are substantial, we’ll see later on how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y actually map onto cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEEs in question.

Regardless, while cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 advantages of this model are quite clear, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are not completely free of charge. Recall, as we’ve mentioned above, that trusted applications are not invulnerable. Once vulnerabilities are found in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se applications, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can be used to gain code execution within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE (in fact, we’ll write such an exploit later on!).

However, this begs cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 question - “How can trustlets be revoked once cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y’ve been found to be vulnerable?”. After all, simply fixing a vulnerability in a trustlet would be pointless if an attacker could load old vulnerable trustlets just as easily.

To answer this question, we’ll have to separately explore each TEE implementation.

QSEE Revocation


As we’ve mentioned above, Qualcomm has recently released (excellent) documentation detailing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 secure boot sequence on Qualcomm devices, including cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mechanisms used for image aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication. As trusted applications running under QSEE are part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same general architecture described in this document, we may gain key insights into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 revocation process by reviewing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 document.

Indeed, Qualcomm’s signed images are regular ELF files which are supplemented by a single special “Hash Table Segment”. This segment includes three distinct components: cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SHA-256 digest of each ELF segment, a signature blob, and a certificate chain.


Screenshot from 2017-07-12 18:30:04.png

The signature is computed over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 concatenated blob of SHA-256 hashes, using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 private key corresponding to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last certificate in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 embedded certificate chain. Moreover, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 root certificate in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chain is validated against a “Root Key Hash” which is stored in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device’s ROM or fused into one-time-programmable memory on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SoC.

Reading through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 document, we quickly come across cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following relevant statement:

“The Attestation certificate used to verify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature on this hash segment also includes additional fields that can bind restrictions to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature (preventing “rolling back” to older versions of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 software image, …”

Ah-ha! Well, let’s keep reading and see if we come across more pertinent information regarding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 field in question.

Continuing our review of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 document, it appears that Qualcomm has elected to add unique OU fields to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 certificates in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 embedded chain, denoting several attributes relating to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature algorithm of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image being loaded. One such field of particular interest to our pursuits is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “SW_ID”. According to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 document, this field is used to “bind cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature to a particular version of a particular software image”. Interesting!

The field is comprised of two concatenated values:


The document cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n goes on to explain:

“...If eFuse values indicated that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current version was ‘1’, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n this image would fail verification. Version enforcement is done in order to prevent loading an older, perhaps vulnerable, version of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image that has a valid signature attached.”

At this point we have all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 information we need. It appears that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subject of image revocation has not eluded Qualcomm -- we’re already off to a good start. However, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are a few more questions in need of an answer yet!

Let’s start by taking a single trustlet, say cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Pixel’s Widevine trustlet, and inspecting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SW_ID field encoded in its attestation certificate. As this is a DER-encoded X.509 certificate, we can parse it using “openssl”:

wv_cert.png

As we can see above, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IMAGE_ID value assigned to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Widevine trustlet is 0xC. But what about 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 trustlets in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Pixel’s firmware? Inspecting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m reveals a surprising fact -- all trustlets share cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same image identifier.

More importantly, however, it appears that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 version counter in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Widevine application on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Pixel is 0. Does this mean that no vulnerabilities or ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r security-relevant issues have been found in that trustlet since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device first shipped? That seems like a bit of a stretch. In order to get a better view of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current state of affairs, we need a little more data.

Luckily, I have a collection of firmware images that can be used for this exact purpose! The collection contains more than 45 different firmware images from many different vendors, including Google, Samsung, LG and Motorola. To collect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 needed data, we can simply write a short script to extract cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 version counter from every trustlet in every firmware image. Running this script on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware collection would allow us to assess how many devices have used cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet revocation feature in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past to revoke any vulnerable trusted application (since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir version counter would have to be larger than zero).

After running cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 script on my firmware collection, we are greeted with a surprising result: with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exception of a single firmware image, all trustlets in all firmware images contain version number 0.

Putting it all togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, this would imply one of two things: eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r no bugs are ever found in any trustlet, or device manufacturers are failing to revoke vulnerable trustlets.

In fact, we already know cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 answer to this question. Last year I performed research into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Widevine trustlet as present on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Nexus 6 and found (and exploited) a vulnerability allowing arbitrary code execution within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE.

This same vulnerability was also present on a wide variety of ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r devices from different manufactures, some of whom are also a part of my firmware collection. Nonecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365less, all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se devices in my collection (including cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Nexus 6) did not revoke cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerable trustlet, and as such have remained vulnerable to this issue. While some devices (such as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Nexus 6) have shipped patched versions of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet, simply providing a patched version without incrementing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 version counter has no effect whatsoever.

While I do not have a sufficiently large firmware collection to perform a more in-depth analysis, previous assessments have been done regarding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 amount of affected devices. Regardless, it remains unknown what proportion of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se devices have correctly revoked cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet.

As it happens, exploiting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue on “patched” devices is extremely straightforward, and does not require any more privileges than those required by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original version of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit. All an attacker would need to do is to place cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 old trustlet anywhere on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filesystem, and change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 path of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit (a single string) to point at that new location (you can find example of such an exploit here).

One might be tempted to suggest several stop-gap mitigations, such as filtering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filesystem path from which trustlets are loaded to ensure that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y only originate from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system partition (thus raising cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bar for a would-be attacker). However, due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 design of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 API used to load trustlets, it seems that filtering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filesystem path from which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet is loaded is not feasible. This is since QSEECOM, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 driver provided by Qualcomm to interact with QSEE, provides a simple API wherein it is only provided with a buffer containing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet’s binary by user-space. This buffer is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n passed on to TrustZone in order for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet to be aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365nticated and subsequently loaded. Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 driver only receives a blob containing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet itself, it has no “knowledge” of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filesystem path on which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet is stored, making such verification of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filesystem path harder.

Of course, interaction with QSEECOM is restricted to several SELinux contexts. However, a non-exhaustive list of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se includes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 media server, DRM server, KeyStore, volume daemon, fingerprint daemon and more. Not a short list by any stretch…

So what about devices unaffected by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previously disclosed Widevine vulnerability? It is entirely possible that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se devices are affected by ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r bugs; eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r still undiscovered, or simply not public. It would certainly be surprising if no bugs whatsoever have been found in any of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlets on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se devices in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interim.

For example, diffing two versions of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Widevine trustlet in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Nexus 6P shows several modifications, including changes in functions related to key verification. Investigating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se changes, however, would require a more in-depth analysis of Widevine and is beyond cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 scope of this blog post.

Screenshot from 2017-07-13 14:38:59.png


Putting all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, it seems quite clear that device manufacturers are eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r unaware of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 revocation features provided by Qualcomm, or are unable to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m for one reason or anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r.

In addition to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mechanism described above, additional capabilities are present in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case of trustlet revocation. Specifically, on devices where a replay protected memory block (RPMB) is available, it can be utilised to store cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 version numbers for trustlets, instead of relying on an eFuse. In this scenario, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 APP_ID OU is used to uniquely identify each trusted application, allowing for a more fine-grained control over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir revocation.

That being said, in order to leverage this feature, devices must be configured with a specific eFuse blown. Since we cannot easily query cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 status of eFuses on a large scale, it remains unknown what proportion of devices have indeed enabled this feature. Perhaps one explanation for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lack of revocation is that some devices are eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r lacking a RPMB, or have not blown cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned eFuse in advance (blowing a fuse on a production device may be a risky operation).

What’s more, going over our firmware collection, it appears that some manufacturers have an incomplete understanding of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 revocation feature. This is evidenced by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that several firmware images use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same APP_ID for many (and sometimes all) trusted applications, thus preventing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 use of fine-grained revocation.

There are ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r challenges as well - for example, some vendors (such as Google) ship cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir devices with an unlocked bootloader. This allows users to freely load any firmware version onto cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device and use it as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y please. However, revoking trustlets would strip users of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ability to flash any firmware version, as once a trustlet is revoked, firmware versions containing trustlets from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous versions would no longer pass cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication (and would cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore fail to load). As of now, it seems that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is no good solution for this situation. Indeed, all Nexus and Pixel devices are shipped with an unlocked bootloader, and are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore unable to make use of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet revocation feature as present today.

One might be tempted once again to suggest naive solutions, such as embedding a whitelist of “allowed” trustlet hashes in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE OS’s kernel itself. Thus, when trustlets are loaded, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y may also be verified against this list to ensure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are allowed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current version TEE OS. This suggestion is not meritless, but is not robust eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. For starters, this suggestion would require incrementing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 version counter for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE OS’s image (ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise attackers may rollback that binary as well). Therefore, this method suffers from some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same drawbacks of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 currently used approach (for starters, devices with an unlocked bootloader would be unable to utilise it). It should be noted, however, that rewriting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE OS’s image would generally require raw access to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filesystem, which is strictly more restrictive than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current permissions needed to carry out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack.

Nonecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365less, a better solution to this problem (racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than a stop-gap mitigation) is still needed. We hope that by underscoring all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se issues plaguing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current implementation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 revocation feature (leading to it being virtually unused for trustlet revocation), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 conversation will shift towards alternate models of revocation that are more readily available to manufacturers. We also hope that device manufacturers that are able to use this feature, will be motivated to do so in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 future.

Kinibi Revocation


Now, let’s set our sights on Trustonic’s Kinibi TEE. In our analysis, we’ll use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Samsung Galaxy S7 Edge (SM-G935F) - this is an Exynos-based device running Trustonic’s TEE version 310B. As we’ve already disclosed an Android privilege escalation vulnerability a few months ago, we can use that vulnerability in order to get elevated code execution with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “system_server” process on Android. This allows us greater freedom in exploring cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mechanisms used in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Normal World” related to Trustonic’s TEE.

Unfortunately, unlike Qualcomm, no documentation is available for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication process carried out by Trustonic’s TEE. Be that as it may, we can still start our research by inspecting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet images cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves. If we can account for every single piece of data stored in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet binary, we should be able to identify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 location of any version counter (assuming, of course, such a counter exists).

As we’ve mentioned before, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 format used by trusted applications in Trustonic’s TEE is documented in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir public header files. In fact, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 format itself is called cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “MobiCore Loadable Format” (MCLF), and harkens back to G&D’s MobiCore TEE, from which Trustonic’s TEE has evolved.

Using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 header files and inspecting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 binary in tandem, we can piece togecá 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 entire format to store cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet’s metadata as well as its code and data segments. As a result, we arrive at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following layout:

MCLF (3).png

At this point, we have accounted for all but a single blob in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet’s binary - indeed, as shown in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image above, following cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data segment, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re appears to be an opaque blob of some sort. It would stand to reason that this blob would represent cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet’s signature (as ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise that would imply that unsigned trusted applications could be loaded into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE). However, since we’d like to make sure that all bits are accounted for, we’ll need to dig deeper and make sure that is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case.

Unfortunately, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re appear to be no references in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 header files to a blob of this kind. With that in mind, how can we make sure that this is indeed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet’s signature? To do so we’ll need to reverse engineer cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 loading code within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE OS responsible for aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365nticating and loading trusted applications. Once we identify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 relevant code, we should be able to isolate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 handling of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature blob and deduce its format.

At this point, however, this is easier said than done. We still have no knowledge of where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE OS’s binary is stored, how it may be extracted, and what code is responsible for loading it into place. However, some related work has been done in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past. Specifically, Fernand Lone Sang of Quarkslab has published a two-part article on reverse-engineering Samsung’s SBOOT on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Galaxy S6. While his work is focused on analysing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code running in EL3 (which is based on ARM’s Trusted Firmware), we’re interested in dissecting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code running in S-EL1 (namely, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE OS).

By applying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same methodology described by Fernand, we can load cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SBOOT binary from an extracted firmware image into IDA and begin analysing it. Since SBOOT is based on ARM’s Trusted Firmware architecture, all we’d need to do is follow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 logic up to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 point at which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE OS is loaded by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bootloader. This component is also referred to as “BL32” in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ARM Trusted Firmware terminology.

securebootflow.png

After reversing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 relevant code flows, we finally find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 location of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE OS’s kernel binary embedded within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SBOOT image! In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interest of brevity, we won’t include cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire process here. However, anyone wishing to extract cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 binary for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves and analyse it can simply search for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string “VERSION_-+A0”, which denotes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 beginning of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE OS’s kernel image. As for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image’s base address - by inspecting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 absolute branches and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VBAR in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel we can deduce that it is loaded into virtual address 0x7F00000.

Alternatively, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re exists anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r (perhaps much easier) way to inspect Kinibi’s kernel. It is a well known fact that Qualcomm supports cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 execution of not one, but two TEEs simultaneously. Samsung devices based on Qualcomm’s SoCs make use of this feature by loading both QSEE and Kinibi at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same time. This allows Samsung to access features from both TEEs on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same device. However, we’ve already seen how images loaded by Qualcomm’s image aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication module can be converted into regular ELF files (and subsequently analysed). Therefore, we can simply apply cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same process to convert Kinibi’s kernel (“tbase”, as present on Samsung’s Qualcomm-based devices) into an ELF file which can cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n be readily analysed.

Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file format of trusted applications running under Kinibi TEE on Qualcomm devices appears identical to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one used on Exynos, that would suggest that whatever aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication code is present in one, is also present in 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.

After some reversing, we identify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 relevant logic responsible for aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365nticating trusted applications being loaded into Kinibi. The microkernel first verifies cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 arguments in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MCLF header, such as its “magic” value (“MCLF”). Next, it inspects cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “service type” of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image being loaded. By following cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code’s flow we arrive at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function used to aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365nticate both system trustlets and drivers - just what we’re after! After analysing this function’s logic, we finally arrive at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 structure of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature blob:

sigblob (2).png

The function extracts cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 public key information (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 modulus and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 public exponent). Then, it calculates cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SHA-256 digest of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 public key and ensures that it matches cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 public key hash embedded in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel’s binary. If so, it uses cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extracted public key togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 embedded signature in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 blob to verify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet itself (which is performed on its entire contents up to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature blob). If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 verification succeeds, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet is loaded.

At long last, we are finally able to account for every single bit in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet. But… Something appears to be amiss - where is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 version counter located? Out of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire trustlet’s binary, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is but a single value which may serve this purpose -- cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Service Version” field in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MCLF header. However, it certainly doesn’t seem like this value is being used by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 loading logic we traced just a short while ago. Nevercá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365less, it’s possible that we’ve simply missed some relevant code.

Regardless, we can check whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r any revocation using this field is taking place in practice by leveraging our firmware collection once again! Let’s write a short script to extract cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 service version field from every trusted application and run it against cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware repository…

...And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 results are in! Every single trusted application in my firmware repository appears to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same version value - “0”. While cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are some drivers that use a different value, it appears to be consistent across devices and firmware versions (and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore doesn’t seem to represent a value used for incremental versions or for revocation). All in all, it certainly seems as though no revocation it taking place.

But that’s still not enough quite enough. To ensure that no revocation is performed, we’ll need to try it out for ourselves by loading a trustlet from an old firmware version into a more recent version.

To do so, we’ll need to gain some insight into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user-mode infrastructure provided by Trustonic. Let’s follow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 execution flow through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process of loading a trustlet - starting at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Normal World” and ending in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Secure World”’s TEE. Doing so will help us figure out which user-mode components we’ll need to interact with in order to load our own trustlet.

When a privileged user-mode process wishes to load a trusted application, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y do so by sending a request to a special daemon provided by Trustonic - “mcDriverDaemon”. This daemon allows clients to issue requests to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE (which are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n routed to Trustonic’s TEE driver). One such command can be used to load a trustlet into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE.

The daemon may load trustlets from one of two paths - eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system partition ("/system/app/mcRegistry"), or from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data partition ("/data/app/mcRegistry"). Since in our case we would like to avoid modifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system partition, we will simply place our binary in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latter path (which has an SELinux context of “apk_data_file”).

While cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 load request itself issued to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 daemon specifies cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 UUID of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet to be loaded, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 daemon only uses cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 UUID to locate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 binary, but does not ensure that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 given UUID matches cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one encoded in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet's header. Therefore, it’s possible to load any trustlet (regardless of UUID) by placing a binary with an arbitrary UUID (e.g., 07050501000000000000000000000020) in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data partition's registry directory, and subsequently sending a load request with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same UUID to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 daemon.
mcdriverdaemon.png

Lastly, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 communication with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 daemon is done via a UNIX domain socket. The socket has an SELinux context which limits cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of processes that can connect to it. Nonecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365less, much like in Qualcomm’s case, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 list of such processes seems to include cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 majority of privileged processes running on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system. Indeed, a very partial list of which includes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DRM server, system server, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 volume daemon, mediaserver and indeed any system application (you can find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 full list in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue tracker).

From cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n on, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 daemon simply contacts Trustonic’s driver and issues a specific set of ioctls which cause it to pass on request to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE. It should be noted that access to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 driver is also available to quite a wide range of processes (once again, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 full list can be seen in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue tracker).

Now that we’re sufficiently informed about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 loading process, we can go ahead and attempt to load an old trustlet. Let’s simply take an old version of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “fingerprint” trustlet and place it into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 registry directory under cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data partition. After issuing a load request to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 daemon and following cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dmesg output, we are greeted with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following result:

Screenshot from 2017-07-14 16:53:54.png

There we have it -- cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet has been successfully loaded into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE, confirming our suspicions!

After contacting Samsung regarding this issue, we’ve received cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following official response:

Latest Trustonic kinibi 400 family now supports rollback prevention feature for trustlets and this is fully supported since Galaxy S8/S8+ devices”

Indeed, it appears that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue has been addressed in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 newest version on Trustonic’s TEE - Kinibi 400. Simply searching for relevant strings in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE OS binary provided in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Galaxy S8’s firmware reveals some possible hints as to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 underlying implementation:

Screenshot from 2017-07-13 19:05:13.png

Based on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se strings alone, it appears that newer devices utilise a replay protected memory block (RPMB) in order to prevent old trustlets from being rolled back. As cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 implementation is proprietary, more research is needed in order to determine how this feature is implemented.

With regards to Samsung devices - although revocation appears to be supported in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Galaxy S8 and S8 Plus, all ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r Exynos-based devices remain vulnerable to this issue. In fact, in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next part we’ll write an exploit for a TEE vulnerability. As it happens, this same vulnerability is present in several different devices, including cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Galaxy S7 Edge and Galaxy S6.

Without specialised hardware used to store cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 version counter or some ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r identifier which can be utilised to prevent rollback, it seems like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is not much that can be done to address cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue in older devices. Nonecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365less, as we have no visibility into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 actual security components on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SoC, it is not clear whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r a fix is indeed not possible. Perhaps ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r hardware components could be co-opted to implement some form of revocation prevention. We remain hopeful that a stop-gap mitigation may be implemented in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 future.

Deciding On A Target


To make matters more interesting, let’s try and identify an “old” vulnerable trustlet (one which has already been “patched” in previous versions). Once we find such a trustlet, we could simply insert it into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 registry and load it into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE. As it happens, finding such trustlets is racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r straightforward - all we have to do is compare cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlets from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most recent firmware version with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ones in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first version released for a specific device -- if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re have been any security-relevant fixes, we should be able to track cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m down.

In addition, we may also be able to use vulnerable trustlets from a different device. This would succeed only if both devices share cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same “trusted” public key hash embedded in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE OS. To investigate whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r such scenarios exist, I’ve written anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r script which extracts cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 modulus from each trustlet binary, and group togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r different firmware versions and devices that share cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same signing key. After running this script it appears that both cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Galaxy S7 Edge (G935F) and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Galaxy S7 (G930F) use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same signing key. As a result, attackers can load trustlets from eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r device into 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 (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore expanding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 list of possible vulnerable trustlets that can be leveraged to attack cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE).

After comparing a few trusted applications against cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir older versions, it is immediately evident that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s a substantial number of security-relevant fixes. For example, a cursory comparison between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two versions of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “CCM” trustlet (FFFFFFFF000000000000000000000012), revealed four added bound-checks which appear to be security-relevant.

Screenshot from 2017-07-14 13:45:48.png


Alternately, we can draw upon previous research. Last year, while doing some cursory research into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trusted applications available on Samsung’s Exynos devices, I discovered a couple of trivial vulnerabilities in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “OTP” trustlet running under that platform. These vulnerabilities have since been “fixed”, but as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlets are not revoked, we can still freely exploit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m.

In fact, let’s do just that.

Writing A Quick Exploit


We’ve already determined that old trustlets can be freely loaded into Kinibi TEE (prior to version 400). To demonstrate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 severity of this issue, we’ll exploit one of two vulnerabilities I’ve discovered in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OTP trustlet late last year. Although cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability has been “patched”, attackers can simply follow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 steps above to load cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 old version of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE and exploit it freely.  

The issue we’re going to exploit is a simple stack-overflow. You might rightly assume that a stack overflow would be mitigated against by modern exploit mitigations. However, looking at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 binary it appears that no such mitigation is present! As we’ll see later on, this isn’t cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only mitigation currently missing from Kinibi.

Getting back to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue at hand, let’s start by understanding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 primitive at our disposal. The OTP trustlet allows users to generate OTP tokens using embedded keys that are “bound” to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone application. Like most ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r trusted applications, its code generally consists of a simple loop which waits for notifications from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE OS informing it of an incoming command.

Once a command is issued by a user in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Normal World”, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE OS notifies cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trusted application, which subsequently processes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 incoming data using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “process_cmd” function. Reversing this function we can see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet supports many different commands. Each command is assigned a 32-bit “command ID”, which is placed at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 beginning of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user’s input buffer.

Following cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se commands, it is quickly apparent that many cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m use a common utility function, “otp_unwrap”, in order to take a user-provided OTP token and decrypt it using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE’s TrustZone-bound unwrapping mechanism

This function receives several arguments, including 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 buffer to be unwrapped. However, it appears that in most call-sites, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length argument is taken from a user-controlled portion of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 input buffer, with no validation whatsoever. As cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer is first copied into a stack-allocated buffer, this allows us to simply overwrite cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack frame with controlled content. To illustrate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue, let’s take a look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 placement of items in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer for a valid unwrap command, versus cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir location on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack when copied by “otp_unwrap”:

stack_vs_input.png

As we’ve mentioned, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Token Length” field is not validated and is entirely attacker-controlled. Supplying an arbitrarily large value will cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore result in a stack overflow. All that’s left now is to decide on a stack alignment using which we can overwrite cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 return address 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 stack frame and hijack cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 control flow. For cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sake of convenience, let’s simply return directly from “otp_unwrap” to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 main processing function - “process_cmd”. To do so, we’ll overwrite all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack frames in-between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two functions.

As an added bonus, this allows us to utilise cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack space available between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two stack frames for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROP of our choice. Choosing to be conservative once again, we’ll elect to write a ROP chain that simply prepares cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 arguments for a function, executes it, and returns cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 return value back to “process_cmd”. That way, we gain a powerful “execute-function-in-TEE” primitive, allowing us to effectively run arbitrary code within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE. Any read or write operations can be delegated to read and write gadgets, respectively - allowing us to interact with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE’s address space. As for interactions with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE OS itself (such as system calls), we can directly invoke any function in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trusted application’s address space as if it were our own, using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned “execution-function” primitive.

Lastly, it’s worth mentioning that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack frames in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trusted application are huge. In fact, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y’re so big that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s no need for a stack pivot in order to fit our ROP chain in memory (which is just as well, as a short search for one yielded no obvious results). Instead, we can simply store our chain on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack frames leading from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerable function all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way up to “process_cmd”.

Part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reason for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exorbitantly large stack frames is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that most trusted applications do not initialise or use a heap for dynamic memory allocation. Instead, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y rely solely on global data structures for stateful storage, and on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 large stack for intermediate processing. Using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack in such a way increases cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 odds of overflows occurring on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack (racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 non-existent heap). Recall that as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s no stack cookie present, this means that many such issues are trivially exploitable.

Once we’ve finished mapping out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack layout, we’re more-or-less ready to exploit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue. All that’s left is to build a stack frame which overwrites cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stored LR register to point at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 beginning of our ROP chain’s gadgets, followed by a sequence of ROP gadgets needed to prepare arguments and call a function. Once we’re done, we can simply fill 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 remaining space with POP-sleds (that is, “POP {PC}” gadgets), until we reach “process_cmd”’s stack frame. Since that last frame restores all non-scratch registers, we don’t have to worry about restoring state eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r.

stacko.png

You can find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 full exploit code here. Note that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code produces a position-independent binary blob which can be injected into a sufficiently privileged process, such as “system_server.

Security Mitigations


We’ve already seen how a relatively straightforward vulnerability can be exploited within Kinibi’s TEE. Surprisingly, it appeared that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re were few mitigations in place holding us back. This is no coincidence. In order to paint a more complete picture, let’s take a moment to assess cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security mitigations provided by each TEE. We’ll perform our analysis by executing code within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE and exploring it from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vantage point of a trustlet. To do so, we’ll leverage our previously written code-execution exploits for each platform. Namely, this means we’ll explore Kinibi version 310B as present on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Galaxy S7 Edge, and QSEE as present on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Nexus 6.

ASLR

Kinibi offers no form of ASLR. In fact, all trustlets are loaded into a fixed address (denoted in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MCLF header). Moreover, as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlets’ base address is quite low (0x1000), this raises cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 probability of offset-from-NULL dereference issues being exploitable.

Additionally, each trustlet is provided with a common “helper” library (“mcLib”). This library acts as a shim which provides trusted applications with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stubs needed to call each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 functions supported by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE’s standard libraries. It contains a wealth of code, including gadgets to call functions, gadgets that invoke cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE OS’s syscalls, perform message-passing and much more. And, unfortunately, this library is also mapped into a constant address in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 virtual address space of each trustlet (0x7D01000).

TEE VAS.png

Putting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se two facts togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, this means that any vulnerability found within a trustlet running under Trustonic’s TEE can cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore be exploited without requiring prior information about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address-space of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet (thus lowering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bar for remotely exploitable bugs).

So what about Qualcomm’s TEE? Well, QSEE does indeed provide a form of ASLR for all trustlets. However, it is far from ideal - in fact, instead of utilising cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire virtual address space, each trustlet’s VAS simply consists of a flat mapping of a small segment of physical memory into which it is loaded.

Indeed, all QSEE trustlets are loaded into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same small physically contiguous range of memory carved out of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device’s main memory. This region (referred to as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “secapp-region” in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device tree) is dedicated to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE, and protected against accesses from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Normal World” by utilising special security hardware on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SoC. Consequently, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 larger cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “secapp” region, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 less memory is available to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Normal World”.

The “secapp” region commonly spans around 100MB in size. Since, as we’ve noted before, QSEE trustlets VAS consists of a flat mapping, this means that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 amount of entropy offered by QSEE’s ASLR implementation is limited by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “secapp” region’s size. Therefore, while many devices can cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365oretically utilise a 64-bit virtual address space (allowing for high entropy ASLR), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ASLR enabled by QSEE is limited approximately 9 bits (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore with 355 guesses, an attacker would have a 50% chance of correctly guessing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 base address). This is furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r aided by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that whenever an illegal access occurs within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE OS simply crashes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet, allowing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker to reload it and attempt to guess cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 base address once again.

QSEE VAS.png

Stack Cookies and Guard Pages


What about ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r exploit mitigations? Well, one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most common mitigations is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 inclusion of a stack cookie - a unique value which can be used to detect instances of stack smashing and abort cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 program’s execution.

Analysing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlets present on Samsung’s devices and running under Trustonic’s TEE reveals that no such protection is present. As such, every stack buffer overflow in a trusted application can be trivially exploited by an attacker (as we’ve seen above) to gain code execution. This is in contrast to QSEE, whose trustlets include randomised pointer-sized stack cookies.

Lastly, what about protecting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mutable data segments available to each trustlet - such as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack, heap and globals? Modern operating systems tend to protect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se regions by delimiting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m with “guard pages”, thus preventing attackers from using an overflow in one structure in order to corrupt 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.

However, Trustonic’s TEE seems to carve both cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 globals and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet’s data segment, without providing any guard page inbetween. Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack is located 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 data segments, and global data structures are placed before it. This layout makes it ideal for an attacker to eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r overflow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 globals, or vice-versa.

Identically, Qualcomm’s TEE does not provide guard pages between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 globals, heap and stack - cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are all simply carved out of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 single data segment provided to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet. As a result, overflows in any of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se data structures can be used to target any of 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ý bet365rs.

guard pages (1).png

TEEs As A High Value Target


At this point, it is probably clear enough that compromising TEEs on Android seems like a relatively straightforward task. Since both TEEs lag behind in term of exploit mitigations, it appears that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bar for exploitability of vulnerabilities, once found, is racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r low.

Additionally, as more and more trusted applications are added, finding a vulnerability in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first place is becoming an increasingly straightforward task. Indeed, simply listing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of trusted applications on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Galaxy S8, we can see that it contains no fewer than 30 trustlets!

Screenshot from 2017-07-14 10:36:29.png

Be that as it may, one might rightly wonder what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 possible implications of code-execution within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE are. After all, if compromising cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE does not assist attackers in any way, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re may be no reason to furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r secure it.

To answer this question, we’ll see how compromising cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE can be incredibly powerful tool, allowing attackers to fully subvert cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system in many cases.

In Qualcomm’s case, one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system-calls provided by QSEE allows any trustlet to map in physical memory belonging to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Normal World” as it pleases. As such, this means any compromise of a QSEE trustlet automatically implies a full compromise of Android as well. In fact, such an attack has been demonstrated in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past. Once code execution is gained in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 context of a trustlet, it can scan cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 physical address space for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Linux Kernel, and once found can patch it in memory to introduce a backdoor.

And what of Trustonic’s TEE? Unlike QSEE’s model, trustlets are unable to map-in and modify physical memory. In fact, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security model used by Trustonic ensures that trustlets aren’t capable of doing much at all. Instead, in order to perform any meaningful operation, trustlets must send a request to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 appropriate “driver”. This design is conducive to security, as it essentially forces attackers to eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r compromise cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 drivers cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves, or find a way to leverage cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir provided APIs for nefarious means. Moreover, as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re aren’t as many drivers as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are trustlets, it would appear that auditing all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 drivers in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE is indeed feasible.

Although trustlets aren’t granted different sets of “capabilities”, drivers can distinguish between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trusted applications requesting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir services by using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 caller’s UUID. Essentially, well-written drivers can verify that whichever application consumes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir services is contained within a “whitelist”, thus minimising cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exposed attack surface.

Sensitive operations, such as mapping-in and modifying physical memory are indeed unavailable to trusted applications. They are, however, available to any driver. As a result, driver authors must be extremely cautious, lest cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y unintentionally provide a service which can be abused by a trustlet.

Scanning through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 drivers provided on Samsung’s Exynos devices, we can see a variety of standard drivers provided by Trustonic, such as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cryptographic driver, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Trusted UI” driver, and more. However, among cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se drivers are a few additional drivers authored by Samsung cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves.

One such example is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TIMA driver (UUID FFFFFFFFD0000000000000000000000A), which is used to facilitate Samsung’s TrustZone-based Integrity Measurement Architecture. In short, a component of TIMA performs periodic scans of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel’s memory in order to ensure that it is not tampered with.

Samsung has elected to split TIMA’s functionality in two; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 driver mentioned above provides cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ability to map in physical memory, while an accompanying trusted application consumes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se services in order to perform cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 integrity measurements cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves. In any case, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end result is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 driver provides APIs to both read and write physical memory - a capability which is normally reserved for drivers alone.

Since this functionality could be leveraged by attackers, Samsung has rightly decided to enforce a UUID whitelist in order to prevent access by arbitrary trusted applications. Reversing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 driver’s code, we can see that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whitelist of allowed trusted applications is embedded within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 driver. Quite surprisingly, however, it is no short list!

Screenshot from 2017-07-14 11:13:50.png

Perhaps cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 take-away here is that having a robust security architecture isn’t helpful unless it is enforced across-cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365-board. Adding drivers exposing potentially sensitive operations to a large number of trustlets negates cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se efforts.

Of course, apart from compromising cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Normal World”, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE itself holds many pieces of sensitive information which should remain firmly beyond an attacker’s reach. This includes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 KeyMaster keys (used for Android’s full disk encryption scheme), DRM content decryption keys (including Widevine) and biometric identifiers.

Afterword


While cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 motivation behind cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 inclusion of TEEs in mobile devices is positive, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current implementations are still lacking in many regards. The introduction of new features and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ever increasing number of trustlets result in a dangerous expansion of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TCB. This fact, coupled with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current lack of exploit mitigations in comparison to those offered by modern operating systems, make TEEs a prime target for exploitation.

We’ve also seen that many devices lack support for revocation of trusted applications, or simply fail to do so in practice. As long as this remains cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case, flaws in TEEs will be that much more valuable to attackers, as vulnerabilities, once found, compromise cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device’s TEE indefinitely.

Lastly, since in many cases TEEs enjoy a privileged vantage point, compromising cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TEE may compromise not only cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 confidentiality of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 information processed within it, but also 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 entire device.


9 comments:

  1. "Since we cannot easily query cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 status of eFuses on a large scale, it remains unknown what proportion of devices have indeed enabled this feature."

    Actually, if you have access to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 factory images, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 eFUSE configuration should be stored inside "sec" qcom partition which contains cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 eFUSE configuration.
    Indeed, OEMs might provide a noop sec.dat instead of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 real one, but that'd be a bit weird.

    ReplyDelete
  2. Hi Pierre,

    Thank you for reading. Are you are referring to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "sec" partition *on* cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device? If so, we do not have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 physical devices corresponding to all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware images (in fact, we only have a fraction of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m), nor do we have root access to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m all, so acquiring cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "sec" partition dynamically would take some effort. In any case, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuse locations vary between SoCs, so even if we were to extract cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir contents, we would still need to manually find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuse address for each SoC.

    All cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best,
    Gal.

    ReplyDelete
  3. It's questionable to what extent many of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se things are overly useful without additional functionality like trusted outputs/display/audio mechanisms. Intel has failed to tie related functionality togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir desktop offerings. It's interesting that after a couple of decades, essentially people started realizing that 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 rings of operation could be useful in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same way that trusted operating systems used cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m decades ago and sad that most innovation at this point essentially means re-inventing OS/400 and Wang style security metrics or similar, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cloud is essentially cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mainframe/greenscreen architecture, et cetera.

    ReplyDelete
  4. Love cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se write ups, thanks! Great read!

    ReplyDelete
  5. Great article we need to continue to push cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 evolution of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se platforms and agree we need to not have an explosion of trustlets. We have integrated attestation into our trustlet to assure that certain transaction will only advance if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 state of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trustlet has not changed. It is a measured environment so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are still risks in what does cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 measuring but it will fully prevent roll back on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 older platforms.

    ReplyDelete
  6. Kinibi has supported rollback prevention of an OEM’s trusted applications from its first version, by enabling cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OEM to change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signing key in use (and hence disallow install of previously signed applications). Kinibi also supports ‘over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 air’ install of 3rd party trusted applications, using separate signing keys and a version field to prevent rollback.

    Richard Hayton
    CTO Trustonic

    ReplyDelete
  7. Great JOB.BTW.Which ROM version match cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 KnibiOTP POC?

    ReplyDelete
  8. Excellent research on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 - still existing - inability of ARM/Android to offer a sufficient basis for (Intel/Windows equivalent) data security for mobiles and tablets!

    I think cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 KeyMaster extraction problem will never be completely solved, if ARM doens't change its chip architecture.

    Nevercá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365less I have an important question:

    When someone has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 decrypted KeyMaster, he would still have to brute-force cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 AES-128 encrypted user password, so wouldn't a strong passphrase (i.e. 20+ characters) give us cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same protection as e.g. a AES-128 and Truescrypt/Verascrypt encrypted drive on an Intel/Windows system, making cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole Android security discussion superfluous?

    Thanks
    Tim

    ReplyDelete
  9. Surely that is hex offset not binary in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Trustonic diagram?

    ReplyDelete