Posted by Samuel Groß, Project Zero
In this post, we will take a look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 WebKit exploits used to gain an initial foothold onto cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iOS device and stage cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 privilege escalation exploits. All exploits here achieve shellcode execution inside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sandboxed renderer process (WebContent) on iOS. Although Chrome on iOS would have also been vulnerable to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se initial browser exploits, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y were only used by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker to target Safari and iPhones.
After some general discussion, this post first provides a short walkthrough of each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploited WebKit bugs and how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attackers construct a memory read/write primitive from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, followed by an overview of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 techniques used to gain shellcode execution and how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y bypassed existing JIT code injection mitigations, namely cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “bulletproof JIT”.
It is worth noting that none of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploits bypassed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new, PAC-based JIT hardenings that are enabled on A12 devices. The exploit writeups are sorted by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most recent iOS version cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit supports as indicated by a version check in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit code itself. If that version check was missing from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 supported version range was guessed based on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 date of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fix and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous exploits.
The renderer exploits follow common practice and first gain memory read/write capabilities, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n inject shellcode into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JIT region to gain native code execution. In general it seems that every time a new bug was necessary/available, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new bug was exploited for read/write and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n plugged into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existing exploit framework. The exploits for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 different bugs also appear to generally use common exploit techniques, e.g. by first creating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 addrof and fakeobj primitives, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n faking JS objects to achieve read/write.
For many of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploits it is unclear whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y were originally exploited as 0day or as 1day after a fix had already shipped. It is also unknown how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attackers obtained knowledge of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerabilities in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first place. Generally cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y could have discovered cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerabilities cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves or used public exploits released after a fix had shipped. Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore, at least for WebKit, it is often possible to extract details of a vulnerability from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 public source code repository before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fix has been shipped to users. CVE-2019-8518 can be used to highlight this problem (as can many ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r recent vulnerabilities). The vulnerability was publicly fixed in WebKit HEAD on Feb 9 2019 with commit 4a23c92e6883. This commit contains a testcase that triggers cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue and causes an out-of-bounds access into a JSArray - a scenario that is usually easy to exploit. However, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fix only shipped to users with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 release of iOS 12.2 on March 25 2019, roughly one and a half months after details about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability were public. An attacker in possession of a working exploit for an older WebKit vulnerability would likely only need a few days to replace cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 underlying vulnerability and thus gain cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 capability to exploit up-to-date devices without cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 need to find new vulnerabilities cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves. It is likely that this happened for at least some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following exploits.
For comparison, here is how ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r browser vendors deal with this “patch-gap” or vulnerability window problem:
After some general discussion, this post first provides a short walkthrough of each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploited WebKit bugs and how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attackers construct a memory read/write primitive from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, followed by an overview of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 techniques used to gain shellcode execution and how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y bypassed existing JIT code injection mitigations, namely cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “bulletproof JIT”.
It is worth noting that none of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploits bypassed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new, PAC-based JIT hardenings that are enabled on A12 devices. The exploit writeups are sorted by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most recent iOS version cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit supports as indicated by a version check in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit code itself. If that version check was missing from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 supported version range was guessed based on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 date of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fix and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous exploits.
The renderer exploits follow common practice and first gain memory read/write capabilities, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n inject shellcode into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JIT region to gain native code execution. In general it seems that every time a new bug was necessary/available, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new bug was exploited for read/write and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n plugged into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existing exploit framework. The exploits for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 different bugs also appear to generally use common exploit techniques, e.g. by first creating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 addrof and fakeobj primitives, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n faking JS objects to achieve read/write.
For many of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploits it is unclear whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y were originally exploited as 0day or as 1day after a fix had already shipped. It is also unknown how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attackers obtained knowledge of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerabilities in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first place. Generally cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y could have discovered cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerabilities cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves or used public exploits released after a fix had shipped. Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore, at least for WebKit, it is often possible to extract details of a vulnerability from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 public source code repository before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fix has been shipped to users. CVE-2019-8518 can be used to highlight this problem (as can many ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r recent vulnerabilities). The vulnerability was publicly fixed in WebKit HEAD on Feb 9 2019 with commit 4a23c92e6883. This commit contains a testcase that triggers cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue and causes an out-of-bounds access into a JSArray - a scenario that is usually easy to exploit. However, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fix only shipped to users with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 release of iOS 12.2 on March 25 2019, roughly one and a half months after details about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability were public. An attacker in possession of a working exploit for an older WebKit vulnerability would likely only need a few days to replace cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 underlying vulnerability and thus gain cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 capability to exploit up-to-date devices without cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 need to find new vulnerabilities cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves. It is likely that this happened for at least some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following exploits.
For comparison, here is how ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r browser vendors deal with this “patch-gap” or vulnerability window problem:
- Google has this same problem with Chromium (e.g. commit 52a9e67a477b fixing CVE-2018-17463 and including a PoC trigger). However, it appears that some recent bugfixes no longer include cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JavaScript test cases commits. For example cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following two fixes for vulnerabilities reported by our team member Sergey Glazunov: aa00ee22f8f7 (for issue 1784) and 4edcc8605461 (for issue 1793). In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latter case, only a C++ test was added that tested cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new behaviour without indication of how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerable code could be reached.
- Microsoft keeps security fixes in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 open source Chakra engine private until cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fixes have been shipped to users. The security fixes are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n released and marked as such with a CVE identifier. See commit 7f0d390ad77d for an example of this. However, it should be noted that Chakra will soon be replaced by V8 (Chromium’s JavaScript engine) in Edge.
- Mozilla appears to hold back security fixes from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 public repository until somewhat close to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next release. 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 commits usually do not include cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JavaScript testcases used to trigger cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability.
However, it is worth noting that even if no JavaScript testcase is attached to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 commit, it is often still possible to reconstruct a trigger (and ultimately an exploit) for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code changes and/or commit message with moderate effort.
Exploit 1: iOS 10.0 until 10.3.2
This exploit targets CVE-2017-2505 which was originally reported by lokihardt as Project Zero issue 1137 and fixed in WebKit HEAD with commit 4a23c92e6883 on Mar 11th 2017. The fix was cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n shipped to users with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 release of iOS 10.3.2 on May 15th 2017, over two months later.
Of interest, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit trigger is almost exactly cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same as in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug report and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 regression test file in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 WebKit repository. This can be seen in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following two images, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 left one showing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 testcase published in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 WebKit code repository as part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bugfix and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right showing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 in-cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365-wild exploit code that triggered cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug.
Of interest, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit trigger is almost exactly cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same as in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug report and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 regression test file in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 WebKit repository. This can be seen in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following two images, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 left one showing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 testcase published in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 WebKit code repository as part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bugfix and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right showing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 in-cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365-wild exploit code that triggered cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug.
The bug causes an out-of-bounds write to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JSC heap with controlled data. The attackers exploit this by corrupting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first QWord of a controlled JSObject, changing its Structure ID (which associates runtime type information with a JSCell) to make it appear as a Uint32Array instead. This way, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y essentially create a fake TypedArray which directly allows cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m to construct a memory read/write primitive.
Exploit 2: iOS 10.3 until 10.3.3
This exploit seems to target CVE-2017-7064 (or a variant cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reof), which was originally discovered by lokihardt and reported as issue 1236. The bug was fixed in WebKit HEAD with commit ad6d74945b13 on Apr 18th 2017 and shipped to users with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 release of iOS 10.3.3 on Jul 19th 2017, over three months later.
The bug causes uninitialized memory to be treated as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 content of a JS Array. Through standard heap manipulation techniques it is possible to control cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 uninitialized data, at which point it becomes possible to construct cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 well-known addrof and fakeobj primitives through a type confusion between doubles and JSValues and thus gain memory read/write by constructing a fake TypedArray.
The bug causes uninitialized memory to be treated as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 content of a JS Array. Through standard heap manipulation techniques it is possible to control cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 uninitialized data, at which point it becomes possible to construct cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 well-known addrof and fakeobj primitives through a type confusion between doubles and JSValues and thus gain memory read/write by constructing a fake TypedArray.
Exploit 3: likely iOS 11.0 until 11.3
This exploit targets cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 WebKit bug 181867 which might be CVE-2018-4122. It was fixed in WebKit HEAD on Jan 19, 2018 and presumably shipped to users with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 release of iOS 11.3 on Mar 29th 2018.
The bug is a classic (by 2019 standards) JIT side-effect modelling issue. It remains unclear whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attackers knew about this bug class before it started to be widely known around cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 beginning of 2018. The exploit again constructs cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 addrof and fakeobj primitives by confusing unboxed double and JSValue arrays, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n gains memory read/write by again faking a typed array object.
The bug is a classic (by 2019 standards) JIT side-effect modelling issue. It remains unclear whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attackers knew about this bug class before it started to be widely known around cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 beginning of 2018. The exploit again constructs cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 addrof and fakeobj primitives by confusing unboxed double and JSValue arrays, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n gains memory read/write by again faking a typed array object.
Exploit 4: likely iOS 11.3 until 11.4.1
This exploit targets cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug fixed in commit b4e567d371fd on May 16th 2018 and corresponding to WebKit issue 185694. Unfortunately, we were unable to determine cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CVE assigned to this issue, but it seems likely that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fix shipped to users with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 release of iOS 11.4.1 on Jul 9th 2018.
This is anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r JIT side-effect modelling bug with similar exploit to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous one, again constructing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fakeobj primitive to fake JS object. However, by now cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Gigacage mitigation had shipped. As such it was no longer useful to construct fake ArrayBuffers/TypedArrays. Instead, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit constructs a fake unboxed double Array and with that gains an initial, somewhat limited memory read/write primitive. It cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n appears to use that initial primitive to disable cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Gigacage mitigation and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n continues to abuse TypedArrays to perform 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 exploit work.
This is anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r JIT side-effect modelling bug with similar exploit to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous one, again constructing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fakeobj primitive to fake JS object. However, by now cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Gigacage mitigation had shipped. As such it was no longer useful to construct fake ArrayBuffers/TypedArrays. Instead, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit constructs a fake unboxed double Array and with that gains an initial, somewhat limited memory read/write primitive. It cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n appears to use that initial primitive to disable cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Gigacage mitigation and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n continues to abuse TypedArrays to perform 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 exploit work.
Exploit 5: iOS 11.4.1
This exploit targets CVE-2018-4438, which was first reported by lokihardt as issue 1649. The bug was fixed with commit 8deb8bd96f4a on Oct 26th 2018 and shipped to users with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 release of iOS 12.1.1 on Dec 5th 2018.
Due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug, it was possible to construct an Array with a Proxy prototype that wasn’t expected by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 engine. It is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n possible to turn this bug into an incorrect side-effect modelling issue by performing effectful changes during a proxy trap triggered (unexpectedly) in JIT compiled code. The exploit is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n very similar to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous one, first disabling cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Gigacage with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 limited JS Array read/write, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n performing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shellcode injection with a full read/write via TypedArrays.
Due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug, it was possible to construct an Array with a Proxy prototype that wasn’t expected by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 engine. It is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n possible to turn this bug into an incorrect side-effect modelling issue by performing effectful changes during a proxy trap triggered (unexpectedly) in JIT compiled code. The exploit is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n very similar to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous one, first disabling cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Gigacage with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 limited JS Array read/write, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n performing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shellcode injection with a full read/write via TypedArrays.
Exploit 6: likely iOS 12.0 until 12.1.1
This exploit targets CVE-2018-4442, which was originally discovered by lokihardt and reported as issue 1699 and fixed in HEAD with commit 1f1683cea15c on Oct 17th 2018. The fix cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n shipped to users with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 release of iOS 12.1.1 on Dec 5th 2018.
In contrast to 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 bugs, this bug yields a use-after-free in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JavaScriptEngine. Similar to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PoC in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 WebKit tracker, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attackers abuse cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 UaF by freeing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 property backing storage of an object (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 butterfly), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n reclaim that storage with a JSBoundFunction’s m_boundArgs array by repeatedly calling func.bind(). If that is successful, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attackers are now able to get access to an internal object, m_boundArgs, by loading a property from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 freed object’s butterfly. With that, it becomes possible to construct an OOB access by making cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 m_boundArgs array sparse, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n calling cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bound function. This will invoke JSBoundFunction::boundArgsCopy which assumes that m_boundArgs is dense and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise reads JSValues past cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end of a buffer which it passes as argument to a controlled function (that was bound() previously).
This fact has been exploited in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past, which is why cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is now a comment next to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 definition of m_boundArgs: `// DO NOT allow this array to be mutated!`. From cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attackers again construct cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 addrof and fakeobj primitives and reuse 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 exploit from before.
In contrast to 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 bugs, this bug yields a use-after-free in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JavaScriptEngine. Similar to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PoC in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 WebKit tracker, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attackers abuse cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 UaF by freeing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 property backing storage of an object (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 butterfly), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n reclaim that storage with a JSBoundFunction’s m_boundArgs array by repeatedly calling func.bind(). If that is successful, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attackers are now able to get access to an internal object, m_boundArgs, by loading a property from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 freed object’s butterfly. With that, it becomes possible to construct an OOB access by making cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 m_boundArgs array sparse, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n calling cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bound function. This will invoke JSBoundFunction::boundArgsCopy which assumes that m_boundArgs is dense and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise reads JSValues past cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end of a buffer which it passes as argument to a controlled function (that was bound() previously).
This fact has been exploited in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past, which is why cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is now a comment next to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 definition of m_boundArgs: `// DO NOT allow this array to be mutated!`. From cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attackers again construct cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 addrof and fakeobj primitives and reuse 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 exploit from before.
Exploit 7: iOS 12.1.1 until 12.1.3
The final exploit targets cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same bug as exploited by Linus Henze here: https://github.com/LinusHenze/WebKit-RegEx-Exploit, which is again a JIT side-effect modelling issue. The WebKit bugtracker id for it appears to be 191731. It is unclear whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r a CVE number was assigned to it, but it could be CVE-2019-6217 which was disclosed during mobile Pwn2Own that year by Team flouroacetate. The bug seems to have been fixed on Nov 16th 2018 and shipped to users with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 release of iOS 12.1.3 on Jan 22nd 2019.
Instead of using WASM objects to gain memory read/write as Linus does, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attackers appear to instead have plugged cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new bug into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir old exploit and again create a fake JS Array to gain initial memory read/write capabilities, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n continue cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same way cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y did before.
Instead of using WASM objects to gain memory read/write as Linus does, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attackers appear to instead have plugged cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new bug into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir old exploit and again create a fake JS Array to gain initial memory read/write capabilities, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n continue cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same way cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y did before.
Shellcode Execution
After gaining memory read/write capabilities, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 renderer exploit pivots to shellcode execution, which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n performs cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 privilege escalation exploits. The way cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y achieve shellcode execution is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same in all exploits: by bypassing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JIT mitigations to overwrite an existing function’s JIT code and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n invoking that function.
For some time now (first announced by Apple at BlackHat 2016 and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n shipped with iOS 10), iOS features a JIT hardening measure that aims to make it more difficult for an attacker to write code directly into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RWX JIT region. It basically achieves that by creating a second, “hidden” mapping of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JIT region that is writable and keeping cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first mapping of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 region non-writable. However, one weakness of this approach, and acknowledged in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 presentation by Apple, is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re has to be a “jit_memcpy” function that is called to copy cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 generated code into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JIT region. As such, it remains viable to perform a ROP or JOP style attack to execute this function with controlled shellcode as argument. This is what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attackers do as well. This problem now appears to be somewhat mitigated on PAC enabled devices by signing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JIT code during code generation and verifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature later on. The exploits we found did not include a bypass for PAC enabled devices and instead bailed out if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y ran on an A12 device.
In more detail, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attackers construct a JOP chain, consisting of three different gadgets that allow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m to perform a function call of an arbitrary function with controlled arguments. To kick off cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chain, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y replace cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 native function pointer of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 `escape` JS function with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first gadget of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chain. The chain cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n performs a call to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ”jit_memcpy” function to overwrite cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JIT code of a previously compiled function with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shellcode. Finally cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y replace cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function pointer of `escape` one last time and point it to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shellcode inside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JIT region.
For some time now (first announced by Apple at BlackHat 2016 and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n shipped with iOS 10), iOS features a JIT hardening measure that aims to make it more difficult for an attacker to write code directly into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RWX JIT region. It basically achieves that by creating a second, “hidden” mapping of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JIT region that is writable and keeping cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first mapping of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 region non-writable. However, one weakness of this approach, and acknowledged in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 presentation by Apple, is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re has to be a “jit_memcpy” function that is called to copy cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 generated code into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JIT region. As such, it remains viable to perform a ROP or JOP style attack to execute this function with controlled shellcode as argument. This is what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attackers do as well. This problem now appears to be somewhat mitigated on PAC enabled devices by signing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JIT code during code generation and verifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature later on. The exploits we found did not include a bypass for PAC enabled devices and instead bailed out if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y ran on an A12 device.
In more detail, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attackers construct a JOP chain, consisting of three different gadgets that allow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m to perform a function call of an arbitrary function with controlled arguments. To kick off cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chain, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y replace cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 native function pointer of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 `escape` JS function with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first gadget of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chain. The chain cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n performs a call to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ”jit_memcpy” function to overwrite cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JIT code of a previously compiled function with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shellcode. Finally cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y replace cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function pointer of `escape` one last time and point it to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shellcode inside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JIT region.
No comments:
Post a Comment