Thursday, September 28, 2017

Over The Air - Vol. 2, Pt. 1: Exploiting The Wi-Fi Stack on Apple Devices

Posted by Gal Beniamini, Project Zero

Earlier this year we performed research into Broadcom’s Wi-Fi stack. Due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ubiquity of Broadcom’s stack, we chose to conduct our prior research through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lens of one affected family of products -- cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Android ecosystem. To paint a more complete picture of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 state of Wi-Fi security in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mobile ecosystem, we’ve chosen to revisit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 topic - this time through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lens of Apple devices. In this research we’ll perform a deeper dive into each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 affected components, discover new attack surfaces, and finally construct a full over-cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365-air exploit chain against iPhones, allowing complete control over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 target device.

Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s much ground to cover, we’ve chosen to split cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 research into a three-part blog series. The first blog post will focus on exploring cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi stack itself and developing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 necessary research tools to explore it on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second blog post, we’ll perform research into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware, discover multiple vulnerabilities, and develop an exploit allowing attackers to execute arbitrary code on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip itself, requiring no user-interaction. Lastly, in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 final blog post we’ll explore cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone’s host isolation mechanisms, research cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ways in which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip interacts with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host, and develop a fully-fledged exploit allowing attackers to gain complete control over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iOS kernel over-cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365-air, requiring no user interaction.

As we’ve mentioned before, Broadcom’s chips are present in a wide variety of devices - ranging from mobile phones to laptops (such as Chromebooks) and even Wi-Fi routers. While we’ve chosen to focus our attention on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Apple ecosystem this time around, it’s worth mentioning that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware vulnerabilities presented in this research affect ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r devices as well. Additionally, as this research deals with a different attack surface in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 breadth of affected devices might be wider than that of our prior research.

More concretely, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi vulnerabilities presented in this research affect many devices in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Android ecosystem. For example, two of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerabilities (#1, #2) affect most of Samsung’s flagship devices, including cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Galaxy S8, Galaxy S7 Edge and Galaxy S7. Of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two, one vulnerability is also known to affect Google devices such as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Nexus 6P, and some models of Chromebooks. As for Apple’s ecosystem, while this research deals primarily with iPhones, ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r devices including Apple TV and iWatch are similarly affected by our findings. The exact breadth of ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r affected devices has not been investigated furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, but is assumed to be wider.

We’d also like to note that until hardware host isolation mechanisms are implemented across cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Android ecosystem, every exploitable Wi-Fi firmware vulnerability directly results in complete host takeover. In our previous research we identified cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lack of host isolation mechanisms on two of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most prominent SoC platforms; Qualcomm’s Snapdragon 810 and Samsung’s Exynos 8890. We are not aware of any advances in this regard, as of yet.

For cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 purpose of this research, we’ll demonstrate remote code execution on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone 7 (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most recent iDevice at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time of this research), running iOS 10.2 (14C92). The vulnerabilities presented in this research are present in iOS up to (and including) version 10.3.3 (apart from #1, which was fixed in 10.3.3). Researchers wishing to port cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 provided research tools and exploits to ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r versions of iOS or to ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r iDevices would be required to adjust cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 referenced symbols.

Over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 course of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 blog post, we’ll begin fleshing out a memory research platform for iOS. Throughout this blog post series, we’ll rely on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 framework extensively, to both analyse and explore components on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system, including cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XNU kernel, hardware components, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chipset itself.

The vulnerabilities affecting Apple devices have been addressed in iOS 11. Similarly, those affecting Android have been addressed in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 September bulletin. Note that within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Android ecosystem, OEMs bear cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 responsibility for providing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own Wi-Fi firmware images (partially due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir high level of customisation). Therefore cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding fixes should appear in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendors’ own bulletins, racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than Android’s security bulletin.

Creating a Research Platform


Before we can begin exploring, we’ll need to lay down cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 groundwork first. Ideally, we’d like to create our own debugger -- allowing us to both inspect and instrument cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reby making exploration (and subsequent exploit development) much easier.

During our previous research into Broadcom’s Wi-Fi chip within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 context of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Android ecosystem, this task turned out to be much more straight-forward than expected. Instead of having to create an entire research environment from scratch, we relied on several properties provided by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Android ecosystem to speed up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 development phase.

For starters, many Android devices allow developers to intentionally bypass cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir security model, using “rooted” builds (such as userdebug). Flashing such a build onto a device allows us to freely explore and interact with many components on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system. As cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security model is only bypassed explicitly, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 odds of side-effects resulting from our research affecting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system’s behaviour are racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r slim.

Additionally, Broadcom provides cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own debugging tools to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Android ecosystem, consisting of a command-line utility and a dedicated set of ioctls within Broadcom’s device driver, bcmdhd. These tools allow sufficiently privileged users to interact with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip in a variety of ways, including cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ability to access cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip’s RAM directly -- an essential primitive when constructing a debugger. Basing our own toolset on this platform allowed us to create a racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r comfortable research environment.

Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore, Android utilises cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Linux Kernel, which is licensed under GPLv2. Therefore, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel’s source code, including that of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device drivers, is freely available. Reading through Broadcom’s device driver (bcmdhd) turned out to be an invaluable resource -- sparing us some unnecessary reverse-engineering while also allowing us to easily assess cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ways in which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip and host interact with one anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r.

Lastly, some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data sheets pertaining to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi SoCs used on Android devices were made publicly available by Cypress following cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir acquisition of Broadcom’s IoT business. While most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 information in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data sheets is irrelevant to our research, we were able to gacá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r a handful of useful clues regarding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 architecture of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SoC itself.


Unfortunately, it appears we have no such luck this time around!

First, Apple does not provide a “developer-mode” iPhone, nor is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re a mechanism to selectively bypass cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security model. This means that in order to meaningfully explore cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system, researchers are forced to subvert cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device’s security model (i.e., by jailbreaking). Consequently, exploring different components within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device is made much more difficult.

Additionally, unlike cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Android ecosystem, Apple has chosen to develop cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir entire host-side stack “from scratch”. Most importantly, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iOS drivers used to interact with Broadcom’s chip are written by Apple, and are not based on Broadcom’s FullMAC drivers (bcmdhd or brcmfmac). Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r host-side utilities, such as Broadcom’s debugging toolchain, are thus also not included.

That said, Apple did develop cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own mechanisms for accessing and debugging cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip. These capabilities are exposed via a set of privileged ioctls embedded in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IO80211Family driver. While cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interface itself is undocumented, reverse-engineering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding components in both cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IO80211Family and AppleBCMWLANCore drivers reveals a racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r powerful command channel, and one which could possibly be used for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 purposes of our research. Unfortunately, access to this interface requires additional entitlements, thus preventing us from leveraging it (unless we escalate our privileges).

Lastly, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s no overlap between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 revisions of Wi-Fi chips used on Apple’s devices and those used in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Android ecosystem. As we’ll see later on, this might be due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that Apple-specific Wi-Fi chips contain Apple-specific features. Regardless, perhaps unsurprisingly, none of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding data sheets for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se SoCs have been made available.


So… it appears we’ll have to deal with a proprietary chip, on a proprietary device running a proprietary operating system. We have our work cut out for us! That said, it’s not all doom and gloom; instead of relying on all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above, we’ll just need to create our own independent research platform.

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


Let’s start by analysing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SoC’s firmware and loading it up into a disassembler. As we’ve seen in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous round of research, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware consists of a small chunk of ROM containing most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s data and code, and a larger blob of RAM housing all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 runtime data structures (such as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap and stack), as well as patches to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM’s code.

Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM blob is loaded into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip during its initialisation by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host, it should be accessible via cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host’s root filesystem. Indeed, after downloading cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone’s firmware image, extracting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 root filesystem and searching for indicative strings, we are greeted with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following result:


Great, so we’ve identified cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s RAM. What’s more, it appears that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip embedded in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 phone is a BCM4355C0, a model which I haven’t come across in Android devices in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past (also, it curiously does not appear under Broadcom’s website).

Regardless, having cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM image is all well and good, but what about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM? After all, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 majority of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code is stored in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip’s ROM. Even if we were to settle for analysing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM alone, it’d be extremely difficult to reverse-engineer independently of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM as many of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 functions in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 former address data stored in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latter. Without knowing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM’s contents, or even its rudimentary layout, we’ll have to resort to guesswork.

However, this is where we run into a bit of a snag! To extract cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM we’ll need to interact with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip itself... Whereas on Android we could simply use a “rooted” build to gain elevated privileges, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n access cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi SoC via Broadcom’s debugging utilities, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are no comparable mechanisms on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone. In that case, how will we interact with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip and ultimately extract its ROM?

We could opt for a hardware-based research environment. Reviewing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data sheets for one of Broadcom’s Wi-Fi SoCs, BCM4339, reveals several interfaces through which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip may be debugged, including UART and a JTAG interface.


That said, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are several disadvantages to this approach. First, we’d need to open up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device, locate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 required interfaces, and make sure that we do not damage cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 phone in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process. Moreover, requiring a such a setup for each research device would cause us to incur significant start-up overhead. Perhaps most importantly, relying on a hardware-based approach would limit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 amount of researchers who’d be willing to utilise our research platform -- both because hardware is a relatively specialised skill-set, and since people might (rightly) be wary of causing damage to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own devices.

So what about a completely software-based solution? After all, on Android devices we were able to access cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip’s memory solely using software. Perhaps a similar solution would apply to Apple devices?

To answer this question, let’s trace our way through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Android components involved in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 control flow for accessing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip’s memory from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host. The flow begins with a user issuing a memory access command via Broadcom’s debugging utility (“membytes”). This, in turn, triggers an ioctl to Broadcom’s driver, requesting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory access operation. After some processing within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 driver, it performs cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 requested action by directly accessing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip’s tightly-coupled memory (TCM) from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel’s Virtual Address-Space (VAS).

Two Registers Walk Into a BAR


As we’re mostly interested in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latter part, let’s disregard cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Android-specific components for now and focus on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mechanism in bcmdhd allowing TCM access from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host.

Reviewing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 driver’s code allows us to arrive at relevant code flow. First, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 driver enables cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PCIe-connected Wi-Fi chip. Then, it accesses cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PCIe Configuration Space to program cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip’s Base Address Registers (BARs). In keeping with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PCI standards, programming and mapping in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BARs into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host’s address space exposes functionality directly from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi SoC to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host, such as IO-Space or Memory Space access. Taking a closer look at Broadcom’s chips, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y seem to provide two BARs in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir configuration space; BAR0 and BAR1.

BAR0 is used to map-in registers corresponding to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 different cores on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi SoC, including cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ARM processor running cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s logic, and more esoteric components such as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PCIe Gen 2 core on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi SoC. The cores cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves can be selected by accessing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PCIe configuration space once again, and programming cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “BAR0 Window” register, directing it at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 backplane address corresponding to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 requested core.

BAR1, 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, is used solely to map cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip’s TCM into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host. Since Broadcom’s driver leverages cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TCM access capability extensively, it maps-in BAR1 into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel’s virtual address space during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device’s initialisation, and doesn’t unmap it until cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device shuts down. Once cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TCM is mapped into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel, all subsequent memory accesses to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip’s TCM are performed by simply modifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mapped block within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel’s VAS. Any write operations made to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory-mapped block are automatically reflected to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip’s RAM.

This is all well and good, but what about iOS? Since Apple develops cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own drivers for interacting with Broadcom’s chips, what holds true in Broadcom’s drivers doesn’t necessarily apply to Apple’s drivers. After all, we could think of many different approaches to accessing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip’s memory. For example, instead of mapping cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire TCM into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel’s memory, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y might elect to only map-in certain regions of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TCM, to map it only on-demand, or even to rely on different chip-access mechanisms altogecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r.

To get to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bottom of this, we’ll need to start reverse-engineering Apple’s drivers. This can be done by extracting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernelcache from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone’s firmware and loading it into our favourite disassembler. After loading cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel, we immediately come across two driver KEXTs related to Broadcom’s Wi-Fi chip; AppleBCMWLANCore and AppleBCMWLANBusInterfacePCIe.

Spending some time reverse-engineering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two drivers, it’s quickly evident what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir corresponding roles are. AppleBCMWLANCore serves as a high-level driver, dealing mostly with configuring cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip, handling incoming events, and chip-specific features such as offloading. In keeping with good design practices, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 driver is unaware of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interface through which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip is connected, allowing it to focus solely on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 logic required to interact with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip. In contrast, AppleBCMWLANBusInterfacePCIe, serves a complementary role; it is a low-level driver tasked with handling all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PCIe related communication protocols, dealing with MSI interrupts, and generally everything interface-related.

We’ll revisit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two drivers more in-depth later on, but for now it’s sufficient to say that we have a relatively good idea where to start looking for a potential TCM mapping -- after all, as we’ve seen, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TCM access is performed by mapping cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PCIe BARs. Therefore, it would stand to reason that such an operation would be performed by AppleBCMWLANBusInterfacePCIe.

After reverse-engineering much of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 driver, we come across a group of suspicious-looking functions that appear like candidates for TCM accessors. All cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above functions serve cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same purpose -- accessing a memory-mapped buffer, differing from one anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r only in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 size of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 word used (16, 32, or 64-bit). Anecdotally, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding APIs for TCM access in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Android driver follow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same structure. What’s more, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above functions all reference cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string “Memory”... We might be onto something!

Kernel Function 0xFFFFFFF006D1D9F0

Cross-referencing our way up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 call-chain, it appears that all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above functions are methods pertaining to instances of a single class, which incidentally bears cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same name as that of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 driver: AppleBCMWLANBusInterfacePCIe. Since several functions in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 call-chain are virtual functions, we can locate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 class’s VTable by searching for 64-bit words containing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir addresses within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernelcache.


To avoid unnecessary confusion between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object above and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 driver, we’ll refer to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object for now on as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “PCIe object”, and we’ll refer to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 driver by its full name; “AppleBCMWLANBusInterfacePCIe”.

Kernel Memory Analysis Framework


Now that we’ve identified mechanisms in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel possibly relating to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip’s TCM, our next course of action is to somehow access cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m. Had we been able to debug cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iOS kernel, we could have simply placed a breakpoint on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned memory access functions, recorded cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 location of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shared buffer, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n used our debugger to freely access cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer on our own. However, as it happens, iOS offers no such debugger. Indeed, having such a debugger would allow users to subvert cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device’s security model...

Instead, we’ll have to create our kernel debugger!

Debuggers usually consist of two main pieces of functionality:
  1. The ability to modify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 control flow of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 program (e.g., by inserting breakpoints)
  2. The ability to inspect (and modify) cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data being processed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 program

As it happens, modifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel’s control flow on modern Apple devices (such as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone 7) is far from trivial. These devices include a dedicated hardware component -- Apple’s Memory Cache Controller (AMCC), designed to prevent attackers from modifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel’s code, even in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 presence of full control over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel itself (i.e., EL1 code execution). While AMCC might make for an interesting research target in its own right, it’s not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 main focus of our research at this time. Instead, we’ll have to make do with analysing and modifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data processed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel.

To gain access to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel, we’ll first need to exploit a privilege escalation vulnerability. Luckily, we can forgo all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 complexity involved in developing a functional kernel exploit, and instead rely on some excellent work by Ian Beer.

Earlier this year, Ian developed a fully-functional exploit allowing kernel code execution from any sandboxed process on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system. Upon successful execution, Ian’s exploit provides two primitives - memory-read and memory-write - allowing us to freely explore cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel’s virtual address-space. Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit was developed against iOS 10.2, we’ll need use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same version on our target iPhone to utilise it.

To allow for increased flexibility, we’ll aim to design our research platform to be modular; instead of tying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 platform to a specific memory access mechanism, we’ll use Ian’s exploit as a “black-box”, only deferring memory accesses to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit’s primitives.

Moreover, it’s important that whatever system we build allows us to explore cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device comfortably. Thinking about this for a moment, we can boil it down to a few basic requirements:
  1. The analysis should be done on a developer-friendly machine, not on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone
  2. The platform should be scriptable and easily extensible
  3. The platform should be independent of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory access mechanism used

To prevent any dependance on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory access mechanism, we’ll implement a rudimentary command protocol, allowing clients to perform read or write operation, as well as offering an “execute” primitive for gadgets within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel’s VAS. Next, we’ll insert a small stub implementing this protocol into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit, allowing us to interface with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit as if it were a “black box”. As for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 client, it can be executed on any machine, as long as it’s able to connect to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server stub and communicate using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above protocol.

A version of Ian Beer’s extra_recipe exploit with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned server stub can be found on our bug tracker, here.

Lastly, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 question of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 research platform itself. For convenience sake, we’ve decided to develop cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 framework as a set of Python scripts, not unlike forensics frameworks such as Volatility. We’ll slowly grow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 framework as we go along, adding scripts for each new data structure we come across.

Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iOS kernel relies heavily on dynamic dispatch, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ability to explore cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel in a shell-like interface allows us to easily resolve virtual call targets by inspecting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 virtual pointers in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding objects. We’ll use this ability extensively to assist our static analysis in place where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code is hard to untangle.

Over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 course of our research we’ll develop several modules for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 analysis framework, allowing interaction with objects within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XNU kernel, parts of IOKit, hardware components, and finally cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip itself.

Setting Up a Test Network


Moving on, we’ll need to create a segregated test network, consisting of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 target iPhone, a single MacBook (which we’ll use to interact with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone), and a Wi-Fi router.

As our memory analysis framework transmits data over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 network, both cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MacBook must be able to communicate with one anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. Additionally, as we’re using Xcode to deploy cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MacBook to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone, it’d be advantageous if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 test network allowed both devices to access cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 internet (so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 developer profile could be verified).

Lastly, we require complete control over all aspects of our Wi-Fi router. This is since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next part of our research will deal extensively with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi layer. As such we’d like to reserve cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ability to inject, modify and drop frames within our network -- primitives which may come in handy later on.

Putting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above requirements togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, we arrive at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following basic topology:


In my own lab setup, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 role of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi router is fulfilled by my ThinkPad laptop, running Ubuntu 16.04. I’ve connected two SoftMAC TL-WN722N dongles, one for each interface (internal and external). The internal network’s access-point is broadcast using hostapd, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 external interface connects to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 internet using wpa_supplicant. Moreover, network-manager is disabled to prevent interference with our configuration.

Note that it’s imperative that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dongle used to broadcast cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 internal network’s access-point is a SoftMAC device (and not FullMAC) -- this will ensure that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MLME and MAC layers are processed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host’s software (i.e., by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Linux Kernel and hostapd), allowing us to easily control cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data transmitted over those layers.

The laptop is also minimally configured to perform IP forwarding and to serve as a NAT, in order to allow connections from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 internal network out into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 internet. In addition, I’ve set up both DNS and DHCP servers, to prevent cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 need for any manual configuration. I also recommend setting up DNS forwarding and blocking Apple’s software-update domains within your network (mesu.apple.com, appldnld.apple.com).

Depending on your work environment, it may be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case that many (or most) Wi-Fi channels are racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r crowded, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reby reducing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signal quality substantially. While dropping frames doesn’t normally affect our ability to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 network (frames would simply be re-transmitted), it may certainly cause undesirable effects when attempting to run an over-cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365-air exploit (as re-transmissions may alter cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s state substantially).

Anecdotally, scanning for nearby networks around my desk revealed around 60 Wi-Fi networks, causing quite a bit of noise (and frame loss). If you encounter cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same issue, you can boost your RSSI by building a small cantenna and connecting it to your dongle:


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


Using our test network and memory analysis platform, let’s start exploring cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel’s VAS!

We’ll begin cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hunt by searching for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PCIe object within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel. After all, we know that finding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object will allow us to locate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 suspect TCM mapping, bringing us closer to our goal of developing a Wi-Fi firmware debugger. Since we’re unable to place breakpoints, we’ll need to locate a “path” leading from a known memory location to that of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PCIe object.

So how will we identify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PCIe object once we come across it? Well, while cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 C++ standards do not explicitly specify how dynamic dispatch is implemented, most compilers tend to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same ABI for this purpose -- cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first word of every object containing virtual functions serves as a pointer to that object’s virtual table (commonly referred to as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “virtual pointer” or “vptr”). By leveraging this little tidbit, we can build our own object identification mechanism; simply read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first word of each object we come across, and check which virtual table it corresponds to. Since we’ve already located cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VTable corresponding to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PCIe object we’re after, all we’d need to do is check each object against that address.

Now that we know how to identify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object, we can begin searching for it within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel. But where should we start? After all, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object could be anywhere in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel’s VAS. Perhaps we can gain some more information by taking a look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object’s constructor. For starters, doing so will allow us to find out which allocator is used to create cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object; if we’re lucky, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object may be allocated from a special pool or stored in a static location.

Kernel Function 0xFFFFFFF006D34734

(OSObject’s “new” operator is a wrapper around kalloc - cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XNU kernel allocator).

Looking at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code above, it appears that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PCIe object is not allocated from a special pool. Perhaps, instead, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object is addressable through data stored in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 driver’s BSS or data segments? If so, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n by following every “chain” of pointers originating in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above segments, we should be able to locate a chain terminating at our desired object.

To test out this hypocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365sis, let’s write a short python script to perform a depth-first search for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object, starting in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 driver’s BSS and data segments. The script simply iterates over each 64-bit word and checks whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r it appears to be a valid kernel virtual address. If so, it recursively continues cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 search by following cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pointer and its neighbouring pointers (searching both forwards and backwards), stopping only when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 maximal search depth is reached (or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object is located).


After running cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DFS and following pointers up to 10 levels deep, we find no matching chain. It appears that none of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 objects in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BSS or data segments contain a (sufficiently short) pointer chain leading to our target object.

So how should we proceed? Let’s take a moment to consider what we know about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object so far. First, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object is allocated using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XNU kernel allocator, kalloc. We also know cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exact size of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocation (3824 bytes). And, of course, we have a means of identifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object once located. Perhaps we could inspect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocator itself to locate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object...

On cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one hand, it’s entirely possible that kalloc doesn’t keep track of in-use allocations. If so,  tracking down our object would be racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r difficult. 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, if kalloc does have a way of identifying past allocations, we can parse its data structures and follow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same logic to identify our object. To get to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bottom of this, let’s download cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XNU source code corresponding to this version of iOS, and read through kalloc’s implementation.

After spending some time familiarising ourselves with kalloc’s implementation, we can sketch a high-level view of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocator’s implementation. Since kalloc is a “zone allocator”, each allocated object is assigned a region from which it is drawn. Individual regions are represented by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 zone_t structure, which holds all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 metadata pertaining to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 zone.

The allocator’s operation can be roughly split into two phases: identifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding zone for each allocation, and carving cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocation from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 zone. The identification process itself takes on three distinct flows, depending on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 size of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 requested allocation. Once cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 target zone is identified, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocation process proceeds identically for all three flows.

So how are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocations cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves performed? During zones’ lifetimes, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y must keep track of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir internal metadata, including cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 zone’s size, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of stored elements and many ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r bits and pieces. More importantly, however, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 zone must track cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 state of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory pages assigned to it. During cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel’s lifetime, many objects are allocated and subsequently freed, causing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 different zones’ pages to fill up or vacate. If each allocation triggered an iteration over all possible pages while searching for vacancies, kalloc would be quite inefficient. Instead, this is tackled by keeping track of several queues, each denoting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 state of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory pages assigned to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 zone.

Among cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 queues stored in each zone are two queues of particular interest to us:
  • The “intermediate” queue - contains pages with both vacancies and allocated objects.
  • The “all used” queue -  contains pages with no vacancies (only filled with objects).

Putting it all togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, we can identify allocated objects in kalloc by simply following cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same mechanisms as those used by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocator to locate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 target zone. Once we find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 matching zone, we’ll parse its queues to locate each allocation made within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 zone, stopping only when we reach our target object.

Finally, we can package all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above into a module in our analysis framework. The module allows us to eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r manually iterate over zones’ queues, or to locate objects by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir virtual table (optionally accepting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocation size to quickly locate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 relevant zone).

Using our new kalloc module, we can search for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PCIe object using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VTable address we found earlier on. After doing so, we are finally greeted with a positive result -- cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object is successfully located within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel’s VAS! Next, we’ll simply follow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same steps we identified in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory accessors analysed earlier on, in order to extract cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 location of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 suspected TCM mapping within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel.

Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TCM mapping provides a view into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip’s RAM, we’d naturally expect it to begin with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same values as those we had identified in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM file extracted from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware. Let’s try and read out some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 values from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer and see whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r it matches cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM dump:


Great! So we’ve finally found cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TCM. This brings us one step closer to acquiring cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM, and to building a research environment for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi SoC.

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


The TCM mapping provides a view into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip’s RAM. While accessing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM is undoubtedly useful (as it allows us to gain visibility into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 runtime structures used by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip, such as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap’s state), it does not allow us to directly access cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip’s ROM. So why did we go to all of this effort to begin with? Well, while thus far we have only used cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mapped TCM buffer to read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi SoC’s RAM, recall that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same mapping also allows us to freely write to it -- any data written to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory-mapped buffer is automatically reflected back to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi SoC’s RAM.

Therefore, we can leverage our newly acquired write access to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip’s RAM in order to modify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip’s behaviour. Perhaps most importantly, we can insert hooks into RAM-resident functions in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware, and direct cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir flow towards our own code chunks. As we’ve already built a patching infrastructure in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous blog posts, we can incorporate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same code as a module in our analysis framework!

Doing so allows us to provide a convenient interface through which we simply select a target RAM function and provide a corresponding assembly stub, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 framework cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n proceeds to patch cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function on our behalf, direct it into our shellcode to execute our hook (and emulate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original prologue), and finally return back to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original function. The shellcode stub itself is written into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 top of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap’s largest free chunk, allowing us to avoid overwriting any important data structures in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM.


Building on this technique, let’s insert a hook into a commonly invoked RAM function (such cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip’s “ioctl” handler). Once invoked, our hook will simply copy small “windows” of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM into predetermined regions in RAM. Note that since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM is only slightly larger than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM, we cannot leak cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire ROM in one go, so we’ll have to resort to this iterative approach instead. Once a ROM chunk is copied, our shellcode stub signals completion, cause cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host to subsequently extract cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 leaked ROM contents and notify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stub that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next chunk of ROM may be leaked.


Indeed, after inserting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hook and running cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 scheme detailed above, we are finally presented with a complete copy of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip’s ROM. Now we can finally move on to analysing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware image!

To properly load cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware into a disassembler, we’ll need to locate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM and RAM’s loading addresses, as well as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir respective sizes. As we’ve seen in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip’s ROM is mapped at address zero and spans several KBs. The RAM, 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, is normally mapped at a fixed, higher address.

There are multiple ways in which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM’s loading address can be deduced. First, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM blob analysed previously embeds its own loading address at a fixed offset. We can verify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address’s validity by attempting to load cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM at this offset in a disassembler and observing that all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 branches resolve correctly. Alternately, we can extract cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 loading address from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PCIe object we identified earlier in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel, as it contains both attributes as fields in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object.

Regardless, all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above methods yield cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same result -- cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM is loaded at address 0x160000, and is 0xE0000 bytes long:


Building a Wi-Fi Firmware Debugger


Having extracted cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM and achieved TCM access capabilities, we can also build a module to allow us to easily interact with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip. This module will act as a debugger of sorts for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware, allowing us to gain full read/write capabilities to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware, as well as providing several key debugging features.

Among cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 features present in our debugger are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 abilities to inspect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap’s freelist, execute assembly code chunks directly on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware, and even hook RAM-resident functions.

In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next blog post we’ll continue expanding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 functionality provided by this module as we go along, resulting in a more complete research framework.

Wrapping Up


In this blog post we’ve performed our initial investigation into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi stack on Apple’s mobile devices. Using a privileged research platform to poke around cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel, we managed to locate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware’s TCM mapping in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host, and to extract cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip’s ROM for furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r analysis. We also started fleshing out our research platform within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iOS kernel, allowing us to build our very own Wi-Fi firmware debugger, as well several modules for parsing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel’s structures -- useful tools for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next stage of our research!

In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next blog post, we’ll use our firmware debugger in order to continue our exploration of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip present on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone 7. We’ll perform a deep dive into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware, discover multiple vulnerabilities and develop an over-cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365-air exploit for one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, allowing us to gain full control over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi SoC.

10 comments:

  1. Very nice work, as always ;-)

    However, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is an easier way to extract cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip. As soon as, you have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM firmware file, you can patch it with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Nexmon Firmware Patching Framework (see https://nexmon.org) to hook cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reference to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wlc_ioctl function that handles ioctls in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware. Hooking this function allows you to add new ioctls, for example some that can read from arbitrary memory locations, including cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM. To send ioctls to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y have to be packed into an APPLE80211_IOC_CARD_SPECIFIC ioctl to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi interface as demonstrated by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 monmob developers (see https://github.com/tuter/monmob/blob/master/tools/iOS/server/ioctl.py). On 64-bit devices, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 apple80211req structure changed a bit so that it needs to be adjusted in tools sending this ioctl. For cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Nexmon project, we created nexutil to send arbitrary ioctls to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware and also compiled it for iOS 10 (see https://github.com/seemoo-lab/nexmon/tree/master/ios_utilities/nexutil) using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365os (see https://github.com/cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365os/cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365os). Equipped with nexutil and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extended RAM firmware, you can simply extract cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM of your Wi-Fi chip. Currently, we only created cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rom extraction project (see https://github.com/seemoo-lab/nexmon/tree/master/patches/bcm43451b1/7_63_43_0/rom_extraction) for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone 6, but we could also port it for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone 7 if required.

    ReplyDelete
    Replies
    1. Hi Matthias,

      Thank you for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kind words! I am aware of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 technique above, however, to utilise it you need privileged access to switch cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware file (or am I missing something?). Once you have code execution on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip (eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r by patching cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM file itself or by patching RAM via cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TCM), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rest is similar (hook a function and use it to extract cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM).

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

      Delete
    2. Yes, you are right, privileged access is required at least to execute cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 /usr/libexec/wifiFirmwareLoader program to load cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware from a given location and to send ioctls to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware. However, as long as a jailbreak exists for a certain iOS version, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Nexmon approach should always work to modify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware, reload it and extract cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM. 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ý bet365 downside of this approach is, that addresses of structs may change when we allocate memory on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap.

      Delete
  2. This has been an amazing read! Congratulations!

    I'll admit that I am a massive Apple fan and my knee-jerk reaction was negative, as to almost judge your intent, but after reading cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 article, I'm extremely happy you've made all this effort! Not only that, you've maintained a neutral bias throughout.

    Thank you! :)

    ReplyDelete
  3. 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
  4. dear gal your research is amazing but what more amazing is that your sharing it with us , so thank you much man

    ReplyDelete
    Replies
    1. Thank you for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kind words

      Delete
  5. 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
  6. 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