10/08/2015

Full TrustZone exploit for MSM8974

In this blog post, we'll cover cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 complete process of exploiting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone vulnerability described in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous post. If you haven't read it already, please do!

Responsible Disclosure

First of all, I'd like to point out that I've responsibly disclosed this vulnerability to Qualcomm, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue has already been fixed (see "Timeline" below).

I'd also like to take this opportunity to point out that Qualcomm did an amazing job in both responding to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 disclosure amazingly fast and by being very keen to fix cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue as soon as possible.

They've also gifted me a brand new (at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time) Moto X 2014, which will be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subject of many posts later on (going much more in depth into TrustZone's architecture and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r security components on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device).


Patient Zero

While developing this exploit, I only had my trusty (personal) Nexus 5 device to work with. This means that all memory addresses and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r specific information written below is taken from that device.

In case anyone wants to recreate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exact research described below, or for any ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r reason, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exact version of my device at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time was:

google/hammerhead/hammerhead:4.4.4/KTU84P/1227136:user/release-keys

With that out of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way, let's get right to it!

The vulnerability primitive

If you read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous post, you already know that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability allows cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker to cause cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel to write a zero DWORD to any address in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel's virtual address space.

Zero write primitives are, drawing on personal experience, not very fun to work with. They are generally quite limited, and don't always lead to exploitable conditions. In order to create a robust exploit using such a primitive, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first course of action would be to attempt to leverage this weak primitive into a stronger one.

Crafting an arbitrary write primitive

Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel is loaded at a known physical address, this means that all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 addresses are already known in advance, and do not need to be discovered upon execution.

However, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 internal data structures and state of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel are largely unknown and subject to change due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 many different processes interacting with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel (from external interrupts, to "Secure World" applications, etc.).

Moreover, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone code segments are mapped with read-only access permissions, and are verified during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 secure boot process. This means that once TrustZone's code is loaded into memory, it cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365oretically cannot (and should not) be subject to any change.

TrustZone memory mappings and permissions

So that said - how can we leverage a zero write primitive to enable full code execution?

We could try and edit any modifiable data (such as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack or perhaps globals) within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel, which might allow us to create a stepping stone for a better primitive.

As we've mentioned in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous blog post, normally, when an SCM command is called, any argument which is a pointer to memory, is validated by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel. The validation is done in order to make sure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 physical address is within an "allowed" range, and isn't for example, within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel's used memory ranges.

These validations sound like a prime candidate for us to look into, since if we were able to disable cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir operation, we'd be able to leverage ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r SCM calls in order to create different kinds of primitives.

TrustZone memory validation

Let's start by giving cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory validation function a name - from now on, we'll call it "tzbsp_validate_memory".

Here's a decompilation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function:

The function actually calls two internal functions to perform cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 validation, which we'll call "is_disallowed_range" and "is_allowed_range", respectively.

is_disallowed_range


As you can see, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function actually uses cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first 12 bits of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 given address in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following way:
  • The upper 7 bits are used as an index into a table, containing 128 values, each 32-bit wide.
  • The lower 5 bits are used as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bit index to be checked within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 32-bit entry which is present at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previously indexed location.


In ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r words, for each 1MB chunk that intersects cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 region of memory to be validated, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re exists a bit in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned table which is used to denote whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r or not this region of data is "disallowed" or not. If any chunk within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 given region is disallowed, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function returns a value indicating as such. Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function treats cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 given memory region as valid.

is_allowed_range


Although a little longer, this function is also quite simple. Essentially, it simply goes over a static array containing entries with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following structure:



The function iterates over each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entries in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 table which resides at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 given memory address, stopping when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "end_marker" field for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current entry is 0xFFFFFFFF.

Each range specified by such an entry, is validated against to make sure that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory range is allowed. However, as evidenced in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 decompilation above, entries in which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "flags" fields' second bit is set, are skipped!


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

Now that we understand how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 validation functions operate, let's see how we can use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 zero write primitive in order to disable cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir operation.

First, as described above, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "is_disallowed_range" function uses a table of 32-bit entries, where each bit corresponds to a 1MB block of memory. Bits which are set to one represent disallowed blocks, and zero bits represent allowed blocks.

This means that we can easily neutralise this function by simply using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 zero write primitive to set all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entries in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 table to zero. In doing so, all blocks of memory will now be marked as allowed.

Moving on to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next function; "is_allowed_range". This one is a little tricky - as mentioned above, blocks in which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second bit in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 flags field is set, are validated against cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 given address. However, for each block in which this bit is not set, no validation is performed, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 block is skipped over.

Since in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 block table present in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device, only cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first range is relevant to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory ranges which reside within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel's memory range, we only need to zero out this field. Doing so will cause it to be skipped over by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 validation function, and, as a result, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 validation function will accept memory addresses within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel as valid.

Back to crafting a write primitive

So now that we've gotten rid of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bounds check functions, we can freely supply any
memory address as an argument for an SCM call, and it will be operated upon without any obstacle.

But are we any closer to creating a write primitive? Ideally, had cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re been an SCM call where we could control a chunk of data which is written to a controlled location, that would have sufficed.

Unfortunately, after going over all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SCM calls, it appears that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are no candidates which match this description.

Nevercá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365less, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's no need to worry! What cannot be achieved with a single SCM call, may be possible to achieve by stringing a few calls togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. Logically, we can split cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 creation of an arbitrary write primitive into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following steps:
  • Create an uncontrolled piece of data at a controlled location
  • Control cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 created piece of data so that it actually contains cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wanted content
  • Copy cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 created data to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 target location
Create

Although none of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SCM calls seem to be good candidates in order to create a controlled piece of data, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is one call which can be used to create an uncontrolled piece of data at a controlled location - "tzbsp_prng_getdata_syscall".

This function, as its name implies, can be used to generate a buffer of random bytes at a given location. It is generally used by Android is order to harness cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hardware PRNG which is present in Snapdragon SoCs.

In any case, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SCM call receives two arguments; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 output address, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 output length (in bytes).

On cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one hand, this is great - if we (somewhat) trust cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hardware RNG, we can be pretty sure that for each byte we generate using this call, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire range of byte values is possible as an output. On cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r hand, this means that we have no control whatsoever on what data is actually going to be generated.

Control

Even though any output is possible when using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PRNG, perhaps cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is some way in which we could be able to verify that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 generated data is actually cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data that we wish to write.

In order to do so, let's think of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following game - imagine you have a slot machine with four slots, each with 256 possible values. Each time you pull cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lever, all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 slots rotate simultaneously, and a random output is presented. How many times would you need to pull cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lever in order for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 outcome to perfectly match a value that you picked beforehand? Well, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are 4294967296 (2^32) possible values, so each time you pull cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lever, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's a chance of about 10^(-10) that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 result would match your wanted outcome. Sounds like you're going to be here for a while...


But what if you could cheat? For example, what if you had a different lever for each slot? That way you can only change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value of a single slot with each pull. This means that now for each time cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lever is pulled, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's a chance of 1/256 that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 outcome will match cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 desired value for that slot.


Sounds like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game is much easier now, right? But how much easier? In probability cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ory this kind of distribution for a single "game" is called a Bernoulli Distribution, and is actually just a fancy way of saying that each experiment has a set probability of success, denoted p, and all ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r outcomes are marked all failures, and have a probability of 1-p of occurring.

Assuming we would like a 90% chance of success, it turns out that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 in original version of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game we would require approximately 10^8 attempts (!), but if we cheat, instead, we would only require approximately 590 attempts per slot, which is several orders of magnitude less.

So have you figured out how this all relates to our write primitive yet? Here it goes:

First, we need to find an SCM call which returns a value from a writeable memory location within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel's memory, to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 caller.

There are many such functions. One such candidate is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "tzbsp_fver_get_version" call. This function can be used by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "Normal World" in order to retrieve internal version numbers of different TrustZone components. It does so by receiving an integer denoting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 component whose version should be retrieved, and an address to which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 version code should be written. Then, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function simply goes over a static array of pairs containing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 component ID, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 version code. When a component with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 given ID is found, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 version code is written to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 output address.


tzbsp_fver_get_version internal array

Now, using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "tzbsp_prng_getdata_syscall" function, we can start manipulating any version code's value, one byte at a time. In order to know 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 byte that we've generated at each iteration, we can simply call cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned SCM, while passing in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 component ID matching cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 component whose version code we are modifying, and supplying a return address which points to a readable (that is, not in TrustZone) memory location.

We can repeat cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se first two steps until we are satisfied with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 generated byte, before moving on to generate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next byte. This means that after a few iterations, we can be certain that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value of a specific version code matches our wanted DWORD.
 
Copy 

Finally, we would like to write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 generated value to a controlled location. Luckily, this step is pretty straight-forward. All we need to do is simply call cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "tzbsp_fver_get_version" SCM call, but now we can simply supply cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 target address as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 return address argument. This will cause cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function to write our generated DWORD to a controlled location, thus completing our write gadget.

Phew... What now?

From here on, things get a little easier. First, although we have a write primitive, it is still quite cumbersome to use. Perhaps it would be a little easier if we were able to create a simpler gadget using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous one.

We can do this by creating our own SCM call, which is simply a write-what-where gadget. This may sound tricky, but it's actually pretty straight-forward.

In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous blog post, we mentioned that all SCM calls are called indirectly via a large array containing, among ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r things, pointers to each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SCM calls (along with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of arguments cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are provided, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir name, etc.).

This means that we can use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 write gadget we created previously in order to change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address of some SCM call which we deem to be "unimportant", to an address at which a write gadget already exists. Quickly going over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel's code reveals that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are many such gadgets. Here's one example of such a gadget:


This piece of code will simply write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value in R0 to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address in R1, and return. Great.

Finally, it might also be handy to be able to read any memory location which is within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel's virtual address space. This can be achieved by creating a read gadget, using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exact same method described above, in place of anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r "unimportant" SCM call. This gadget is actually quite a bit rarer than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 write gadget. However, one such gadget was found within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel:


This gadget returns cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value read from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address in R0, with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 offset R1. Awesome.

Writing new code

At this stage, we have full read-write access to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel's memory. What we don't yet have, is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ability to execute arbitrary code within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel. Of course, one might argue cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 we could find different gadgets within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel, and string those togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r to create any wanted effect. But this is quite tiring if done manually (we would need to find quite a few gadgets), and quite difficult to do automatically.

There are a few possible way to tackle this problem.

One possible angle of approach might be to write a piece of code in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "Normal World", and branch to it from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "Secure World". This sounds like an easy enough approach, but is actually much easier said than done.

As mentioned in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first blog post, when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 processor in operating in secure mode, meaning cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NS (Non-Secure) bit in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SCR (Secure Configuration Register) is turned off, it can only execute pages which are marked as "secure" in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 translation table used by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MMU (that is, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NS bit is off).



This means that in order to execute our code chunk residing in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "Normal World" we would first have to modify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel's translation table in order to map cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address in which we've written our piece of code as secure.

While all this is possible, it is a little tiresome.

A different approach might be to write new code within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel's code segments, or overwrite existing code. This also has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 advantage of allowing us to modify existing behaviour in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel, which can also come in handy later on.

However, upon first glance this doesn't sound easier to accomplish than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous approach. After all, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel's code segments are mapped as read-only, and are certainly not writeable.

However, this is only a minor setback! This can actually be solved without modifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 translation table after all, by using a convenient feature of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ARM MMU called "domains".

In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ARM translation table, each entry has a field which lists its permissions, as well as a field denoting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "domain" to which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 translation belongs. There are 16 domains, and each translation belongs to a single one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m.

Within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ARM MMU, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is a register called cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DACR (Domain Access Control Register). This 32-bit register has 16 pairs of bits, one pair for each domain, which are used to specify whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r faults for read access, write access, both, or neicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, should be generated for translations of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 given domain.


Whenever cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 processor attempts to access a given memory address, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MMU first checks if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 access is possible using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 access permissions of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 given translation for that address. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 access is allowed, no fault is generated.

Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MMU checks if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bits corresponding to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 given domain in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DACR are set. If so, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fault is suppressed and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 access is allowed.

This means that simply setting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DACR's value to 0xFFFFFFFF will actually cause cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MMU to enable access to any mapped memory address, for both read and write access, without generating a fault (and more importantly, without having to modify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 translation table).

But how can we set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DACR? Apparently, during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel's initialization, it also explicitly sets cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DACRs value to a predetermined value (0x55555555), like so:


However, we can simply branch to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next opcode in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initialization function, while supplying our own value in R0, thus causing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DACR to be set to our controlled value.

Now that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DACR is set, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 path is all clear - we can simply write or overwrite code within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel.

In order to make things a little easier (and less disruptive), it's probably better to write code at a location which is unused by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel. One such candidate is a "code cave".

Code caves are simply areas (typically at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end allocated memory regions) which are unused (i.e., do not contain code), but are nonecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365less mapped and valid. They are usually caused by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that memory mappings have a granularity, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore quite frequently cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is internal fragmentation at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end of a mapped segment.

Within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are several such code caves, which enable us to write small pieces of code within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m and execute cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, with minimal hassle.

Putting it all togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r

So this exploit was a little complex. Here's a run-down of  all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stages we had to complete:
  • Disable cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory validation functions using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 zero write primitive
  • Craft a wanted DWORD at a controlled location using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone PRNG
  • Verify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 crafted DWORD by reading cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding version code
  • Write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 crafted version code to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 location of a function pointer to an existing SCM call (by doing so creating a fast write gadget)
  • Use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fast write gadget to create a read gadget
  • Use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fast write gadget to write a function pointer to a gadget which enables us to modify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DACR
  • Modify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DACR to be fully enabled (0xFFFFFFFF)
  • Write code to a code cave within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel
  • Execute! :)

The Code

I've written an exploit for this vulnerability, including all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 needed symbols for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Nexus 5 (with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fingerprint stated beforehand).

First of all, in order to enable cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit to send cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 needed crafted SCM calls to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel, I've created a patched version of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 msm-hammerhead kernel which adds such functionality and exposes it to user-space Android.

I've chosen to do this by adding some new IOCTLs to an existing driver, QSEECOM (mentioned in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first blog post), which is a Qualcomm driver used to interface with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel. These IOCTLs enable cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 caller to send a "raw" SCM call (eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r regular, or atomic) to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel, containing any arbitrary data.

You can find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 needed kernel modifications here.

For those of you using a Nexus 5 device, I personally recommend following Marcin Jabrzyk's great tutorial - here (it's a full tutorial describing how to compile and boot a custom kernel without flashing it to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device).

After booting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device with a modified kernel, you'll need a user-space application which can use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 newly added IOCTLs in order to send SCMs to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel.

I've written such an application which you can get it here.

Finally, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit itself is written in python. It uses cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user-space application to send SCM calls via cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 custom kernel directly to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel, and allows execution of any arbitrary code within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel.

You can find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 full exploit's code here.

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

Using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit is pretty straight forward. Here's what you have to do:
  • Boot cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 modified kernel (see Marcin's tutorial)
  • Compile cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 FuzzZone binary and place it under /data/local/tmp/
  • Write any ARM code within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shellcode.S file
  • Execute cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 build_shellcode.sh script in order to create a shellcode binary
  • Execute exploit.py to run your code within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrustZone kernel

Affected Devices

At cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time of disclosure, this vulnerability affected all devices with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MSM8974 SoC. I created a script to statically check cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROMs of many such devices before reporting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability, and found that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following devices were vulnerable:

Note: This vulnerability has since been fixed by Qualcomm, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore should not affect updated devices currently. Also, please note that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following is not an exhaustive list, by any measure. It's simply cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 result of my static analysis at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time.

 -Samsung Galaxy S5
 -Samsung Galaxy S5
 -Samsung Galaxy Note III
 -Samsung Galaxy S4 
 -Samsung Galaxy Tab Pro 10.1
 -Samsung Galaxy Note Pro 12.2
 -HTC One
 -LG G3
 -LG G2
 -LG G Flex 
 -Sony Xperia Z3 Compact 
 -Sony Xperia Z2 
 -Sony Xperia Z Ultra 
 -Samsung Galaxy S5 Active
 -Samsung Galaxy S5 TD-LTE
 -Samsung Galaxy S5 Sport
 -HTC One (E8)
 -Oneplus One
 -Acer Liquid S2
 -Asus PadFone Infinity
 -Gionee ELIFE E7
 -Sony Xperia Z1 Compact
 -Sony Xperia Z1s
 -ZTE Nubia Z5s
 -Sharp Aquos Xx 302SH
 -Sharp Aquos Xx mini 303SH
 -LG G Pro 2
 -Samsung Galaxy J
 -Samsung Galaxy Note 10.1 2014 Edition (LTE variant)
 -Samsung Galaxy Note 3 (LTE variant)
 -Pantech Vega Secret UP
 -Pantech Vega Secret Note
 -Pantech Vega LTE-A
 -LG Optimus Vu 3
 -Lenovo Vibe Z LTE
 -Samsung Galaxy Tab Pro 8.4
 -Samsung Galaxy Round
 -ZTE Grand S II LTE
 -Samsung Galaxy Tab S 8.4 LTE
 -Samsung Galaxy Tab S 10.5 LTE
 -Samsung Galaxy Tab Pro 10.1 LTE
 -Oppo Find 7 Qing Zhuang Ban
 -Vivo Xshoot Elite
 -IUNI U3
 -Hisense X1
 -Hisense X9T Pantech Vega Iron 2 (A910)
 -Vivo Xplay 3S
 -ZTE Nubia Z5S LTE
 -Sony Xperia Z2 Tablet (LTE variant)
 -Oppo Find 7a International Edition
 -Sharp Aquos Xx304SH
 -Sony Xperia ZL2 SOL25
 -Sony Xperia Z2a
 -Coolpad 8971
 -Sharp Aquos Zeta SH-04F
 -Asus PadFone S
 -Lenovo K920 TD-LTE (China Mobile version)
 -Gionee ELIFE E7L
 -Oppo Find 7
 -ZTE Nubia X6 TD-LTE 128 GB
 -Vivo Xshot Ultimate
 -LG Isai FL
 -ZTE Nubia Z7
 -ZTE Nubia Z7 Max
 -Xiaomi Mi 4
 -InFocus M810

Timeline
  • 19.09.14 - Vulnerability disclosed
  • 19.09.14 - Initial response from QC
  • 22.09.14 - Issue confirmed by QC
  • 01.10.14 - QC issues notice to customers
  • 16.10.14 - QC issues notice to carriers, request for 14 days of embargo
  • 30.10.14 - Embargo expires
I'd like to also point out that after reporting this issue to Qualcomm, I was informed that it has already been internally identified by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m prior to my disclosure. However, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se kinds of issues require quite a long period of time in order to push a fix, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time of my research, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fix had not yet been deployed (at least, not to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best of my knowledge).

Last Words

I'd really like to hear some feedback from you, so please leave a comment below! Feel free to ask about anything.

45 comments:

  1. Great post, sightly hard to understand as i'm spanish but it denotes a deep knowledge of exploting. Contrats and keep on it!

    P.d. When releasing stagefright exploit? :P

    ReplyDelete
    Replies
    1. Thanks! Happy you enjoyed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 post.

      The stagefright exploits (I've found quite a few) are coming soon, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next post will be about a linux kernel exploit.

      Delete
  2. So by reading this (http://blog.azimuthsecurity.com/2013/04/unlocking-motorola-bootloader.html) and this post, to my understanding, if I just want to unlock cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bootloader I can do that without going in to so much hassle by simply overwriting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "golbal_flag" value by your zero write primitive right?
    By cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way can you publish anything you learned about qfuse structure on msm8974, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 script you wrote to check cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bootloader for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit?
    Great post. Learned to much since I'm still getting in to this bootloader stuff :)

    Ps. I wish you would've published this a week ago. I bought a amazon fire phone and upgraded to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new firmware last week. I'm sure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 old bootloader had cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 flow and new one doesn't :(

    ReplyDelete
    Replies
    1. I'm planning a much more detailed post about MSM8974 internals, but it'll have to wait a while since I want to first cover a few Android and Linux kernel vulnerabilities...

      Looking at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 post you linked to, it refers to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MSM8960 architecture. That version of Snapdragon had a massive documentation leak, that lead to a pretty wide understanding of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 QFuses structure. Unfortunately, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's been no such leak for MSM8974, so while some comparisons might be drawn between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's no guarantee that ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r things haven't changed. Since I only have my personal device, I'm not willing to blow QFuses until I'm 100% about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir purpose.

      I have done some research into unlocking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Moto X 2014 (which is an MSM8974 device), which I will definitely write about soon, but it's still incomplete.

      Anyway, glad you enjoyed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 post! Best of luck with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Fire phone :) Hope cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next TrustZone posts help.

      Delete
    2. Great.. Keep up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 good work. By cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 post I linked, he detects cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 QFuse by analysing aboot image. Not sure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same applies here though.

      Delete
  3. Hey,
    This was an interesting read for sure. You mentioned that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 S4 was vulnerable but when examining cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tz image for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 s4, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address don't match. I was wondering if you had figured out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 addresses for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 s4 as well. I gained a fair bit of knowledge reading cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 posts before and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 post following this post as well.

    Keep up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 great work!

    ReplyDelete
  4. 0x12 -> 0xC in your memory object struct

    ReplyDelete
  5. I thourougly enjoyed this article. i wish cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 apq8084 (droid turbo)were researched and exploited in this manner. Thank you for your wor and especially for posting so ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rs can learn from it.

    ReplyDelete
    Replies
    1. Thank you! As for APQ8084, wait three weeks, I have a surprise :)

      Delete
  6. AWESOME!!! sounds like Christmas will be good this year.

    ReplyDelete
  7. Why is responsible disclosure necessary here? From what I can tell, this exploit only enables cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 owner of a device to get full access to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device, which is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir right anyway. Why would you tell cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 manufacturer?

    ReplyDelete
    Replies
    1. Because this can also be used to extract credit card details, create a completely silent RAT, extract fingerprint information and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 list goes on...

      Delete
  8. laginimaineb also on MSM 8916 cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is a function called

    tz_service <0x3F802, aTzbsp_oem_svc, 0xF, 0x86500ECB, 1> ; "tzbsp_oem_svc"

    which doesnt check cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ranges and write 3 dwords to an arbitrary address

    int __fastcall tzbsp_oem_svc(int a1, int a2)
    {
    int v2; // r4@1

    v2 = a2;
    *(_DWORD *)a2 = 0xC;
    *(_DWORD *)(a2 + 4) = get_tzbsp_params(); =>returns 0x0F
    *(_DWORD *)(v2 + 8) = sub_865164FE(); =>returns 0x0
    return 0;
    }

    this can be used to neutralise range check. Contact me on hack3r2k@hack3r2k.com if interested

    ReplyDelete
    Replies
    1. Interesting! MSM8916 is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SoC in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 very cheap Moto E 2nd gen., right?

      https://wiki.cyanogenmod.org/w/Surnia_Info

      Delete
    2. Hi Daniel,

      Not sure for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Moto but still this function could be manufacturer related. The phone im researching is an Alcatel 5042

      Delete
    3. Thanks for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 great article.
      best article
      Great info
      Click here
      blog
      Amazing article
      View more info
      this article
      this article

      Delete
  9. Thanks laginimaineb, I write software in higher-level languages but have near to 0 knowledge about low-level. By reading you, I expect to reach a better understanding. Goal is reached for now :)

    The explaination path of your binary quest is very clear, and it's much appreciated.

    In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end, I wonder why cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DACR designs such a "fault disabling" feature?

    That feature looks like an obvious present made to attackers in order to abuse a runtime.

    Say that 1 of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DACR registers is entitled to a r/w access permission from a specific origin/caller/translation only: such a definition is a policy rule. If rule matches, instruction runs flawlessly. If it does not, instruction triggers a fault. I don't get why this extra power is given to dodge, to overlook a well-deserved system fault.

    ReplyDelete
    Replies
    1. Hi Tuyutu,

      Thanks for reading!

      From a systems-design perspective, I can think of quite a few situations where enabling memory domains would be a useful feature. Consider, for example, scenarios where different contexts share cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same translation tables. One common use-case where this would occur is a user-mode and kernel-mode context for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same task (e.g., on Linux). While cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory mappings for both contexts are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same, we may want to restrict access from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel-mode context, in order to prevent accidental cases in which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel may be tricked into accessing user-mode mappings inadvertently (such an SMAP). Alternately, you may want to restrict access to kernel mappings within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user's memory ranges, so that user-mode contexts cannot access it.

      That aside, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 feature itself should not be a security concern in it's own right. Recall that configuring cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DACR requires code execution in an elevated context to begin with. At that privilege level, you could just as well directly modify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 translation tables or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 translation table control registers - achieving cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same effect.

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

      Delete
  10. Mantap banget gan!!! artikelnya sangat bermanfaat banget..
    Jangan lupa kunjungi juga Blog saya dibawah ini
    Judi Ayam Online
    Agen Togel Online
    Judi Bola Online
    http://www.bolautama88.com
    http://www.pelangi4d.site
    http://www.cumiblogger.com/

    ReplyDelete
  11. In my opinion, people ought to simply invest in V-Bucks if you\\\'re a diehard Fortnite player with anyone show across many platforms. Fortnite V-Bucks gained in But cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 planet can cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore become invested in new threads into Battle Royale. salsaroc.com

    ReplyDelete
  12. Although, most of organizations use filtered routing devices, firewalls and intrusions identification systems to protect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir interests and money. But when we are speaking about web vulnerabilities, many of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se safety tips may be useless.There are not so much of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can open a particular part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Net available from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Internet. It may be very hard when a hacker owns a simple Web browser.

    ReplyDelete
  13. This comment has been removed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 author.

    ReplyDelete
  14. This is Very very nice article. Everyone should read. Thanks for sharing. Don't miss WORLD'S BEST CarGamesDownload

    ReplyDelete
  15. This is such an awesome asset, to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 point that you are giving and you give it away for nothing. I adore seeing blog that comprehend cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 benefit of giving a quality asset to free.jogos online 2019
    play Games friv
    school friv

    ReplyDelete
  16. Thank you so much for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wonderful website. Which made my day and got full information about Ac Market. Loved this website and recommended for all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 users.
    Ac Market
    Ac Market APK
    AcMarket

    ReplyDelete
  17. All cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time we are looking for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pinoy channel flix updates which we will be get online without getting any paid membership.

    ReplyDelete
  18. Wow Very Nice and informative post you can also watch
    Pinoy Tambayan Shows Philippine tv shows on our website,
    Pinoy ako,
    Pinoytv1, Pinoy Teleserye, Pinoy Tambayan,
    Pinoy Channel and free download here all videos.
    Pinoy Ako Tv, Pinoy Tv Replay, Pinoy Tambayan, Pinoy Tv Show,
    ABS-CBN Tv Show All HD Quality ,
    GMA Network Shows ,Full Episode Watch On PinoyTvShows.Our team at Pinoytvs.su care for our community and bring you daily fresh episodes of your favourite tv shows. You can enjoy your favourite shows, Pinoy Tambayan,
    Pinoy Teleserye and also

    Pinoy lambingan Shows online free in high quality.

    ReplyDelete
  19. Awesome blog. Thank you for sharing this valuable information.
    Canon printer error code b203

    ReplyDelete
  20. nice post you can visit our website for Indian Dramas online free in high quality.

    ReplyDelete
  21. https://crackedhome.com/clip-studio-paint-crack-all-torrent/
    Clip Studio Paint Crack is a useful place where you can easily find Activators, Patch, Full version software Free Download, License key, serial key, keygen, Activation Key and Torrents. Get all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se by easily just on a single click.

    ReplyDelete
  22. https://pcgameshere.com/pubg-free-download-full-pc-game/
    PUBG Free Download For Pc: online multiplayer action battle royale shooting Fighting Game. The PUBG Corporation published PUBG Pc Download worldwide.

    ReplyDelete
  23. Color print test page or black & white 720x960 is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 link which can print high quality printer test page

    ReplyDelete
  24. Viewmypaycheck is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one stop website for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire tax related query at free of cost just visit viewmypaycheck and you will get all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 needed information.

    ReplyDelete
  25. https://autocracked.org/fl-studio-free-crack-plus-all-torrent-2020/
    FL Studio Full Crack is a type of software that composes music for you. It is inclusive software that provides cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 platform to you compose music sitting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole thing you want to exist in only one package to increase its performance capability Fruity, Producer and Signature are three versions of fl studio. They have different features according to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir cost and performance.

    ReplyDelete
  26. https://fullpcgameshere.com/
    Full Pc Games Here Free Download Full Highly Compressed Available now.

    ReplyDelete

  27. This blog is really awesome Thanks for sharing most valuable information with us.
    DevOps Online Training institute
    DevOps Online Training in Hyderabad

    ReplyDelete