Tuesday, April 4, 2017

Over The Air: Exploiting Broadcom’s Wi-Fi Stack (Part 1)

Posted by Gal Beniamini, Project Zero

It’s a well understood fact that platform security is an integral part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security of complex systems. For mobile devices, this statement rings even truer; modern mobile platforms include multiple processing units, all elaborately communicating with one anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. While cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code running on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application processor (AP) has been cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subject of much research, ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r components have seldom received cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same scrutiny.

soc_complexity (1).png

Over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 years, as a result of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 focused attention by security folk, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 defenses of code running on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application processor have been reinforced. Taking Android as a case study, this includes hardening cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operating system, improving cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security of applications, and introducing incremental security enhancements affecting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire system. All positive improvements, no doubt. However, attackers tend to follow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 path of least resistance. Improving cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security of one component will inevitably cause some attackers to start looking elsewhere for an easier point of entry.

In this two-part blog series, we’ll explore cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exposed attack surface introduced by Broadcom’s Wi-Fi SoC on mobile devices. Specifically, we’ll focus our attention on devices running Android, although a vast amount of this research applies to ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r systems including cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same Wi-Fi SoCs. 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 SoC itself; we’ll discover and exploit vulnerabilities which will allow us to remotely gain code execution on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second blog post, we’ll furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r elevate our privileges from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SoC into 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 operating system’s kernel. Chaining cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, we’ll demonstrate full device takeover by Wi-Fi proximity alone, requiring no user interaction.

We’ll focus on Broadcom’s Wi-Fi SoCs since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most common Wi-Fi chipset used on mobile devices. A partial list of devices which make use of this platform includes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Nexus 5, 6 and 6P, most Samsung flagship devices, and all iPhones since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone 4. For cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 purpose of this blog post, we’ll demonstrate a Wi-Fi remote code execution exploit on a fully updated (at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time, now fixed) Nexus 6P, running Android 7.1.1 version NUF26K.

All 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 post have been disclosed to Broadcom. Broadcom has been incredibly responsive and helpful, both in fixing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerabilities and making cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fixes available to affected vendors. For a complete timeline, see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug tracker entries. They’ve also been very open to discussions relating to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi SoC.

I would like to thank Thomas Dullien (@halvarflake) for helping boot up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 research, for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 productive brainstorming, and for helping search cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 literature for any relevant clues. I’d also like to thank my colleagues in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 London office for helping make sense of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploitation constraints, and for listening to my ramblings.

Why-Fi?


In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past decade, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 use of Wi-Fi has become commonplace on mobile devices. Gradually, Wi-Fi has evolved into a formidable set of specifications—some detailing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 physical layer, ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rs focusing on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MAC layer. In order to deal with this increased complexity, vendors have started producing “FullMAC” Wi-Fi SoCs.

In essence, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se are small SoCs that perform all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PHY, MAC and MAC SubLayer Management Entity (MLME) processing on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own, allowing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operating system to abstract itself away from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 complex (and sometimes chip-specific) features related to Wi-Fi. The introduction of Wi-Fi FullMAC chips has also improved cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 power consumption of mobile devices, since much of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 processing is done on a low-power SoC instead of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 power-hungry application processor. Perhaps most importantly, FullMAC chips are much easier to integrate, as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y implement cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MLME within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir firmware, reducing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 complexity on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host’s side.

All that said and done, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 introduction of Wi-Fi FullMAC chips does not come without a cost. Introducing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se new pieces of hardware, running proprietary and complex code bases, may weaken cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overall security of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 devices and introduce vulnerabilities which could compromise cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire system.

mlme.png

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


To start off our research, we’ll need to find some way to explore cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip. Luckily, Cypress has recently acquired Broadcom’s Wireless IOT business, and have published many of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 datasheets related to Broadcom’s Wi-Fi chipsets (albeit for a slightly older SoC, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BCM4339). Reading through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 datasheet, we gain some insight into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hardware architecture behind cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chipset.
bcm4339.png

Specifically, we can see that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s an ARM Cortex R4 core, which runs all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 logic for handling and processing frames. Moreover, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 datasheet reveals that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ARM core has 640KB of ROM used to hold cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s code, and 768KB of RAM which is used for data processing (e.g., heap) and to store patches to firmware code.

To start analysing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code running on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ARM core, we’ll need to extract cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM, and to locate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data that is loaded into RAM.

Let’s start by tackling cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second problem first - where is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data that’s loaded into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ARM core’s RAM? Since this data is not present in ROM, it must be loaded externally when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip first powers on. Therefore, by reading through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initialisation code in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host’s driver, we should be able to locate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file containing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM’s contents. Indeed, going over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 driver’s code, we find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BCMDHD_FW_PATH config, which is used to denote 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 file whose contents are uploaded to RAM by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 driver.

So what about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM’s contents? One way to extract cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM would be to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host driver’s chip memory access capabilities (via PIO over SDIO or PCIe) to read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM’s contents directly. However, doing so would require modifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 driver to enable us to issue cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 commands needed to dump cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM. Anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r way to retrieve cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM would be to load our own modified firmware file into RAM, into which we’ll insert a small stub that can be used to dump cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM’s memory range. Luckily, none of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se approaches is actually needed in this case; Broadcom provides an extremely powerful command-line utility called dhdutil, which can be used to interact with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip via cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bcmdhd driver.

Among cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 various capabilities this utility supports, it also allows us to directly read and write memory on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dongle by issuing a special command - “membytes”. Since we already know 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 ROM (from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 datasheet), we can just use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 membytes command to read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM’s contents directly. However, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s one last question we need to answer first - where is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM located? According to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 great research done by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 folks behind NexMon, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM is loaded at address 0x0, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM is loaded at address 0x180000 (while NexMon focused on BCM4339, this fact remains true for newer chips as well, such as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BCM4358).

Finally, putting all this togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, we can acquire cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM’s contents from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware file, dump cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM using dhdutil, and combine cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two into a single file which we can cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n start analysing in IDA.
memlayout (2).png

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


Due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 relatively small size of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 available memory (both ROM and RAM), Broadcom went to extreme efforts in order to conserve memory. For starters, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y’ve stripped cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 symbols and most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 strings from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 binary. This has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 added bonus of making it slightly more cumbersome to reverse-engineer cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s code. They’ve also opted for using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Thumb-2 instruction set exclusively, which allows for better code density. As a result, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM image on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BCM4358 is so tightly packed that it contains less than 300 unused bytes.

However, this is still not quite enough... Remember that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM has to accommodate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap, stack and global data structures, as well as all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 patches or modifications to ROM functions. Quite a tall order for a measly 768KB. To get around this, Broadcom has decided to place all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 functions that are only used during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s initialisation in two special regions. Once cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initialisation is completed, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se regions are “reclaimed”, and are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reafter converted into heap chunks.

What’s more, heap chunks are interspersed between code and data structures in RAM - since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latter sometimes have alignment requirements (or are referenced directly from ROM, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y cannot be moved). The end result is that RAM is a jumbled mess of heap chunks, code and data structures.
ramlayout (3).png

After spending some time analysing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware, we can begin identifying at least a few strings containing function names and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r hints, helping us get a grasp of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code base. Additionally, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NexMon researchers have released cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir gacá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365red symbols corresponding to firmware on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BCM4339. We can apply cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same symbols to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BCM4339’s firmware, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n use bindiff to correlate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 symbol names in newer firmware versions for more recent chips.

Lastly, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s one more trick in our hat - Broadcom produces SoftMAC chips in addition to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 FullMAC SoCs we’re analysing. Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se SoftMAC chips don’t handle cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MLME layer, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir corresponding driver must perform that processing. As a result, much of Broadcom’s MLME processing code is included in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 open-source SoftMAC driver - brcmsmac. While this won’t help us out with any of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip-specific features or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 more internal processing code, it does seem to share many utility functions with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s code.

Hunting for Bugs


Now that we have a grasp of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s structure and have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 means to analyse it, we can finally start hunting for bugs. But… Where should we start?

Even with all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tricks mentioned before, this is a relatively large and opaque binary, and strings or symbols are few and far between. One possibility would be to instrument cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware in order to trace cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code paths taken while a packet is received and processed. The Cortex R4 does, indeed, have debug registers which can be used to place breakpoints and inspect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code flow at various locations. Alternately, we could manually locate a set of functions which are used to parse and retrieve information from a received frame, and work our way backwards from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re.

This is where familiarity with Wi-Fi comes in handy; Wi-Fi management frames encode most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir information in small “tagged” chunks of data, called Information Elements (IEs). These tagged chunks of data are structured as TLVs, where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tag and length fields are a single byte long.

IE.png

Since a large portion of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 information transferred in Wi-Fi frames (ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data itself) is encoded using IEs, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y make for good candidates from which we can work our way backwards. Moreover, as “tag” values are unique and standardised, we can use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir values to help familiarise ourselves with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 currently handled code flow.

Looking at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 brcmsmac driver, we can see that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s a single function which Broadcom uses in order to extract IEs from a frame - bcm_parse_tlvs. After a brief search (by correlating hints from nearby strings), we find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same function in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s ROM. Great.

Now we can start cross-referencing locations which call this function, and reverse each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se call-sites. While substantially easier than reversing every part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware, this still takes a considerable amount of time (as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function has more than 110 cross-references, some to ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r wrapper functions which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves are called from multiple locations).

After reverse engineering all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 call sites, I’ve found a few vulnerabilities related to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 handling of information elements embedded in management frames.

Two of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerabilities can be triggered when connecting to networks supporting wireless roaming features; 802.11r Fast BSS Transition (FT), or Cisco’s CCKM roaming. On cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one side, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se vulnerabilities should be relatively straightforward to exploit - cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are simple stack overflows. Moreover, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operating system running on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware (HNDRTE) does not use stack cookies, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s no additional information leak or bypass required.

However, while cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se vulnerabilities may be comfortable to exploit, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y require some set-up to get working. First, we’d need to broadcast Wi-Fi networks that support cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se features. 802.11r FT is an open(-ish) standard, and is implemented by hostapd. In contrast, CCKM is a proprietary standard (although some information can be found online). Figuring out how to emulate a CCKM network (or buying a CCKM-capable WLC from Cisco) would be cumbersome (or costly).

Additionally, we’d need to figure out which devices actually support cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned features. Broadcom provides many features which can be licensed by customers -- not all features are present on all devices (in fact, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir corresponding patches probably wouldn’t even fit in RAM).

Luckily, Broadcom makes it easy to distinguish which features are actually present in each firmware image. The last few bytes in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM contents downloaded to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip contain cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s “version string”. This string contains cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 date at which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware was compiled, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip’s revision, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s version and a list of dash-delimited “tags”. Each tag represents a feature that is supported by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware image. For example, here’s cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 version string from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Nexus 6P:

4358a3-roml/pcie-ag-p2p-pno-aoe-pktfilter-keepalive-sr-mchan-pktctx-hostpp-lpc-pwropt-txbf-wl11u-mfp-betdls-amsdutx5g-txpwr-rcc-wepso-sarctrl-btcdyn-xorcsum-proxd-gscan-linkstat-ndoe-hs20sta-oobrev-hchk-logtrace-rmon-apf-d11status Version: 7.112.201.1 (r659325) CRC: 8c7aa795 Date: Tue 2016-09-13 15:05:58 PDT Ucode Ver: 963.317 FWID: 01-ba83502b

The presence of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 802.11r FT feature is indicated by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “fbt” tag. Similarly, support for CCKM is indicated by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “ccx” tag. Unfortunately, it seems that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Nexus 6P supports neicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se features. In fact, running a quick search for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “ccx” feature (CCKM support) on my own repository of Android firmware images revealed that this feature is not supported on any Nexus device, but is supported on a wide variety of Samsung flagship devices, a very partial list of which includes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Galaxy S7 (G930F, G930V), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Galaxy S7 Edge (G935F, G9350), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Galaxy S6 Edge (G925V) and many more.

So what about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r two vulnerabilities? Both of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m relate to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 implementation of Tunneled Direct Link Setup (TDLS). TDLS connections allow peers on a Wi-Fi network to exchange data between one anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r without passing it through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Access Point (AP), thus preventing congestion at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 AP.

Support for TDLS in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware is indicated by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “betdls” and “tdls” tags. Searching through my firmware repository I can see that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vast majority of devices do, indeed, support TDLS. This includes all recent Nexus devices (Nexus 5, 6, 6P) and most Samsung flagships.

What’s more, TDLS is specified as part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 802.11z standard (requires IEEE subscription). Since all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 information regarding TDLS is available, we could read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 standard in order to gain familiarity with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 relevant code paths in Broadcom’s implementation. As an open standard, it is also supported by open-source supplicants, such as wpa_supplicant. As a result, we can inspect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 implementation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TDLS features in wpa_supplicant in order to furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r improve our understanding of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 relevant code in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware.

Lastly, as we’ll see later on, triggering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se two vulnerabilities can be done by any peer on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi network, without requiring any action on 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 device being attacked (and with no indication that such an attack is taking place). This makes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se vulnerabilities all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 more interesting to explore.

In any case, it seems like we’ve made our mind up! We’re going to exploit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TDLS vulnerabilities. Before we do so, however, let’s take a second to learn a little bit about TDLS, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerabilities discovered (skip this part it you’re already familiar with TDLS).

802.11z TDLS 101


There are many use cases where two peers on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same Wi-Fi network wish to transfer large swaths of data between one anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. For example, casting a video from your mobile device to your Chromecast would require large amounts of data to be transmitted. In most cases, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Chromecast would be relatively nearby to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 caster (after all, you’d probably be watching cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 screen to which you’re casting). Therefore, it would seem wasteful to pass cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire data stream from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 AP, only to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n pass it on to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Chromecast.

It’s not just cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 increased latency of adding an additional hop (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 AP) that will degrade cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 connection’s quality. Passing such large amounts of data to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 AP would also put a strain on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 AP itself, cause congestion, and would degrade cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi connectivity for all peers on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 network.

This is where TDLS comes into play. TDLS is meant to provide a means of peer-to-peer communication on a Wi-Fi network that is AP-independant.

Over The Air


Let’s start by familiarising ourselves with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 structure of TDLS frames. As you may know, 802.11 frames use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “flags” field in order to indicate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “direction” in which a frame is travelling (from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 client to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 AP, AP to client, etc.). TDLS traffic co-opts cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 use of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 flag values indicating traffic in an Ad-Hoc (IBSS) network (To-DS=0, From-DS=0).

Screenshot from 2017-03-10 11:03:28.png

Next, TDLS frames are identified by a special ecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rtype value - 0x890D. TDLS frames transmitted over Wi-Fi use a constant value in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “payload type” field, indicating that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 payload has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following structure:

tdls_payload (1).png

The category for TDLS frames is also set to a constant value. This leaves us with only one field which distinguishes between different TDLS frame types - cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “action code”. This 1-byte field indicates cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kind of TDLS frame we’re transmitting. This, in turn, controls cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way in which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “payload” in interpreted by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 receiving end.

High-Level Flow


Before two peers can establish a connection, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y must first know about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existence of one anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. This is called cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “discovery” phase. A Wi-Fi client that wishes to discover TDLS-capable peers on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 network, can do so by sending a “TDLS Discovery Request” frame to a peer. A TDLS-capable peer that receives this frame, responds by sending a “TDLS Discovery Response” frame. The request and response are correlated to one anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r using a 1-byte “dialog token”.

discovery.png

Next, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 peers may wish to set up a connection. To do so, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y must perform a 3-way handshake. This handshake serves a dual purpose; first, it indicates that a connection is successfully established between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two peers. Second, it’s used to derive cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TDLS Peer Key (TPK), which secures cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TDLS traffic between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 peers.

setup.png

Finally, once cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 connection is created, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two peers can exchange peer traffic between one anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. When one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 peers wishes to tear-down cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 connection, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y may do so by sending a “TDLS Teardown” frame. Upon reception of such a frame, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TDLS-peer will remove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 connection and free up all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 related resources.

Now that we know enough about TDLS, let’s take a closer look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerabilities at hand!

The Primitives


In order to ensure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 integrity of messages transferred during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 setup and teardown phases, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding TDLS frames include Message Integrity Codes (MIC). For cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 setup phase, once cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second handshake message (M2) is received, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TPK can be derived by both parties. Using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TPK, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TDLS-initiator can calculate a MIC over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 third handshake frame, which can cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n be verified by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TDLS-responder.

The MIC is calculated over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IEs encoded in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 handshake frame, as follows:

Screenshot from 2017-03-10 13:04:30.png

Similarly, teardown frames also include a MIC, calculated over a slightly different set of IEs:

Screenshot from 2017-03-10 12:37:36.png

So how can we find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se calculations in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s code? Well, as luck would have it, some strings referring to TDLS were left-over in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s ROM, allowing us to quickly home in on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 relevant functions.

After reverse-engineering much of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 flow leading up to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 processing of handling TDLS action frames, we finally reach cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function responsible for handling TDLS Setup Confirm (PMK M3) frames. The function first performs some validations to ensure that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 request is legitimate. It queries cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 internal data structures to ensure that a TDLS connection is indeed being set up with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 requesting peer. Then, it verifies cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Link-ID IE (by checking that its encoded BSSID matches that of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current network), and also verifies cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 32-byte initiator nonce (“Snonce”) value (by comparing it to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stored initial nonce).

Once a certain degree of confidence is established that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 request may indeed be legitimate, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function moves on to call an internal helper function, tasked with calculating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MIC and ensuring that it matches cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one encoded in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 frame. Quite helpfully, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware also includes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 name for this function (“wlc_tdls_cal_mic_chk”).

After reverse-engineering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function, we arrive at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following approximate high-level logic:

1.  uint8_t* buffer = malloc(256);
2.  uint8_t* pos = buffer;
3.  
4.  //Copying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initial (static) information
5.  uint8_t* linkid_ie = bcm_parse_tlvs(..., 101);
6.  memcpy(pos, linkid_ie + 0x8, 0x6);  pos += 0x6;              //Initiator MAC
7.  memcpy(pos, linkid_ie + 0xE, 0x6);  pos += 0x6;              //Responder MAC
8.  *pos = transaction_seq;             pos++;                   //TransactionSeq
9.  memcpy(pos, linkid_ie, 0x14);       pos += 0x14;             //LinkID-IE
10.
11. //Copying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RSN IE
12. uint8_t* rsn_ie = bcm_parse_tlvs(..., 48);
13. if (rsn_ie[1] + 2 + (pos - buffer) > 0xFF) {
14.     ... //Handle overflow
15. }
16. memcpy(pos, rsn_ie, rsn_ie[1] + 2); pos += rsn_ie[1] + 2;    //RSN-IE
17.
18. //Copying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 remaining IEs
19. uint8_t* timeout_ie = bcm_parse_tlvs(..., 56);
20. uint8_t* ft_ie      = bcm_parse_tlvs(..., 55);
21. memcpy(pos, timeout_ie, 0x7);       pos += 0x7;              //Timeout Interval IE
22. memcpy(pos, ft_ie, 0x54);           pos += 0x54;             //Fast-Transition IE

As can be seen above, although cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function verifies that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RSN IE’s length does not exceed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocated buffer’s length (line 13), it fails to verify that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subsequent IEs also do not overflow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer. As such, setting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RSN IE’s length to a large value (e.g., such that rsn_ie[1] + 2 + (pos - buffer) == 0xFF) will cause cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Timeout Interval and Fast Transition IEs to be copied out-of-bounds, overflowing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer.

setup_oflow.png
For example, assuming we set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RSN IE (x) to its maximal possible value, 224, we arrive at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following placements of elements:

setup_oflow2 (1).png

In this diagram, orange fields are those which are “irrelevant” for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overflow, since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are positioned within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer’s bounds. Red fields indicate values that cannot be fully controlled by us, and green fields indicate values which are fully controllable.

For example, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Timeout Interval IE is verified prior to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MIC’s calculation and only has a constrained set of allowed values, making it uncontrollable. Similarly, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 FTIE’s tag and length fields are constant, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore not controllable. Lastly, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 32-byte “Anonce” value is randomly chosen by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TDLS responder, placing it firmly out of our field of influence.

But cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 situation isn’t that grim. In fact, several of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fields in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 FTIE itself can be arbitrarily chosen - for example, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Snonce” value is chosen by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TLDS-initiator during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first message in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 handshake. Moreover, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “MIC Control” field in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 FTIE can be freely chosen, since it is not verified prior to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 execution of this function.

In any case, now that we’ve audited cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MIC verification for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 setup stage, let’s turn our sights towards cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MIC verification during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 teardown stage. Perhaps cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code is similarly broken cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re? Taking a look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MIC calculation in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 teardown stage (“wlc_tdls_cal_mic_chk”), we arrive at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following high-level logic:

1.  uint8_t* buffer = malloc(256);
2.  ...
3.  uint8_t* linkid_ie = bcm_parse_tlvs(..., 101); //Link ID
4.  memcpy(buffer, linkid_ie, 0x14);
5.  ...
6.  uint8_t* ft_ie = bcm_parse_tlvs(..., 55);
7.  memcpy(buffer + 0x18, ft_ie, ft_ie[1] + 2);    //Fast-Transition IE

Ah-ha, so once again a straightforward overflow; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 FT-IE’s length field is not verified to ensure that it doesn’t exceed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocated buffer. This means that simply by providing a crafted FT-IE, we can trigger cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overflow. Nevercá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365less, once again cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are several verifications prior to triggering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerable code path which limit our control on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overflowing elements. Let’s try and plot cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 placement of elements during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overflow:

teardown_oflow (3).png

This seems much simpler - we don’t need to worry ourselves about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 values stored in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 FTIE that are verified prior to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overflow, since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y’re all placed neatly within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer’s range. Instead, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker controlled portion is simply spare data that is not subject to any verification, and can cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore be freely chosen by us. That said, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overflow’s extent is quite limited - we can only overwrite at most 25 bytes beyond cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 range of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer.

Writing an Exploit

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


At long last we have a grasp of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 primitives at hand. Now, it’s time to test out whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r our hypocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ses match reality. To do so, we’ll need a testbed that’ll enable us to send crafted frames, triggering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overflows. Recall that wpa_supplicant is an open-source portable supplicant that fully supports TDLS. This makes it a prime candidate for our research platform. We could use wpa_supplicant as a base on top of which we’ll craft our frames. That would save us cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 need to re-implement all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 logic entailed in setting up and maintaining a TDLS connection.

To test out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerabilities, we’ll modify wpa_supplicant to allow us to send TDLS Teardown frames containing an overly-large FTIE. Going over wpa_supplicant’s code, we can quickly identify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function in charge of generating and sending cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 teardown frame - wpa_tdls_send_teardown. By adding a few small changes to this function (in green) we should be able to trigger cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overflow upon reception cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 teardown frame, causing 25 bytes of 0xAB to be written OOB:

static int wpa_tdls_send_teardown(struct wpa_sm *sm, const u8 *addr, u16 reason_code)
{
...
ftie = (struct wpa_tdls_ftie *) pos;
ftie->ie_type = WLAN_EID_FAST_BSS_TRANSITION;
ftie->ie_len = 255;
os_memset(pos + 2, 0x00, ftie->ie_len);
os_memset(pos + ftie->ie_len + 2 - 0x19, 0xAB, 0x19); //Overflowing with 0xAB

os_memcpy(ftie->Anonce, peer->rnonce, WPA_NONCE_LEN);
os_memcpy(ftie->Snonce, peer->inonce, WPA_NONCE_LEN);
pos += ftie->ie_len + 2;
...
}

Now we just need to interact with wpa_supplicant in order to setup and teardown a TDLS connection to our target device. Conveniently, wpa_supplicant supports many command interfaces, including a command-line utility called wpa_cli. This command line interface also supports several commands exposing TDLS functionality:

  • TDLS_DISCOVER - Sends a “TDLS Discovery Request” frame and lists cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 response
  • TDLS_SETUP - Creates a TDLS connection to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 peer with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 given MAC address
  • TDLS_TEARDOWN - Tears down cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TDLS connection to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 peer with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 given MAC

Indeed, after compiling wpa_supplicant with TDLS support (CONFIG_TDLS), setting up a network, and connecting our target device and our research platform to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 network, we can see that issuing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TDLS_DISCOVER command works - we can indeed identify our peer.

tdls_discover.png

Moving on, we can now send a TDLS_SETUP command, followed by our crafted TDLS_TEARDOWN. If everything adds up correctly, this should trigger cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overflow. However, this raises a slightly more subtle question - how will we know when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overflow occurs? It may just so happen that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data we’re overflowing is unused. Alternately, it may be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case that when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware crashes, it just silently starts up again, leaving us none cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wiser.

To answer this fully, we’ll need to understand cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 logic behind Broadcom’s heap implementation. Digging into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocator’s logic, we find that it is extremely straightforward; it is a simple “best-fit” allocator, which performs forward and backward coalescing, and keeps a singly linked list of free chunks. When chunks are allocated, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are carved from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end (highest address) of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best-fitting free chunk (smallest chunk that is large enough). Heap chunks have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following structure:
heapchunk.png
(recall that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Cortex R4 is a 32-bit ARM processor, so all fields are stored in little-endian)

By reverse-engineering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocator’s implementation, we can also find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 location of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pointer to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 head of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first free-chunk in RAM. Combining cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se two facts togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, we can create a utility which, given a dump of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s RAM, can plot cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current state of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap’s freelist. Acquiring a snapshot of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s RAM can be easily achieved by using dhdutil’s “upload” command.

After writing a small visualiser script which walks over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap’s freelist and exports cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 its contents into dot, we can plot 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 freelist using graphviz, like so:

Screenshot from 2017-03-10 17:56:00.png

Now, we can send out crafted TDLS_TEARDOWN frame, immediately take a snapshot of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s RAM, and check cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 freelist for any signs of corruption:

Screenshot from 2017-03-10 18:12:29.png

Ah-ha! Indeed one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chunks in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 freelist suddenly has an exceptionally large size after tearing down cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 connection. Recall that since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocator uses “best-fit”, this means that subsequent allocations won’t be placed in this block as long as ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r large enough free chunks exist. This also means that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware did not crash, and in fact continued to function correctly. Had we not visualised 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 heap, we wouldn’t have been able to determine anything had happened at all.

In any case, now that we’ve confirmed that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overflow does in fact occur, it’s time to move to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next stage of exploitation. We need less crude tools in order to allow us to monitor 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 heap during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 setup and teardown processes. To this end, it would be advantageous to hook cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 malloc and free functions in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware, and to trace cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir arguments and return values.

First, we’ll need to write a “patcher”, which will allow us to insert hooks on given RAM-resident functions. It’s important to note that both cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 malloc and free functions are both present in RAM (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are among cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first functions in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM’s code chunk). This allows us to freely re-write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir prologues in order to introduce a branch to our own code. I’ve written a patcher which performs insertion of such hooks, allowing execution of small assembly stubs before and after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 invocation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hooked function.

In short, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 patcher is fairly standard - it writes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 patch’s code to an unused region in RAM (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 head of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 largest free chunk in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap), and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n inserts a Thumb-2 wide branch (which is, coincidentally, perhaps cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ugliest encoding for an opcode I’ve ever seen - see 4.6.12 T4) from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 prologue of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hooked function to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hook itself.

hook (2).png

Using our new patcher, we can now instrument cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 malloc and free functions in order to add traces allowing us to follow every operation occurring on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap. These traces can cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n be read from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s console buffer, by issuing dhdutil’s “consoledump” command. Note that on some newer chips, like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BCM4358 on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Nexus 6P, this command fails. This is because Broadcom forgot to add cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 offset to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 magic pointer in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware pointing to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 console’s data structure. You can fix this eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r by adding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 correct offset to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 driver (see debug_info_ptrs), or by writing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 magic value and pointer to one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 probed memory addresses in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 list.

In any case, you can find both cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 malloc and free hooks, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 associated scripts needed to parse cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 traces from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware, here.

Using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 newly acquired traces, we can write a better visualiser, allowing us to trace 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 heap throughout cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 setup and teardown phases. This visualiser will have visibility into every operation occurring on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap, offering far more granular data. I’ve written such a visualiser, which you can find here.

Without furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r ado, let’s take a look at heap activity while establishing a TDLS connection:
Screenshot from 2017-03-13 11:47:59.png

The vertical axis denotes time - each line is a new heap state after a malloc or free operation. The horizontal axis denotes space - lower addresses are on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 left, while higher addresses are on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right. Red blocks indicate chunks that are in-use, grey blocks indicate free chunks.

As we can clearly see above, establishing a TDLS connection is a messy operation. There are many allocations and deallocations, for regions both large and small. This abundance of noise doesn’t bode well for us. Recall that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overflow during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 setup stage is highly constrained, both in terms of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data being written, and in terms of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extent of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overflowing data. Moreover, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overflow occurs during one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 many allocations in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 setup phase. This doesn’t allow us much control over 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 heap prior to triggering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overflow.

Taking a step back, however, we can observe a fairly surprising fact. Apart from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap activity during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TDLS connection establishment, it seems like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is little to no activity on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap whatsoever. In fact, it turns out that transmitted and received frames are drawn from a shared pool, instead of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap. Not only that, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir processing doesn’t incur a single heap operation - everything is done “in-place”. Even when trying to intentionally cause allocations by sending random frames containing exotic bit combinations, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s heap remains largely unaffected.

This is both a blessing and a curse. On cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one hand, it means that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap’s structure is highly consistent. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 seldom events that data structures are allocated, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are immediately freed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reafter, restoring cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap to its original state. 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, it means that our degree of control over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap’s structure is fairly limited. For cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most part, whatever structure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap has after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s initialisation, is what we’re going to have to work with (unless, of course, we find some primitive that will allow us to better shape cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap).

Perhaps we should take a look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 teardown stage instead? Indeed, activating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 traces during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TDLS teardown stage reveals that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are very few allocations prior to triggering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overflow, so it seems like a much more convenient environment to explore.

Screenshot from 2017-02-09 15:07:26.png

While cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se in-depth traces are useful for getting a high-level view of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap’s state, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r difficult to decipher. In fact, in most cases it’s sufficient to take a single snapshot of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap and just visualise it, as we did earlier with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 graphviz visualiser. In that case, let’s improve our previous heap visualiser by allowing it to produce detailed graphical output, based on a single snapshot of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap.

As we’ve seen earlier, we can “walk” over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 freelist to extract cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 location and size of each free chunk. Moreover, we can deduce cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 location of in-use chunks by walking over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 gaps between free chunks and reading cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “size” field from each in-use chunk. I’ve written yet anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r visualiser that does just that - it simply produces a visualisation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap’s state from a series of “snapshot” images.

Using this visualiser, we can now take a look at 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 heap after setting up a TDLS connection. This will be 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 heap we need to work with when we trigger cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overflow during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 teardown stage.
(Upper Layer: initial heap state, Bottom Layer: heap state after creating a TDLS connection)after_setup.png

We can see that after setting up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TDLS connection, most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap’s used chunks are consecutive, but also two holes are formed; one of size 0x11C, and anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r of size 0x124. Activating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 traces for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 teardown stage, we can see that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following allocations occur:

(29) malloc - size: 284, caller: 1828bb, res: 1f0404
(30) free - ptr: 1f0404
(31) malloc - size: 20, caller: 18c811, res: 1f1654
(32) malloc - size: 160, caller: 18c811, res: 1f0480
(33) malloc - size: 8, caller: 80eb, res: 1f2a44
(34) free - ptr: 1f2a44
(35) free - ptr: 1f1654
(36) free - ptr: 1f0480
(37) malloc - size: 256, caller: 7aa15, res: 1f0420
(38) malloc - size: 16, caller: 7aa23, res: 1f1658

The highlighted line denotes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 256-byte buffer for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 teardown frame’s MIC calculation, that same one we can overflow using our vulnerability. Moreover, it seems as though cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap activity is quite low prior to sending cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overflow frame. Combining cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap snapshot above with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trace file, we can deduce that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best-fitting chunk for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 256-byte buffer is in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 0x11C-byte hole. This means that using our 25-byte overflow we’ll be able to overwrite:

  1. The header of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next in-use chunk
  2. A few bytes from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next in-use chunk

Let’s take a closer look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next in-use chunk and see 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ý bet365re’s any interesting information that we’d like to overwrite cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re:

Screenshot from 2017-03-13 12:39:21.png

Ah, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next chunk is mostly empty, save for a couple of pointers near its head. Are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se pointers of any use to us? Perhaps cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are written to? Or freed at a later stage? We can find out by manually corrupting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se pointers (pointing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m at invalid memory addresses, such as 0xCDCDCDCD), and instrumenting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s exception vector to see whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r it crashes. Unfortunately, after many such attempts, it seems as though none of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se pointers are in fact used.

This leaves us, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore, with a single possibility - corrupting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “size” field of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 in-use chunk. Recall that once cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TDLS connection is torn down, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data structures relating to it are freed. Freeing an in-use chunk whose size we’ve corrupted could have many interesting consequences. For starters, if we reduce 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 chunk, we can intentionally “leak” cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tail end of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer, causing it to remain forever un-allocatable. Much more interestingly, however, we could set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chunk’s size to a larger value, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reby causing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next free operation to create a free chunk whose tail end overlaps anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r heap chunk.

heapcor (3).png

Once a free chunk overlaps anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r heap chunk, subsequent allocations for which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overlapping free chunk is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best-fit will be carved from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 free chunk, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reby corrupting whatever fields reside at its tail. Before we start scheming, however, we need to confirm that we can create such a state (i.e., an overlapping chunk), after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 teardown operation completes.

Creating an Overlapping Chunk


Recall that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MIC check is just one of many operations that take place when a TDLS connection is torn down. It may just so happen that by overwriting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next chunk’s size, once it is freed during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 collection of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TDLS session’s data structures, it may become cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best-fit for subsequent allocations during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 teardown process. These allocations may cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n cause additional unintended corruptions, which will eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r leave cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap in a non-consistent state or even crash cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware.

However, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 search space for possible sizes isn’t that large - assuming we’re only interested in chunk sizes that are not larger than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM itself (for obvious reasons), we can simply enumerate each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap states produced by overwriting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “size” field of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next chunk with a given value and tearing down cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 connection. This can be automated by using a script on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sending (to perform cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 enumeration), while concurrently acquiring “snapshots” of RAM on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device, and observing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir state (whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r or not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are consistent, and 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 firmware managed to resume operation after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 teardown).

Specifically, it would be highly advantageous if we were able to create a heap state whereby two free chunks overlap one anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. In such a condition, allocations taken from one chunk, can be used to corrupt cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “next” pointer of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r free chunk. This could be used, perhaps, to control cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 location of subsequent allocations - an interesting primitive in it’s own right.

In any case, after running through a few chunk sizes, tearing down cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TDLS connection and observing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap state, we come across quite an interesting resulting state! By overwriting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “size” field with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value 72 and tearing down cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 connection, we achieve cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following heap state:

overlapping.png
Great! So after tearing down cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 connection, we are left with a zero-sized free chunk, overlapping a different (larger) free chunk! This means that once an allocation is carved from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 large chunk, it will corrupt cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “size” and “next” fields of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 smaller chunk. This could prove very useful - we could try and point cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next free chunk at a memory address whose contents we’d like to modify. As long as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data in that address conforms with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 format of a free chunk, we might be able to persuade cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap to overwrite cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory at that address with subsequent allocations.

Finding a Controlled Allocation


To start exploring cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se possibilities, we’ll first need to create a controlled allocation primitive, meaning we eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r control 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 allocation, or it’s contents, or (ideally) both. Recall that, as we’ve seen previously, it is in fact very hard to trigger allocations during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 normal processing of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware - nearly all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 processing is done in-place. Moreover, even for cases where data is allocated, its lifespan is very short; memory is immediately reclaimed once it’s no longer used.

Be that as it may, we’ve already seen at least one set of data structures whose lifetime is controllable, and which contains multiple different pieces of information - cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TDLS connection itself. The firmware must keep all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 information pertaining to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TDLS connection as long as its active. Perhaps we could find some data structure relating to TDLS which could act as a good candidate for a controlled allocation?

To search for one, let’s start by looking at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function handling each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TDLS action frames - wlc_tdls_rcv_action_frame. The function starts by reading out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TDLS category and action code. Then, it routes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 frame to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 appropriate handler function, according to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 received action code:

Screenshot from 2017-03-28 14:54:25.png

We can see that apart from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 regular, specification-defined action codes, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware also supports an out-of-spec frame with an action code of 127. Anything out-of-spec is automatically suspect, so that might be as good a place as any to look for our primitive.

Indeed, digging into this function, we find out that it performs a racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r curious task. First, it verifies that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first 3 bytes in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 frame’s contents match cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi alliance OUI (50:6F:9A). Then, it retrieves cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fourth byte of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 frame, and uses it as a “command code”. Currently, only two vendor-specific commands are implemented, commands #4 and #5. On a high-level; command #4 is used to send a tunneled probe request over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TDLS connection, and command #5 is used to send an “event” notification to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host, signalling that a “special” frame has arrived.

However, much more interestingly, we see that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 implementation for command #4 seems relevant to our current pursuit. First, it does not require cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existence of a TDLS connection in order to be processed! This allows us to send cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 frame even after tearing down cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 connection. Second, by activating heap traces during this function’s execution and reverse-engineering its logic, we find that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function triggers cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following high-level sequence of events:

1. if (A) { free(A); }
2. A = malloc(received_frame_size);
3. memcpy(A, received_frame, received_frame_size);
4. B = malloc(788);
5. free(B)
6. C = malloc(284);
7. free(C);

Great! So we get an allocation (A) with a controlled lifetime, a controlled size and controlled contents! What more could we possibly ask for?

There is one tiny snag, however. Modifying wpa_supplicant to send this crafted TDLS frame results in a resounding failure. While wpa_supplicant allows us to fully control many of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fields in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TDLS frames, it is only a supplicant, not an MLME implementation. This means that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding MLME layer is responsible for composing and sending cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 actual TDLS frames.

On cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 setup I’m using for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack platform, I have a laptop running Ubuntu 16.04, and a TP-Link TL-WN722N dongle. The dongle is a SoftMAC configuration, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MLME layer in play is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one present in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Linux kernel, namely, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “cfg80211” configuration layer.

When wpa_supplicant wishes to create and send TDLS frames, it does so by sending special requests over Netlink, which are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n handled by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cfg80211 framework, and subsequently passed to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SoftMAC layer, “mac80211”. Regrettably, however, mac80211 is unable to process cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 special vendor frames, and simply rejects cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m. Nonecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365less, this is just a minor inconvenience - I’ve written a few patches to mac80211 which add support for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se special vendor frames. After applying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se patches, re-compiling and booting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel, we are now able to send our crafted frames.

mac80211 (1).png

To allow for easier control over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendor frames, I’ve also added support for a new command within wpa_supplicant’s CLI - “TDLS_VNDR”. This command allows us to send a crafted TDLS vendor frame with arbitrary data to any MAC address (regardless of whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r a TDLS connection is established to that peer).

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


After creating two overlapping chunks, we can now use our controlled allocation primitive to allocate memory from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tail of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 larger chunk, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reby pointing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 smaller free chunk at a location of our choosing. Whichever location we choose, however, must have valid values for both cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365  “size” and “next” fields, ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise later calls to malloc and free may fail, possibly crashing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware. As a matter of fact, we’ve already seen perfect candidates to stand-in for free chunks - in-use chunks!

Recall that in-use chunks specify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir size field at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same location free chunks do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365irs. As for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “next” pointer, it is unused in free chunks, but is set to zero during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chunk. This means that by corrupting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 free list to point at an in-use chunk, we can trick cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap into thinking it’s just anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r free chunk, which is coincidentally also cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last chunk in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 freelist. That’s comfortable.

step1.png

Now all we need to do is find an in-use chunk containing information that we’d like to overwrite. If we make that chunk cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best-fitting chunk in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 free list for a subsequent controlled allocation, we’ll get our own data to be allocated cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re instead of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 in-use chunk’s data, effectively replacing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chunk’s contents. This means we’re able to arbitrarily replace cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of any in-use chunk.

As we’re interested in achieving full code execution, it would be advantageous to locate and overwrite a function pointer in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap. But… Where can we expect to find such values on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap? Well, for starters, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are some events in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi standards that must be handled periodically, such as performing scans for adjacent networks. It would probably be a safe bet to assume that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware supports handling such periodic timers by using a common API.

Since timers may be created during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s operation, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir data structures (e.g., which function to execute and when) must be stored on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap. To locate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se timers, we can reverse-engineer cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IRQ vector table entry, and search for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 logic corresponding to handling a timer interrupt. After doing so, we find a linked list of entries whose contents seem to conform to that of brcms_timer structure, used in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 brcmsmac (SoftMAC) driver. After writing a short script, we can dump cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 list of timers given a RAM snapshot:

Screenshot from 2017-03-13 16:22:51.png

We can see that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 timer list is ordered by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 timeout value, and most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 timers have a relatively short timeout. Moreover, all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 timers are allocated during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s initialisation, and are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore stored at constant addresses. This is important since, if we’d like to target our free chunk at a timer, we’d need to know it’s exact location in memory.

So all that’s left is to use our two primitives to replace cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 timers above with our own data, consequently pointing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 timer’s function at an address of our choosing.

Here’s cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game plan. First, we’ll use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 techniques described above to create two overlapping free chunks. Now, we can use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 controlled allocation primitive to point cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 smaller free chunk at one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 timers in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 list above. Next, we create anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r controlled allocation (freeing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 old one). This one will be of size 0x3C, for which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 timer chunk is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best-fitting. Therefore, at this point, we’ll overwrite cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 timer’s contents.

timer (1).png

But which function do we point our timer to? Well, we can use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same trick to commandeer anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r in-use chunk on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap, and overwrite its contents with our own shellcode. After briefly searching cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap, we come across a large chunk which simply contains console data during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip’s boot sequence, and is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n left allocated but unused. Not only is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocation is fairly large (0x400 bytes), but it is also placed at a constant address (since it is allocated during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s initialisation sequence) - perfect for our exploit.

Lastly, how can we be sure that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap is even executable? After all, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ARM Cortex R4 has a Memory Protection Unit (MPU). Unlike an MMU, it does not allow for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 facilitation of a virtual address space, but it does allow control over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 access permissions of different memory ranges in RAM. Using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MPU, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap could (and should) be marked as RW and non-executable.

By reversing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s initialisation routines in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 binary, we can see that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MPU is indeed being activated during boot. But what are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents with which it’s configured? We can find out by writing a small assembly stub to dump out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MPU:

0x00000000 - 0x10000000
AP: 3 - Full access
XN: 0
0x10000000 - 0x20000000
AP: 3 - Full access
XN: 0
0x20000000 - 0x40000000
AP: 3 - Full access
XN: 0
0x40000000 - 0x80000000
AP: 3 - Full access
XN: 0
0x80000000 - 0x100000000
AP: 3 - Full access
XN: 0

Ah-ha - while cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MPU is initialised, it is effectively set to mark all of memory as RWX, making it useless. This saves us some hassle… We can conveniently execute our code directly from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap.

So, at long last, we have an exploit ready! Putting it all togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r we can now hijack a code chunk to store our shellcode, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n hijack a timer to point it at our stored shellcode. Once cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 timer expires, our code will be executed on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware!

exploit (2).png

At long last, we’ve gone through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire process of researching cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 platform, discovering a vulnerability and writing a full-fledged exploit. Although this post is relatively long, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are many smaller details that I left out in favour of brevity. If you have any specific questions, please let me know. You can find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 full exploit, including instructions, here. The exploit includes a relatively benign shellcode, which simply writes a magic value to address 0x200000 in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s RAM, signalling successful execution.

Wrapping Up


We’ve seen that while cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware implementation on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi SoC is incredibly complex, it still lags behind in terms of security. Specifically, it lacks all basic exploit mitigations - including stack cookies, safe unlinking and access permission protection (by means of an MPU).

Broadcom have informed me that newer versions of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SoC utilise cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MPU, along with several additional hardware security mechanisms. This is an interesting development and a step in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right direction. They are also considering implementing exploit mitigations in future firmware versions.

In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next blog post, we’ll see how we can use our assumed control of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi SoC in order to furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r escalate our privileges into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application processor, taking over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host’s operating system!

56 comments:

  1. Could such an exploit allow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 use of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 FM band on iPhones that use broadcom chips for close stations even if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is no rx antenna ?

    ReplyDelete
  2. You guys are ****ing amazing.

    Over The Air: Exploiting Broadcom’s Wi-Fi Stack (Part 1)
    Exploiting Broadcom’s Wi-Fi Stack (Part 1)
    Wi-Fi Stack (Part 1)
    (Part 1)

    ReplyDelete
  3. Man that must have been fun.

    ReplyDelete
  4. Man that must have been fun.

    ReplyDelete
  5. Just a note: When you cast something from a phone via a Chromecast, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stream does not go through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 phone/casting device. The phone only tells cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Chromecast what to cast, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chromecast itself streams cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data directly from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 source. So your example isn't very relevant. :)

    ReplyDelete
    Replies
    1. Not necessarily, you can cast a chrome tab or your Nexus phone's full screen

      Delete
    2. If you cast your desktop cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n it behaves as he said. But you are correct in that most commonly people cast streamed data, which chrome cast is intelligent enough to get straight from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 source (aka. youtube or netflix).

      Delete
    3. I was referring to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "screen casting" feature, where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 phone streams cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 content to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Chromecast. This, AFAIK, uses TDLS to establish cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 connection in order to avoid congestion on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 AP.

      Delete
    4. While you are right about that regarding applications like Youtube or Netflix, ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r applications do make use of this, such as Chrome's tab casting feature and I believe Android also has such a feature for display mirroring. In this case, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 phone or computer simply is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 source and would cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore benefit from a direct connection as described.

      Delete
    5. By "casting a video from your mobile device", he means cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 video file is on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 phone, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 phone is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 source.

      Delete
    6. Out of curiosity, even if you are casting from netflix, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 phone still has to communicate with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Chromecast to keep track of time so you can pause, few, rewind and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r commands. At this point, would this traffic go over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 AP or direct over TDLS?

      Delete
  6. Awesome research and great article ;)

    I love to read such articles and getting myself more into this subject. I'm still struggling to find my path though.

    ReplyDelete
  7. Wow, what an amazing post. Great job, and thanks for taking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time to document it in such detail!

    ReplyDelete
  8. An awesome and detailed article! it's great!
    But I have a simple question, how do you know which subject or project you should work on?
    I mean, why did you decided to research on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se Broadcom chips instead of for example an application's vulnerability?

    ReplyDelete
    Replies
    1. I was wondering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same thing

      Delete
    2. I would also be highly interested how one decides what he wants to research. Hopefully Gal Beniamini will comment on this question ;)

      Delete
    3. We have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 freedom to pick our research subjects, so long as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're relevant. At cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 beginning of each quarter we think of research topics for that quarter, and set some estimated research goals. Anecdotally, both myself and halvarflake thought of this same research subject at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same time, independently; I guess this means its not that unique a subject.

      Delete
  9. If I read this correctly, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerable code is in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Broadcom SoftMAC layer that is integrated into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 FullMAC SoC ROM. Do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se vulnerabilities also affect devices using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 brcmsmac driver? I would expect at least a DoS via kernel panic.

    ReplyDelete
    Replies
    1. TDLS seems to be handled by on upper layer generic SoftMAC implementation
      https://github.com/torvalds/linux/blob/master/net/mac80211/tdls.c
      which is different.

      Delete
    2. Broadcom's SoftMAC driver does not include an implementation of TDLS (not all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MLME is included in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SoftMAC driver - in fact, most isn't). Instead, when brcmsmac is used, Linux's mac80211 provides cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TDLS implementation.

      Delete
  10. Thanks for your wonderful work.

    ReplyDelete
  11. Presumably laptops with brcmfmac wifi (e.g. Dell XPS 13 BCM4350) are vulnerable too?

    Any idea if wifi routers with Broadcom chipsets are also vulnerable? Or maybe some router firmware supports cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server side fast roaming features mentioned and is similarly exploitable. If so, that opens up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 possibility of a worm that can spread across both routers and phones.

    ReplyDelete
    Replies
    1. I think laptops which support cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 relevant feature sets (e.g., TDLS) are vulnerable as well. I just ran a short experiment by loading a laptop's firmware file on a mobile phone, and I could indeed reproduce cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TDLS crash. Unfortunately, it doesn't seem to me like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware images are updated... See: https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/tree/brcm

      As for routers - cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerabilities discussed here are in client-related code flows, so I don't believe cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y would affect routers.

      Delete
  12. Given cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right publicity, this research will sell cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most recent Pixel phones racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r well. Nicely played, Google.

    10 years ago, I ran a small managed service provider business. My business partner and I frequently joked that we should write a virus and send it to our clients if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 percentage of virus jobs ever decreased below a certain threshold. Tail wagging cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dog. It could happen one day.

    ReplyDelete
  13. Nice one

    you should have Poc for that

    ReplyDelete
  14. fwiw, on your rainbow stack - physical generates traffic far faster than application, is higher frequency, so application is red, physical is blue...

    ReplyDelete
  15. i'm using archos video player on my android device to stream content that is saved on my pc's hard disk.. it's pretty cool when i tell this to my friends! but now that you've covered this phenomenon in such a great detail.. i feel like a caveman again lol

    ReplyDelete
  16. When exits cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Part 2 of this fantastic article? Great job boys!

    ReplyDelete
    Replies
    1. It's out :) Here: https://googleprojectzero.blogspot.com/2017/04/over-air-exploiting-broadcoms-wi-fi_11.html

      Delete
  17. How much time did you approx. spend to get to this point?

    ReplyDelete
    Replies
    1. The entire research in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se two blog posts took around 2.5 months.

      Delete
  18. Is TDLS transparent to user land applications, or do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y need to explicitly request a tunneled link and use a separate socket?

    ReplyDelete
  19. This is amazing. Earlier today I happened to read about PartitionAlloc in Chrome, and how it keeps allocator metadata from living next to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data, and allows some stuff like sticking guard pages past cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end of a region so that linear overwrites can only muck things up within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir region.

    Do you think allocator changes are interesting as a mitigation here? Or less useful than it might seem? (Maybe cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re were a bunch of ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r routes to an exploit if allocator metadata weren't located in a handy place.) Or is it unrealistic for size/performance reasons in a limited environment like this? (Chrome is certainly not trying to run on an ARM R4 and 768KB RAM.)

    ReplyDelete
  20. Thank you. It'd probably be unrealistic; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MPU supports at-most 12 protection regions, so that's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 upper bound of guard pages, for example. That said, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocator can still be hardened quite a bit. One example being not having free-chunks strewn all over RAM where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can possibly overflow into important data (that'd also make enforcing MPU protection easier because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re would be less segmentation).

    ReplyDelete
    Replies
    1. Ah, interesting. Different world from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application programming I'm used to. Thanks for replying!

      Delete
  21. Great article! i can only imagine cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 happiness after all breadcrumbs have been put togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. Well done!

    ReplyDelete
  22. How to dump ROM and RAM with dhdutil, when i execute cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cmd: dhdutil -i wlan0 membytes -r 0x180000 0xc0000 > /sdcard/ram.bin, it always output "__dhd_dervier_io: Invalid argument"

    ReplyDelete
    Replies
    1. The command you posted works on my Nexus 6P. I would check dmesg for anything more descriptive, and make sure you're running this command from a sufficiently privileged context.

      Delete
  23. Hi! I wanted to write a version of this exploit for a local iPhone 4s, however, I was curious about something. In a separate, jailbroken 4s, I found cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 expected BCM firmware version string in /usr/share/firmware/wifi/4330b2/uno3.trx, however it did not have TDLS support listed in its version string, nor did it even have 802.11r FT support or CCKM support listed in it. On a jailbroken 6s, I noticed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same phenomenon in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 expected BCM firmware version string in /usr/share/firmware/wifi/C-4345__s-B1/barbera.trx: No TDLS, no 802.11r FT, no CCKM. Would this inherently mean that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir BCM chips do not have TDLS support? Could I be looking in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wrong directory? Initially I would worry that is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case, but considering that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re was an iOS 10.3.1 update for this very reason, I'm really confused. Would you know much about iOS's specific handling of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BCM firmware? I can post cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 version strings or send cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 files if it would help.
    Thanks!

    ReplyDelete
  24. The BCM firmware files on iPhones unfortunately don't contain cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tagged list of supported features, which makes it harder to find out which features are actually supported. Of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 features mentioned above, iPhones only support 802.11r FT.

    ReplyDelete
  25. Very nice work! Is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re any chance that you will publish your symbols/IDA files or push cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 nexmon guys?

    ReplyDelete
  26. And where is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 update for older iPhones?

    ReplyDelete
  27. 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
  28. Solid works!
    I have a question: why timer slab's size is zero when we have overwrited it's contents?

    ReplyDelete
  29. 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