Thursday, October 5, 2017

Using Binary Diffing to Discover Windows Kernel Memory Disclosure Bugs

Posted by Mateusz Jurczyk of Google Project Zero

Patch diffing is a common technique of comparing two binary builds of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same code – a known-vulnerable one and one containing a security fix. It is often used to determine cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 technical details behind ambiguously-worded bulletins, and to establish cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 root causes, attack vectors and potential variants of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerabilities in question. The approach has attracted plenty of research [1][2][3] and tooling development [4][5][6] over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 years, and has been shown to be useful for identifying so-called 1-day bugs, which can be exploited against users who are slow to adopt latest security patches. Overall, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 risk of post-patch vulnerability exploitation is inevitable for software which can be freely reverse-engineered, and is thus accepted as a natural part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ecosystem.

In a similar vein, binary diffing can be utilized to discover discrepancies between two or more versions of a single product, if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y share cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same core code and coexist on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 market, but are serviced independently by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendor. One example of such software is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows operating system, which currently has three versions under active support – Windows 7, 8 and 10 [7]. While Windows 7 still has a nearly 50% share on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 desktop market at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time of this writing [8], Microsoft is known for introducing a number of structural security improvements and sometimes even ordinary bugfixes only to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most recent Windows platform. This creates a false sense of security for users of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 older systems, and leaves cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m vulnerable to software flaws which can be detected merely by spotting subtle changes in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding code in different versions of Windows.

In this blog post, we will show how a very simple form of binary diffing was effectively used to find instances of 0-day uninitialized kernel memory disclosure to user-mode programs. Bugs of this kind can be a useful link in local privilege escalation exploit chains (e.g. to bypass kernel ASLR), or just plainly expose sensitive data stored in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel address space. If you're not familiar with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug class, we recommend checking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 slides of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Bochspwn Reloaded talk given at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 REcon and Black Hat USA conferences this year as a prior reading [9].

Chasing memset calls

Most kernel information disclosures are caused by leaving parts of large memory regions uninitialized before copying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m to user-mode; be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y structures, unions, arrays or some combination of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se constructs. This typically means that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel provides a ring-3 program with more output data than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is relevant information, for a number of possible reasons: compiler-inserted padding holes, unused structure/union fields, large fixed-sized arrays used for variable-length content etc. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se bugs are rarely fixed by switching to smaller buffers – more often than not, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original behavior is preserved, with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 addition of one extra memset function call which pre-initializes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 output memory area so it doesn't contain any leftover stack/heap data. This makes such patches very easy to recognize during reverse engineering.

When filing issue #1267 in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Project Zero bug tracker (Windows Kernel pool memory disclosure in win32k!NtGdiGetGlyphOutline, found by Bochspwn) and performing some cursory analysis, I realized that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug was only present in Windows 7 and 8, while it had been internally fixed by Microsoft in Windows 10. The figure below shows cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 obvious difference between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerable and fixed forms of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code, as decompiled by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Hex-Rays plugin and diffed by Diaphora:

Figure 1. A crucial difference in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 implementation of win32k!NtGdiGetGlyphOutline in Windows 7 and 10

Considering how evident cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 patch was in Windows 10 (a completely new memset call in a top-level syscall handler), I suspected cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re could be ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r similar issues lurking in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 older kernels that have been silently fixed by Microsoft in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 more recent ones. To verify this, I decided to compare cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of memset calls in all top-level syscall handlers (i.e. functions starting with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Nt prefix, implemented by both cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 core kernel and graphical subsystem) between Windows 7 and 10, and later between Windows 8.1 and 10. Since in principle this was a very simple analysis, an adequately simple approach could be used to get sufficient results, which is why I decided to perform cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 diffing against code listings generated by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IDA Pro disassembler.

When doing so, I quickly found out that each memory zeroing operation found in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel is compiled in one of three ways: with a direct call to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memset function, its inlined form implemented with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rep stosd x86 instruction, or an unfolded series of mov x86 instructions:

Figure 2. A direct memset function call to reset memory in nt!NtCreateJobObject (Windows 7)

Figure 3. Inlined memset code used to reset memory in nt!NtRequestPort (Windows 7)

Figure 4. A series of mov instructions used to reset memory in win32k!NtUserRealInternalGetMessage (Windows 8.1)

The two most common cases (memset calls and rep stosd) are both decompiled to regular invocations of memset() by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Hex-Rays decompiler:

Figures 5 and 6. A regular memset call is indistinguishable from an inlined rep movsd construct in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Hex-Rays view

Unfortunately, a sequence of mov's with a zeroed-out register as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 source operand is not recognized by Hex-Rays as a memset yet, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of such occurrences is relatively low, and hence can be neglected until we manually deal with any resulting false-positives later in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end, we decided to perform cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 diffing using decompiled .c files instead of regular assembly, just to make our life a bit easier.

A complete list of steps we followed to arrive at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 final outcome is shown below. We repeated cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m twice, first for Windows 7/10 and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n for Windows 8.1/10:

  1. Decompiled ntkrnlpa.exe and win32k.sys from Windows 7 and 8.1 to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir .c counterparts with Hex-Rays, and did cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same with ntoskrnl.exe, tm.sys, win32kbase.sys and win32kfull.sys from Windows 10.
  2. Extracted a list of kernel functions containing memset references (taking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir quantity into account too), and sorted cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m alphabetically.
  3. Performed a regular textual diff against cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two lists, and chose cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 functions which had more memset references on Windows 10.
  4. Filtered cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 output of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous step against cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 list of functions present in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 older kernels (7 or 8.1, again pulled from IDA Pro), to make sure that we didn't include routines which were only introduced in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latest system.

In numbers, we ended up with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following results:


ntoskrnl functions
ntoskrnl syscall handlers
win32k functions
win32k syscall handlers
Windows 7 vs. 10
153
8
89
16
Windows 8.1 vs. 10
127
5
67
11
Table 1. Number of old functions with new memset usage in Windows 10, relative to previous system editions

Quite intuitively, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows 7/10 comparison yielded more differences than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows 8.1/10 one, as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system progressively evolved from one version to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next. It's also interesting to see that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 graphical subsystem had fewer changes detected in general, but more than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 core kernel specifically in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 syscall handlers. Once we knew cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 candidates, we manually investigated each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m in detail, discovering two new vulnerabilities in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 win32k!NtGdiGetFontResourceInfoInternalW and win32k!NtGdiEngCreatePalette system services. Both of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m were addressed in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 September Patch Tuesday, and since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y have some unique characteristics, we will discuss each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subsequent sections.

win32k!NtGdiGetFontResourceInfoInternalW (CVE-2017-8684)

The inconsistent memset which gave away cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existence of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug is as follows:

Figure 8. A new memset added in win32k!NtGdiGetFontResourceInfoInternalW in Windows 10

This was a stack-based kernel memory disclosure of about 0x5c (92) bytes. The structure of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function follows a common optimization scheme used in Windows, where a local buffer located on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack is used for short syscall outputs, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pool allocator is only invoked for larger ones. The relevant snippet of pseudocode is shown below:

Figure 9. Optimized memory usage found in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 syscall handler

It's interesting to note that even in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerable form of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 routine, memory disclosure was only possible when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first (stack) branch was taken, and thus only for requested buffer sizes of up to 0x5c bytes. That's because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dynamic PALLOCMEM pool allocator does zero out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 requested memory before returning it to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 caller:

Figure 10. PALLOCMEM always resets allocated memory

Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue is also a great example of how anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r peculiar behavior in interacting with user-mode may contribute to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 introduction of a security flaw (see slides 32-33 of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Bochspwn Reloaded deck). The code pattern at fault is as follows:

  1. Allocate a temporary output buffer based on a user-specified size (dubbed a4 in this case), as discussed above.
  2. Have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 requested information written to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel buffer by calling an internal win32k!GetFontResourceInfoInternalW function.
  3. Write 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 entire temporary buffer back to ring-3, regardless of how much data was actually filled out by win32k!GetFontResourceInfoInternalW.

Here, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerable win32k!NtGdiGetFontResourceInfoInternalW handler actually "knows" cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length of meaningful data (it is even passed back to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user-mode caller through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 5th syscall parameter), but it still decides to copy cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 full amount of memory requested by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 client, even though it is completely unnecessary for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 correct functioning of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 syscall:

Figure 11. There are v10 output bytes, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function copies cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 full a4 buffer size.

The combination of a lack of buffer pre-initialization and allowing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 copying of redundant bytes is what makes this an exploitable security bug. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 proof-of-concept program, we used an undocumented information class 5, which only writes to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first four bytes of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 output buffer, leaving cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 remaining 88 uninitialized and ready to be disclosed to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker.

win32k!NtGdiEngCreatePalette (CVE-2017-8685)

In this case, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability was fixed in Windows 8 by introducing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following memset into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 syscall handler, while still leaving Windows 7 exposed:

Figure 12. A new memset added in win32k!NtGdiEngCreatePalette in Windows 8

The system call in question is responsible for creating a kernel GDI palette object consisting of N 4-byte color entries, for a user-controlled N. Again, a memory usage optimization is employed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 implementation – if N is less or equal to 256 (1024 bytes in total), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se items are read from user-mode to a kernel stack buffer using win32k!bSafeReadBits; ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are just locked in ring-3 memory by calling win32k!bSecureBits. As you can guess, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory region with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extra memset applied to it is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 local buffer used to temporarily store a list of user-defined RGB colors, and it is later passed to win32k!EngCreatePalette to actually create cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 palette object. The question is, how do we have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer remain uninitialized but still passed for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 creation of a non-empty palette? The answer lies in 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 win32k!bSafeReadBits routine:

Figure 13. Function body of win32k!bSafeReadBits

As you can see in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 decompiled listing above, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function completes successfully without performing any actual work, if eicá 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 source or destination pointer is NULL. Here, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 source address comes directly from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 syscall's 3rd argument, which doesn't undergo any prior sanitization. This means that we can make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 syscall think it has successfully captured an array of up to 256 elements from user-mode, while in reality cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack buffer isn't written to at all. This is achieved with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following system call invocation in our proof-of-concept program:

HPALETTE hpal = (HPALETTE)SystemCall32(__NR_NtGdiEngCreatePalette, PAL_INDEXED, 256, NULL, 0.0f, 0.0f, 0.0f);

Once cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 syscall returns, we receive a handle to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 palette which internally stores cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 leaked stack memory. In order to read it back to our program, one more call to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GetPaletteEntries API is needed. To reiterate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 severity of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug, its exploitation allows an attacker to disclose an entire 1 kB of uninitialized kernel stack memory, which is a very powerful primitive to have in one's arsenal.

In addition to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory disclosure itself, ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r interesting quirks can be observed in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 nearby code area. If you look closely at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code of win32k!NtGdiEngCreatePalette in Windows 8.1 and 10, you will spot an interesting disparity between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m: cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack array is fully reset in both cases, but it's achieved in different ways. On Windows 8.1, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function "manually” sets cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first DWORD to 0 and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n calls memset() on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 remaining 0x3FC bytes, while Windows 10 just plainly memsets cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole 0x400-byte area. The reason for this is quite unclear, and even though cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end result is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 discrepancy provokes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 idea that not just cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existence of memset calls can be compared across Windows versions, but also possibly cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 size operands of those calls.

Figure 14. Different code constructs used to zero out a 256-item array on Windows 8.1 and 10

On a last related note, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 win32k!NtGdiEngCreatePalette syscall may be also quite useful for stack spraying purposes during kernel exploitation, as it allows programs to easily write 1024 controlled bytes to a continuous area of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack. While cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer size is smaller than what e.g. nt!NtMapUserPhysicalPages has to offer, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer itself ends at a higher offset relative to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack frame of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 top-level syscall handler, which can make an important difference in certain scenarios.

Conclusions

The aim of this blog post was to illustrate that security-relevant differences in concurrently supported branches of a single product may be used by malicious actors to pinpoint significant weaknesses or just regular bugs in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 more dated versions of said software. Not only does it leave some customers exposed to attacks, but it also visibly reveals what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack vectors are, which works directly against user security. This is especially true for bug classes with obvious fixes, such as kernel memory disclosure and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 added memset calls. The "binary diffing" process discussed in this post was in fact pseudocode-level diffing that didn't require much low-level expertise or knowledge of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operating system internals. It could have been easily used by non-advanced attackers to identify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 three mentioned vulnerabilities (CVE-2017-8680, CVE-2017-8684, CVE-2017-8685) with very little effort. We hope that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se were some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 very few instances of such "low hanging fruit" being accessible to researchers through diffing, and we encourage software vendors to make sure of it by applying security improvements consistently across all supported versions of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir software.

References


Tuesday, October 3, 2017

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

Posted by Gal Beniamini, Project Zero

In this blog post we’ll continue our journey towards over-cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365-air exploitation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone, by means of Wi-Fi communication alone. This part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 research will focus on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware running on Broadcom’s Wi-Fi SoC present on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone 7.

We’ll begin by performing a deep dive into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware itself; discovering new attack surfaces along cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way. After auditing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se attack surfaces, we’ll uncover several vulnerabilities. Finally, we’ll develop a fully functional exploit against one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned vulnerabilities, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reby gaining code execution on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone 7’s Wi-Fi chip. In addition to gaining code execution, we’ll also develop a covert backdoor, allowing us to remotely control cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip over-cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365-air.


Along cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way, we’ll come across several new security mechanisms developed by Broadcom. While cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se mechanisms carry cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 potential to make exploitation harder, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y remained racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r ineffective in this particular case. By exploring cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mechanisms cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves, we were able to discover methods to bypass cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir intended protections. Nonecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365less, we remain hopeful that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issues highlighted in this blog post will help inspire stronger mitigations in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 future.

All cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerabilities presented in this blog post (#1, #2, #3, #4, #5) were reported to Broadcom and subsequently fixed. I’d like to thank Broadcom for being highly responsive and for handling cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issues in a timely manner. While we did not perform a full analysis on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 breadth of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se issues, a minimal analysis is available in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 introduction to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous blog post.

And now, without furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r ado, let’s get to it!

Exploring The Firmware


Combining cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extracted ROM image we had just acquired with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 resident RAM image, we can finally piece togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 complete firmware image. With that, all that remains is to load cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image into a disassembler and begin exploring.

While 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 BCM4355C0 is slightly larger than that of previously analysed Android-resident Wi-Fi chips, it’s still racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r small (spanning only 896KB). Consequently, Broadcom has once again employed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same tricks in order to conserve as much memory as possible; including compiling cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bulk of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Thumb-2 instruction set and stripping away most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 symbols.

As for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM’s layout, it follows cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same basic structure as that of its Android counterparts; beginning with a code chunk, followed by a blob of constant data (including strings and CRC polynomials), and ending with “trampolines” into detection points in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware’s RAM (and some more spare data).


The same cannot be said of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM image; while some similarities exist between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current image and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previously analysed ones, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir internal layouts are substantially different. Whereas Android-resident firmwares contained interspersed heap chunks between code and data blobs, this quirk is no longer present in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current RAM image. Instead, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap chunks are mostly placed in a linear fashion. One exception to this rule is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initialisation code present in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM -- once cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s bootup process completes, this blob is reclaimed, and is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reafter converted into an additional heap chunk.


Curiously, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack is no longer located after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap, but racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r precedes it. This modification has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 advantage of preventing potential collisions between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap (which were possible in previous firmware versions).

To furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r our understanding of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware, let’s attempt to identify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 set of supported high-level features. While ROM images typically contain a wealth of features, not all OEMs choose to utilise every single feature. Instead, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 supported features are governed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM’s contents, which selectively adds support for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 capabilities chosen by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OEM.

In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 context of Android-resident firmware images, identifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 supported features was made easier due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 inclusion of “feature tags” within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 version string embedded in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s RAM image. Each tag indicated support for a corresponding feature within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware image. Unfortunately, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone’s Wi-Fi firmware images made away with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 detailed version strings, and instead opted for a generic string containing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 build type and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip’s revision:


Nevercá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365less, we can still gain some insight into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s feature set, by reverse-engineering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware itself. Let’s take a look inside and see what we can find!

It’s Bigger On The Inside


Although most symbols have been stripped from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s ROM image, whatever symbols remain hint at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 features supported by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image. Indeed, going over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 strings in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 combined image (mostly cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM is nearly devoid of strings), we come across many of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 features we’ve identified in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past. Surprisingly, however, we also find a great deal of new features.

While adding features can (sometimes) result in better user experience, it’s important to remember that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip is a highly privileged component.

First, as a network interface, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip has access to all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host’s Wi-Fi traffic (both inbound and outbound). Therefore, attackers controlling cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware can leverage this vantage point to inject or manipulate data viewed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host. One avenue of attack would cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore be to manipulate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host’s unencrypted web traffic and insert a browser exploit, allowing attackers to gain control over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding process on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host. Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r applications on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host which rely on unencrypted communications may be similarly attacked.

In addition to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned attack surface, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware itself can carry out attacks against cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host. As we’ve seen in previous blog posts, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip communicates with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host using a variety of control messages and through a privileged physical interface (e.g., PCIe); if we were to find errors in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host’s processing of any of those, we might be able to take over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host itself (indeed, we’ll carry out such attacks in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next blog post!).


Due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above risks, it’s important that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TCB constituted by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip remain relatively small. Any components added to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware carry cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 risk of vulnerabilities being introduced into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware which would subsequently allow attackers to assume control over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip (and perhaps even cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire system).

This risk is compounded by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware employs far fewer defence mechanisms than modern operating systems. Most notably, it does not employ ASLR, does not have stack cookies and fails to implement safe heap unlinking. Therefore, even relatively weak primitives may be exploitable within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware (in fact, we’ll see just such an example later on!).

With that in mind, let’s take a look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 features present in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware. It’s important to note that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mere presence of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se code paths in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware does not imply that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are enabled by default. Racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, in most cases cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host chooses whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r to enable specific features, depending on user or network related configurations.

Apple-Specific Features


After some preliminary exploration, we come across a group of unfamiliar strings referencing a feature called “AWDL”. This acronym refers to “Apple Wireless Direct Link”; an Apple-specific protocol designed to provide peer-to-peer connectivity, notably used by AirDrop and AirPlay. The presence of Apple-specific functionality within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM affirms cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 suspicion that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se Wi-Fi chips are used exclusively by Apple devices.

From a security perspective, it appears that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack surface exposed by this functionality within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware is racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r limited. The firmware contains mechanisms for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 configuration of AWDL-related features, but such operations are driven primarily by host-side logic (via AppleBCMWLANCore and IO80211Family).

Moving right along, we come across anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r group of unexpected strings:


This code originates from mDNSResponder, Apple’s open-source implementation of Multicast DNS (a standardised zero-configuration service commonly used within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Apple ecosystem).

Reverse-engineering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above fragments, we come to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 realisation that it is a stripped-down version of mDNSResponder, mostly responsible for performing wake on demand via mDNS (for networks that include a Bonjour Sleep Proxy). Consequently, it does not offer all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 functionality provided by a fully-fledged mDNS client. Nonecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365less, embedding code from complex libraries such as mDNSResponder could carry undesired side effects.

For starters, mDNSResponder itself has been affected by several security issues in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past. More subtly, non-security bugs in libraries can become security-relevant when migrating between systems whose characteristics differ so widely from one anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. Concretely, on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip address zero points to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s interrupt vectors -- a mapped, writable address. Being able to modify this address would allow attackers to gain code-execution on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reby converting a class of “benign” bugs, such as a null-pointer accesses, to RCEs.

Offloading Mechanisms


Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi SoC’s ARM core is less power-hungry than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application processor, it stands to reason that some network related functionality be relegated to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware, when possible. This concept is neicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r new, nor is it unique to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mobile settings; offloading to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NIC occurs in desktop environments as well, primarily in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form of TCP offloading (via TOE) .

Regardless, while cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 advantages of offloading are clear, it’s important to be aware of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 potential downsides as well. For starters, as we’ve mentioned before, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 more features are added into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 less auditable it becomes. Additionally, offloading features often require parsing of high-level protocols. Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware does not contain its own TCP/IP stack, it must resort to parsing all layers in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack manually, up to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 layer at which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 offloading occurs.

Inspecting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware reveals at least two features which allow offloading of high-level protocols to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware: ICMPv6 offloading and TCP KeepAlive offloading. Apple’s host-side drivers contain controls for enabling and disabling cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se offloading features (see AppleBCMWLANCore), subsequently handing over control over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se packets to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host.

While beyond cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 scope of this blog post, auditing both of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned offloading features revealed two security bugs allowing attackers to eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r leak constrained data from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware or to crash cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware running on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi SoC (for more information see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug tracker entries linked above).

Generic Attack Surfaces


While cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned attack surfaces may be interesting from an exploratory point of view, each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 outlined features was racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r constrained in scope. Perhaps, we could find a more fruitful attack surface within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware?

...This is where some familiarity with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi standards comes in handy!

Wi-Fi frames can be split into three distinct categories. Each frame is assigned a category by inspecting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “type” and “subtype” fields in its MAC header:


The categories are as follows:

  • Data Frames - Carry data (and QoS data) over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi network.
  • Control Frames - Body-less frames assisting with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 delivery of ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r frames (using ACKs, RTS/CTS, Block ACKs and more).
  • Management Frames - Perform complex operations, including connecting to a network, modifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 state of individual stations (STAs), aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365nticating and more.

Let’s take a second to consider cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 categories above from a security PoV.

While data frames contain interesting attack surfaces (such as frame aggregation via A-MSDU/A-MPDU), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y hide little complexity ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise. Conversely, features present directly on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RX-path, such as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned offloading mechanisms, are generally also accessible through data frames, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reby increasing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exposed attack surface. Control frames, 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, offer limited complexity and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore do not significantly contribute to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack surface.

Unlike cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first two categories, management frames are where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 majority of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s complexity lays. Many of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mechanisms encapsulated by management frames make for interesting targets in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own right; including aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication and association. However, we’ll choose to focus on one subtype offering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 largest attack surface of all -- Action Frames.

Most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 logic behind “advanced” Wi-Fi features (such as roaming, radio measurements, etc.) is implemented by means of Action Frames. As cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir name implies, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se frames trigger “actions” in stations within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 network, potentially modifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir state.

Curiously, unlike data frames, management frames (and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore action frames as well) are normally unencrypted, even if networks employ security protocols such as WPA/WPA2. Instead, certain management frames can be encrypted by enabling 802.11w Protected Management Frames. When enabled, 802.11w allows for confidentiality of those frames’ contents, as well as a form of replay protection.

Summing up, action frames constitute a large portion of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack surface -- cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are mostly unprotected frames, using which state-altering functionality is carried out. To discover cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exact extent of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir exposed attack surface, let’s explore those frames in more depth.

Action Frames


Consulting IEEE 802.11-2016 (9-47), full list of action frame categories is quite formidable:


To illustrate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 amount of complexity encapsulated by action frames, let’s return to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone’s Wi-Fi firmware. Tracing our way through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RX-path, we quickly reach cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function at which action frames are handled within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware (referred to as “wlc_recv_mgmtact” in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM):

wlc_recv_mgmtact - 0x1A79F4

As we can see, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function performs some preliminary operations, before handing off processing to one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 numerous handlers within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware. Each action frame category is delegated to a single handler. Counting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 action frame handlers and corresponding frame types supported by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone’s firmware, we find 13 different supported categories, resulting in 34 different supported frame types. This is a substantial attack surface to explore!

To assess cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 handlers’ security, we’ll reverse-engineer each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above functions. While this is a slow and racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r tedious process, recall that each vulnerability found in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above handlers implies a triggerable over-cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365-air vulnerability in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip.

Before attempting a manual audit, we also “fuzzed” cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 action frame handlers. To do so, we developed an on-chip Wi-Fi fuzzer, allowing injection of frames directly into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned handler functions (without transmitting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 frames over-cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365-air). While cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzer allowed for high-speed injection of frames (namely, thousands of frames per second), running it using a small corpus of action frames and inducing bit-flips in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m was unfruitful... One possible explanation for this approach’s failure is due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 strict structure mandated by many action frames. Perhaps cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se results could be improved by fuzzing based on a grammar derived from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi standard, or enforcing structure constraints on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzed content.


Regardless, we can employ some tricks to speed up our manual exploration. Recall that Wi-Fi primarily relies on Information Elements (IEs), tagged bundles of data, to convey information. The same principle applies to action frames -- cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir payloads typically consist of multiple IEs, each encapsulating different pieces of information relating to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 handled frame. As cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IE tags are (mostly) unique within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi standard, we can simply lookup cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tag value corresponding to each processed IE, allowing us to quickly familiarise ourselves with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 surrounding code.

After going through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 handlers outlined above, we identified a number of vulnerabilities.

First, we discovered a vulnerability in 802.11v Wireless Network Managements (WNM). WNM is a set of standards allowing clients to configure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves within a wireless network and to exchange information about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 network’s topology. Within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 WNM category, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “WNM Sleep Mode Response” frame serves to update cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Group Temporal Key (GTK) when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 set of peers in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 network changes. As it happens, reverse-engineering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 WNM handler revealed that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding function failed to verify 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 encapsulated GTK, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reby triggering a controlled heap overflow (see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug tracker for more information).

By cross-referencing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GTK handling method, we were able to identify a similar vulnerability in 802.11r Fast BSS Transition (FBT). Once again, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware failed to verify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GTK’s length, resulting in a heap overflow.

While both of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above vulnerabilities are interesting in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own right, we will not discuss cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m any furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r in this blog post. Instead, we’ll focus on a different vulnerability altogecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r; one with a weaker primitive. By demonstrating how even relatively “weak” primitives can be exploited on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware, we’ll showcase cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 need for stronger exploit mitigations.

To make matters more interesting, we’ll construct our entire exploit using nothing but action frames. These frames are so feature-rich, that by leveraging cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m we will be able to perform heap shaping, create allocation primitives, and of course, trigger cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability itself.

802.11k Radio Resource Management


802.11k is an amendment to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi standard aiming to bring Radio Resource Management (RRM) capabilities to Wi-Fi networks. RRM-capable stations in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 network are able to perform radio measurements (and receive cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m), allowing access points to reduce cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 congestion and improve traffic utilisation in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 network. The concept itself is not new in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mobile sphere; in fact, it’s been around in cellular networks for over two centuries.

Within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi ecosystem, RRM is commonly utilised in tandem with 802.11r FBT (or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 proprietary CCKM) to enable seamless access point assisted roaming.  As stations decide to “handover” to different access points (based on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir radio measurements), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can consult cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 access points within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 network in order to obtain a list of potential neighbours with which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y may reassociate.

To implement all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above, a set of action frames (and a new action category) have been added to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi standard. Consequently, clients can perform radio and link measurement requests, receive cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding reports, and even process reports containing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir neighbouring access points (should cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y decide to roam).

All of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above functionality is also present in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone:


Auditing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 handlers above, we come across one function of particular note; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 handler for Neighbor Report Response frames.

The Vulnerability


Neighbor Report Response (NRREP) frames are reports delivered from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 access point to stations in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 network, informing stations of neighbouring access points in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir vicinity. Upon roaming, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stations may use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se parameters to reassociate with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned neighbours. Providing this information spares cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stations cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 need to perform extensive scans on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own -- a racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r time consuming operation. Instead, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y may simply rely on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 report, informing it of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 specific channels and operating classes inhabited by each neighbour.

Like many action frames, NRREPs also contain a “dialog token” (9.6.7.7). This 1-byte field is used to correlate between requests issued by a client, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir corresponding responses. As cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir name implies, Neighbour Report Responses are typically transmitted in response to a corresponding request made by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 client earlier on (commonly as a result of a radio measurement indicating that a roam may be imminent). As we’d expect, upon sending a Neighbor Report Request, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 client generates and embeds a dialog token, which in later verified by it when processing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding NRREP returned by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 access point.

However, reading more carefully through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 specification reveals anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r interesting scenario! It appears that NRREPs may also be entirely unsolicited. In such a case, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dialog token is simply set to zero, indicating that no matching request exists.

IEEE 802.11-2016, 9.6.7.7

Consequently, NRREPs may be transmitted over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 network to any client at any time, so long as it supports 802.11k RRM. Upon reception of such a report (with a zeroed dialog token), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 client will simply parse cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 request and handle cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rein.

Continuing to read through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 standard, we can piece togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 frame’s overall structure; starting from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 action frame header, all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 encapsulated IE:


As we can see above, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bulk of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NRREP frame is conveyed through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Neighbour Report” IE. NRREPs may contain one or more such IEs, each indicating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 presence of a single neighbour.

Now that we have a firm understanding of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 frame’s structure, let’s take a look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s implementation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 functionality described above. Following along from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initial NRREP handler, we quickly come to a ROM function responsible for handling cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reports. 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 high-level logic:

1.  int wlc_rrm_recv_nrrep(void* ctx, ..., uint8_t* body, uint32_t bodylen) {
2.
3.     //Ensuring cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 request is valid
3.     if (bodylen <= 2 || !g_rrm_enabled || body[2] != stored_dialog_token)
4.         ... //Handle error
5.
6.     //Freeing all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previously stored reports
7.     free_previous_nrreps(ctx, ...);
8.
9.     //Stripping cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 action Header
10     uint8_t* report_ie = body + 3;
11.    bodylen -= 3;
12.
13.    //Searching for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 report IE
14.    do {
15.        ... //Verify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IE is valid
16.        if (report_ie[0] == 52 && report_ie[1] > 0xC) //Tag, Length
17.            break; //Found a matching IE!
18.    } while (report_ie = bcm_next_tlv(report_ie, &bodylen));
19.    if (!report_ie)
20.        ... //Handle error
21.    
22.    //Handle cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 report
23.     uint8_t* nrrep_data = malloc(28);
24.     if (!nrrep_data)
25.         ... //Handle error
26.
27.     memcpy(nrrep_data + 6, report_ie + 2, 6); //Copying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BSSID
28.     ...                                       //Copying ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r elements...
29.     nrrep_data[16] = report_ie[12];           //Operational Class
30.     nrrep_data[17] = report_ie[13];           //Channel Number
31.
32.     //Processing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 report
33.     void* elem = wlc_rrm_regclass_neighbor_count(ctx, nrrep_data, ...);
34.     ...
35. }

As we can see above, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function begins by performing some cursory validation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 received request. Namely, it ensures that RRM is enabled within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 network, that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 report is sufficiently long, and that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 received dialog token matches cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stored one (if a solicited request was initiated by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 client, ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stored token is set to zero).

After performing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 necessary validations and locating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 report IE, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function proceeds to extract cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 encoded report information and store it within a structure of its own. Finally, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 newly created structure is passed on for processing within wlc_rrm_regclass_neighbor_count. Let’s take a closer look:

1.  void* wlc_rrm_regclass_neighbor_count(void* ctx, uint8_t* nrrep_data, ...) {
2.
3.      //Searching for previous stored elements with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same Operational
4.      //Class and Channel Number
5.      if (find_nrrep_buffer_and_inc_channel_idx(ctx, nrrep_data, ...))
6.          return NULL;
7.      
8.      //Creating a new element to hold cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NRREP data
9.      uint8_t* elem = zalloc(456);
10.     if (!elem)
11.         ... //Handle error
12.     elem[4] = nrrep_data[16];                  //Operational Class
13.     ((uint16_t*)(elem + 6))[nrrep_data[17]]++; //Channel Number
14.
15.     //Adding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 element to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 linked list of stored NRREPs
16.     *((uint8_t**)elem) = ctx->previous_elem;
17.     ctx->previous_elem = elem;
18.     return elem;
19. }

As shown in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 snippet above, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware keeps a linked list of buffers, one per “Operational Class”. Each buffer is 456 bytes long, and contains cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operational class, an array holding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of neighbours per channel, and a pointer to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next buffer in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 list.

While not shown above, find_nrrep_buffer_and_inc_channel_idx performs a similar task - it goes over each element in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 list, looking for an entry matching cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current operational class. Upon finding a matching element, it increments cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 neighbour count at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 index corresponding to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 given channel number, and returns 1, indicating success.

So why are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se handlers interesting? Consider that valid 802.11 channel numbers range from 1-14 in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 2.4GHz spectrum, all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way up to 196 in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 5GHz spectrum. Since each neighbour count field in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 array above is 16-bits wide, we can deduce that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 neighbour count array can be used to reference channel numbers up to 224 ((456 - 6)/sizeof(uint16_t) == 224).

However, looking a little closer it appears that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 functions above make no attempt to validate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Channel Number field! Therefore, malicious attackers can encode whatever value cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y desire in that field (up to 255). Encoding a value larger than 224 will cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore trigger a 16-bit increment to be performed out-of-bounds (see line 13), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reby corrupting memory after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NRREP buffer!

Understanding The Primitive


Before we move on, let’s take a second to understand cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit primitive -- as mentioned above, we are able to perform 16-bit increments (which are also 16-bit aligned), spanning up to 60 bytes beyond our allocated buffer.

Oddly, while cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 standards specify that each NRREP may contain several encoded reports (each of which should be handled by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 receiving station), it appears that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 handler functions above only processes a single IE at a time. Therefore, each NRREP we send will be able to trigger a single OOB increment.

9.6.7.7

This last fact ties in racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r annoyingly with anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r quirk in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s code -- namely, upon reception of each NRREP, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 list of stored NRREP elements is freed before proceeding to process cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current element (see line 7, where free_previous_nrreps is invoked). It remains unclear whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r this is intended behaviour or a bug, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 immediate consequence of this oddity is that following each OOB increment, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffers are subsequently freed, allowing ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r objects to take cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir place.

Lastly, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reception of each NRREP triggers two allocations of distinct sizes; one for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 linked list element (456 bytes), and anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r to store cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 report’s data (28 bytes). As a result, any heap shaping or grooming we’ll perform will have to take both allocations into consideration.

Triggering The Vulnerability

Configuring The Network


To begin developing our exploit, we’ll use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same test network environment we described in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous blog post, using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following topology:


As we’re going to leverage NRREPs, it’s important to set up our test network to support neighbour reports. Like many auxiliary Wi-Fi features, support for NRREPs is indicated by setting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding bit in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 capability IEs broadcast in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 network’s beacon. RRM-related functionality is encoded using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “RM Enabled Capabilities” information element.

Since we’re using hostapd to broadcast our network, we’ll enable cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rrm_neighbor_report setting in our network’s configuration. Enabling this feature should set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding field in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “RM Enabled Capabilities” IE to indicate support for neighbour reports. Let’s inspect a beacon frame to make sure:


Alright, seems like our network configuration is valid! Next, we’ll want to construct an interface allowing us to send arbitrary neighbour reports to peers in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 network.

To do so, we’ll extend hostapd by adding new commands to its control interface. Each new command will correspond to a single frame type we’d like to inject. After adding our code to hostapd, we can simply connect to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 control interface and issue cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding commands, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reby triggering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 transmission of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 requested frames from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 access point to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 selected peer. You can find our patches to hostapd in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit bundle on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug tracker.


It should be noted that this approach is not infallible. Since we’re utilising a SoftMAC dongle to transmit our internal network, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SoftMAC layer of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Linux Kernel is responsible for some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MLME processing done on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host. Therefore, it’s possible that processing done by this layer will interfere with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 frames we wish to send (or receive) during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit’s flow. To get around this limitation, we’ve taken care to construct cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 frames in a manner that does not clash with Linux’s SoftMAC stack.

Sending NRREPs


After configuring and broadcasting our network, we can finally attempt to trigger cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability itself. This brings us to a racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r important question; how will we know 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 vulnerability was triggered successfully or not? After all, a single 16-bit increment may be insufficient to cause significant corruption of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s memory. Therefore it’s entirely possible that while cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OOB access will occur, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware will happily chug along without crashing, leaving no observable effects indicating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability was triggered.

Remembering our Wi-Fi debugger from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous blog post, one course of action immediately springs to mind -- why not simply hook cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NRREP processing function with our own handler, and see whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r our handler is invoked upon transmitting a malicious NRREP? This is easier said than done; it turns out most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NRREP handling functionality (especially cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 actual vulnerability trigger, which we’re interested in) is located within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM, preventing us from inserting a hook.

As luck would have it, a new feature developed by Broadcom can be leveraged to solve this issue. To allow tracing different parts of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s logic, including cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM, Broadcom have introduced a set of logging functions embedded throughout cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware. Curiously, this mechanism was not present in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Android-resident firmwares we had analysed in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past.

Reverse-engineering this mechanism, it appears to operate in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following manner: each trace is assigned an identifier, ranging from 0x0 to 0x50. When a trace is requested, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware inspects an internal array of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same size stored in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s RAM, to gage 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 trace with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 given identifier has been enabled or not. Each identifier has a corresponding 8-bit mask representing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 types of traces enabled for it. As we are able to access cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s RAM, we can simply enable any trace we like by setting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding bits in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trace array. Subsequently, traces with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same ID will be outputted to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s console, allowing us to handily dump cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m using our Wi-Fi firmware debugger.



Using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above API, we can now enable cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 traces referenced in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NRREP’s ROM handlers. Taking a closer look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NRREP handling function in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware, we come across cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following traces:


Alright, so we’ll need to enable log identifier 0x16 to observe cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se traces. After enabling cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trace, sending an NRREP and reading out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s console, we are greeted with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following result:


Great! Our traces are being hit, indicating that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NRREP is successfully received by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 station. With that, let’s move on to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next step - devising an exploit strategy.

An Exploit Strategy

Understanding The Heap


Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability in question is a heap memory corruption, it’s important that we take a second to familiarise ourselves with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocator’s implementation. In short, it is a “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).

Free chunks consist of a 32-bit size field and a 32-bit “next” pointer, followed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chunk’s contents. In-use chunks contain a single 32-bit size field, of which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 top 30 bits denote cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chunk’s size, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bottom 2 bits indicate status bits. Putting it togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, we arrive at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following layout:

Sketching An Exploit Strategy


Before we rush ahead, let’s begin by devising a strategy. We already know that our exploit primitive allows us to perform 16-bit increments, spanning up to 60 bytes beyond our allocated buffer.


It’s important to note that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap’s state, perhaps surprisingly, is incredibly stable -- little to no allocations are performed. What little allocations are made, are immediately freed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reafter. As for frames carrying traffic (received or transmitted); cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are not carved from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap, but racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r drawn from a special “pool”. As such, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 presence of traffic should not affect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap’s state.

The heap’s stability is a double-edged sword; on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one hand, we are guaranteed relative convenience when shaping and modifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap’s state, as no allocations ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than our own will interfere with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap’s structure. 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, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 set of allocations that can be made (and subsequently, targeted by us using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability primitive) is limited.

Indeed, going over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 action frame handlers and searching for objects which may serve as viable targets for modification, we come up empty handed. The only data types that may be allocated eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r store cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir “interesting” data farcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than 56 bytes away from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir origin (accounting for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 in-use chunk’s header), or simply do not contain “interesting” data for modification.

Perhaps, instead, we could leverage cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap itself to hijack cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 control flow? If we were able to hijack cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “next” pointer of a free chunk and subsequently point it at a location of our choosing, we could overwrite cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 target address with a subsequent allocation’s contents. This prospect sounds racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r alluring, so let’s try and pursue this route.

Writing An Exploit

Hijacking A Free Chunk


To hijack a free chunk, we’ll need to commandeer a chunk’s “next” pointer. Recall that our exploit primitive allows us some degree of control over neighbouring data structures. As such, let’s consider cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following placement in which a free chunk is within range of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NRREP buffer:


Leveraging our OOB increment, we can directly modify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chunk’s “next” pointer by sending an NRREP request with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding channel number. Naively, this would allow us to gain control over a free chunk in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap, by simply directing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “next” at a location of our choosing.

However, this approach turns out to be infeasible.

In order to direct cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “next” pointer at a meaningful address, we’d have to eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r know its value in advance (in order to calculate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of increments required to convert cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pointer from its current value to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 target value), or we’d have to know cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 relative offset between its current value and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 desired target.

As we do not know cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exact addresses of heap chunks (nor would we want to resort to guessing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 former option is ruled out. What about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latter approach? Recall that our primitive allows for 16-bit increments. Therefore, we can eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r increase cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pointer’s value by 1 (by increment cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bottom half word), or by 65536 (by incrementing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 top half word).

Incrementing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pointer by 1 will result in an unaligned chunk address in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 freelist. Recall, however, that our vulnerability primitive triggers deallocations on every invocation. As it happens, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocator’s “free” function validates that each chunk in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 freelist is aligned. When an unaligned block in encountered, it generates a fault and halts cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware. Thus, an increment on of bottom half-word will result in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware crashing.

Incrementing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 top half-word similarly fails; since all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap’s chunks are less than 65536 away from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM’s end address, incrementing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 top half-word will result in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “free” function attempting to access memory beyond cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAM, triggering an access violation and halting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware.

So how can we commandeer a free chunk nevercá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365less?

To do so we’ll need to use a more subtle approach - instead of modifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 free chunk’s contents directly, we’ll aim to achieve a layout in which two free chunks overlap one anocá 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ý bet365reby causing allocations carved from one chunk to overwrite cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 metadata 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 (leading to control over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latter’s “next” pointer).


Heap Shaping


Achieving a predictable heap layout is key for a reliable exploit. As our current goal is to create a specific layout (namely, two overlapping heap chunks), we require setting up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap in a manner which would allow us to achieve such a layout.

Classically, heap shaping is performed by leveraging primitives allowing for control eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r over an allocation’s lifetime, or optionally over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocation’s size. Triggering allocations within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap without immediately freeing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, allows us to fill “holes” in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap, leading to a more predictable layout.

The allocator used in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware is a “best-fit” allocator which allocates from high addresses to lower ones. Consequently, if all “holes” in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap of a certain size are filled, subsequent allocations of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same size (or larger) would be carved from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best-fitting chunk, proceeding from top to bottom, thus creating a linear allocation pattern.

To understand cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware’s heap layout, let’s take a snapshot of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap’s state using our Wi-Fi debugger (repeating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process multiple times to account for any variability in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 state):



As we can see, several small chunks are strewn across cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap, alongside a single large chunk. From cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 structure above, we can deduce that in order to create a predictable allocation pattern for our NRREP buffer, we’d simply need a shaping primitive allowing us to fill all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “holes” whose sizes match that of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NRREP buffer.

However, this is easier said than done. As we’ve mentioned before, little allocations occur during routine operations, and those that do are immediately freed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reafter. Combing through all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 action frame handlers, we fail to find even a single instance of a memory leak (i.e., an allocation with infinite lifetime), or even an allocation that persists beyond cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 scope of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 handlers cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves. Be that as it may, we do know of one mechanism, governed by action frames, which could offer a solution.

Normally, each Wi-Fi frame received by a station is individually acknowledged by transmitting a corresponding acknowledgement frame in response. However, many use-cases exist in which multiple frames are expected to be sent at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same time; requiring an acknowledgement for each individual frame in those cases would be racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r inefficient. Instead, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 802.11n standard (expanding on 802.11e) introduced “Block Acknowledgements” (BA). Under cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new scheme, stations may acknowledge multiple frames at once, by transmitting a single BA frame.

To utilise BAs, a corresponding session must first be constructed. This is done by transmitting an ADDBA Request (IEEE 802.11-2016, 9.6.5.2) from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 originating peer to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 responder, resulting in an ADDBA Response (9.6.5.3) being sent in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 opposite direction, acknowledging a successful setup. Similarly, BAs can be torn down by sending a DELBA frame, indicating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BA should no longer be active. Each BA is identified by a unique Traffic Identifier (TID). While cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 standard specifies up to 16 supported TIDs, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware only supports cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first 8, restricting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of BAs possible in firmware to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same limit.


Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lifetime of BAs is explicitly controlled by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 construction of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding BA sessions, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y may constitute good heap shaping candidates. Indeed, going over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding action frame handler in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware, it appears that every allocated BA results in a 164-byte allocation being made, holding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BA’s contents. The allocation persists until cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding DELBA is received, upon which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BA structure corresponding to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 given TID is freed.

To use BAs in our network, we’ll add a new command to hostapd, allowing injection of both ADDBA and DELBA requests with crafted TIDs. Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore, we’ll take care to compile hostapd with support for 802.11n (CONFIG_IEEE80211N) and to enable it in our network (ieee80211n).

Putting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, we arrive at a pretty powerful heap shaping primitive! By sending ADDBA Requests, we can trigger cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocation of up to eight distinct 164-byte allocations. Better yet, we can selectively delete cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocations corresponding to each BA by sending a DELBA frame with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding TID.

Having said that, two immediate downsides also spring to mind. First, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocation size is fixed, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore we cannot use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 primitive to shape cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap for allocations smaller than 164 bytes. Secondly 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 BA buffers are uncontrolled by us (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y mostly contain bit-fields used for reordering frames in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BA).

Attempting Overlapping Chunks


Using our shiny new shaping primitive, we can now proceed to shape cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap in a manner allowing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 creation of overlapping chunks. To do so, let’s begin by allocating all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BAs, from 0 through 7. The first few allocations will fill in whatever holes can accommodate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap. Subsequently, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rest of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocations will be carved for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 main heap chunk, advancing linearly from high addresses to lower ones.

(Grey blocks indicate free chunks)

Quite conveniently, as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocation primitive is much larger than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “small buffer” allocated during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NRREP request, it allows cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 smaller holes in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap, those large enough to hold cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 28 byte allocation, to persist. Consequently, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “smaller buffer” is simply carved from one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 remaining holes, allowing us to safely ignore it.

Getting back to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue at hand - in order to create an overlapping allocation, all we’d need to do is use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability primitive to increment cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 size field of one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BAs. After growing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 size by whichever amount we desire, we can proceed to delete cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 newly expanded BA, along with its neighbouring BAs, causing an overlapping allocation.


Unfortunately, running through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above scenario results in a resounding failure -- cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware crashes upon any attempt to free a block causing an overlapping allocation…

To get down to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bottom of this odd behaviour, we’ll need to locate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 source of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 crash. Inspecting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 AppleBCMWLANBusInterfacePCIe driver, it appears that whenever a trap is generated by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 driver simply collects cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned crash data, and outputs it to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device’s syslog. Therefore, to inspect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 crash report, we’ll simply dump cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 syslog using idevicesyslog. After generating a crash we are presenting with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following output:

Inspecting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 source address of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 crash in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s image, we come across an unfamiliar block of code in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “free” function, which was not present in prior firmware versions. In fact, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire function seems to have many of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se blocks… To understand this new code, let’s dig a little deeper.

New Mitigations


Going over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocator’s “free” function, we find that in addition to freeing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 blocks cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function now performs several additional verifications on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap’s structure, meant to ensure that it is not corrupted in any way. If any violations are detected, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware calls an “abort” function, subsequently causing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware to crash.

After reverse-engineering all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above validations, we arrive at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following list of mitigations:
  1. The chunk’s bounds are compared against a pre-populated list of “allowed” regions.
  2. The chunk is compared against all ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r chunks in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 freelist, searching for overlaps.
  3. The chunk is checked against a list of “disallowed” regions.
  4. The chunk is ensured to be 4-byte aligned.


If any violation is detected, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware triggers cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “abort” function, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reby halting execution.

It appears that Broadcom has done some hardening on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocator! This is great from a security perspective, but racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r bleak news for our exploit, as it appears that any attempt to create an overlapping pair of chunks will result in a crash. Perhaps we’re out of luck…

Bypassing Mitigation #1


...Or are we?

Instead of first increasing a heap block’s size, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n freeing it to create overlapping chunks, let’s opt for different approach. We’ll arrange for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following layout; first, we’ll create two free chunks, which are not immediately adjacent to one anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r (to prevent cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocator from coalescing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m). Then we’ll use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NRREP primitive to slowly increment cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 size of one block, until it overlaps cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r.

However, as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NRREP primitive only allows us to modify data extending up to 60 bytes after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer, and each BA buffer is much larger in size (164 bytes), we’ll first need to devise a plan to get our NRREP buffer closer to a free chunk, without it actually impeding on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chunk (and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reby coalescing with it).

We’ll do so by leveraging a little trick. After allocating all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BAs, we’ll proceed to slightly increment cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last BA’s size using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability primitive. Once that chunk is freed, a free chunk is subsequently created in its place, spanning cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new expanded size instead of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original allocation’s size. Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new free chunk extends into neighbouring BAs, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next BA allocation will cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore overlap a previously allocated BA. This allows us to effectively “sink” an allocation into neighbouring blocks, advancing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 scope of influence of our NRREP buffer to previously unreachable objects!

As cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocator’s “malloc” function zeroes every chunk upon allocation, following cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 plan above will lead to BA6’s size being set to zero. However, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s no need to fret, we can simply increase it using our NRREP primitive (as we’re now within range of BA6).

Next, we’ll increase BA6’s size slightly until it nearly overlaps with BA5. Then, we can free both BAs, and proceed to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NRREP buffer to increase BA6’s free chunk until it overlaps with BA5’s. It’s important to note that since both “holes” are much smaller than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NRREP buffer, it won’t be placed within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, leaving us to utilise cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m as we please.


Bypassing Mitigation #2


Having created a pair of overlapping free-chunks, our first instinct is to carve an allocation from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 encompassing chunk, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reby overwriting 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 chunk’s metadata. To do so, we’ll need to find an allocation primitive allowing for control over its contents.

Recall that we have already searched for (and failed to locate) allocations with a controlled lifetime. Therefore, any allocation primitive we do find would be one with a limited lifespan. But alas, freeing an allocation carved from any of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overlapping chunks will lead us once again to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “free” function’s overlapping chunk mitigation, subsequently halting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware (and thwarting our attempt). 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 mitigation and see whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r we can find a way around it.

Going through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code, it appears to have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following high-level logic:

1.     //Calculating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current chunk’s bounds
2.     uint8_t* start = (uint8_t*)cur + sizeof(uint32_t);
3.     uint8_t* end   = start + (cur->size & 0xFFFFFFFC);
4.     
5.     //Checking for intersection between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current chunk and each free-chunk
6.     for (freechunk_t* p = get_freelist_head(); p != NULL; p = p->next) {
7.         uint8_t* p_start = (uint8_t*)p;
8.         uint8_t* p_end   = p_start + (p->size & 0xFFFFFFFC) + 2 * sizeof(uint32_t);
9.         if (end > p_start && p_end > start)
10.             CRASH();
11.     }

As we can see above, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code snippet above lacks checks for integer overflows! Therefore, by storing a sufficiently large size in a free chunk, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 calculation of p_end will result in an integer overflow, leading cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value stored to become a low address. Consequently, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 expression at line 9 will always evaluate to “false”, allowing us to bypass cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mitigation.

Great, so all we need to do is ensure that when overwriting BA5’s free chunk, we also set its size to an exorbitantly large value. Moreover, as we’re dealing with a “best-fit” allocator, such a chunk will never be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best fitting (as smaller chunks will always exist), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s no need to worry about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocator using our malformed chunk in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interim.

Creating Overlapping Chunks


To proceed, we’ll need to locate an allocation primitive allowing control over its contents, and preferably also offering a controlled size. Using such a primitive, we’ll be able to create an allocation for which BA6’s free chunk is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best fitting, subsequently overwriting BA5’s free-chunk header.

Going through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 action frame handlers once again, we find a near-fit; Spectrum Measurement Requests (SPECMEAS). In short, SPECMEAS frames (9.6.2.2) are action frames belonging to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Spectrum Management category. These requests are used by access points to instruct stations to perform various measurements and report cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 results back to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 network.

Broadcom’s Wi-Fi firmware supports two different types of measurements; a “basic” measurement, and a “Clear Channel Assessment” (CCA) measurement. Upon receiving a SPECMEAS request, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware allocates a buffer in order to store cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 report’s data. For every “CCA” measurement received, 5 bytes are added to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer’s size. However, for every “CCA” measurement encountered, 17 bytes are added to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer, of which many contain attacker-controlled data!

Using this primitive we can cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore trigger allocations of sizes that are linear combinations of 5 and 17. For every 17-byte block corresponding to a “basic” measurement, we can control several of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 embedded bytes (namely, those at indices [5,15], 2).

While not a perfect allocation primitive, it’ll have to do. Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are more than eight subsequent controlled bytes for each “basic” measurement request, we can use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m in order to overwrite BA5’s free chunk header (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 32-bit size and pointer fields). By using a linear combination of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sizes above, we’ll guarantee that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 controlled bytes are aligned with BA5’s free chunk header. Lastly, 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 performed must also be chosen so that BA6’s free chunk is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best fitting (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore forcing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocation to be carved from it, racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r free chunks). Putting it all togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, we arrive at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following layout:

Overwrite Candidates


Now that we’re able to commandeer free chunks, we just need to find some overwrite candidates in order to hijack cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 control flow.

Whereas in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous firmware versions we researched, in-use chunks contained cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same fields as a free chunks (namely, 32-bit size and next fields), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current chunks’ formats make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m incompatible with free chunks. Therefore, in-use chunks normally do not constitute valid targets to impersonate free chunks.

Nonecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365less, it is not entirely impossible that such objects exists. For example, any in-use allocation starting with a 32-bit zero word would be a valid free chunk. Similarly, chunks could begin with 32-bit pointers to ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r data types, which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves may constitute a valid chain of free chunks. Even better yet, any data structure in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s RAM (not only heap chunks) could conceivably masquerade as a free chunk, so long as it follows cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above format.

To get to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bottom of this, we’ve written a short script that goes over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s contents, searching for blocks that match cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned description. Each block we discover constitutes a potential overwrite target by directing our fake free chunk at it. Running cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 script on a RAM dump of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware, we are greeted with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following result:


Great, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re appear to be several candidates for overwrite!

In our previous exploration of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware, we identified a certain class of objects that made good targets for hijacking control flow -- timers. These structures hold function pointers denoting periodically invoked timer functions. While many such timers exist in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current firmware as well, 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 hard to overwrite using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above primitive. First, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y do not start with a 32-bit zero field (but racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 magic value “MITA”). Second, each timer is a link in a doubly-linked list, whose contents are constantly manipulated. To overwrite a timer, we’d need to insert a valid element into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 list.

Instead, going over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 list of candidates above, we come across a structure within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “persist” segment, containing a block of function pointers. Using our firmware debugger, we can indeed verify that several of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function pointers within this structure are periodically invoked. Therefore, by finding a free chunk candidate within this block, we should be able to commandeer one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned function pointers, directing it at a location of our choice.


Unfortunately, attempting to do so results in a resounding failure.

Bypassing Mitigation #3


Each attempt to allocate data on top of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned block of function pointers using SPECMEAS frames, immediately causes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware to halt. Inspecting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 source of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 crash leads us back to one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mitigations we mentioned earlier on; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “disallowed ranges” list.

Apparently, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire “persist” block is contained in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 list of regions within which “free” operations must not occur. Consequently, without bypassing this mitigation, we will not be able to overwrite data within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned range.

Thinking about this mitigation for a moment, we come up with an interesting proposition: perhaps we could use our commandeered free chunk in order to overwrite cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “disallowed ranges” list itself?

While cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 list’s contents lays within one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 disallowed zones, recall that this validation is only performed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “free” function, whereas “malloc” will happily carve allocations at any address, without consulting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above list. Therefore, by pointing our free chunk to a location overlapping cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “disallowed ranges” list, we can use a SPECMEAS frame to overwrite its contents (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reby nullifying its effect). While SPECMEAS frames are immediately freed after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are allocated, this is no longer a concern, as by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “free” occurs, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “disallowed ranges” will have already been overwritten!

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


Using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 steps above, we can disable cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “disallowed ranges” list, allowing us to subsequently use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 commandeered free chunk in order to hijack one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function pointers in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 persist block. Finally, we simply require a means of stashing some shellcode in a predictable location within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s RAM. By doing so, we will be able to direct cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned function pointer at our shellcode, leading to arbitrary code execution.

Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 addresses within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “persist” block are fixed, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y make for prime candidates to store our shellcode. Searching through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 block, we come across several potential overwrite candidates, any of which can be hijacked with our “fake” free chunk.

However, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s one more hurdle to overcome -- cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code we’re about to store must not be overwritten at any point. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code is inadvertently overwritten, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware will attempt to execute a corrupted chunk of code, possibly leading it to crash.

To get around this limitation, we’ll use one more action frame: Radio Measurement Requests (RMREQ). These frames are part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 802.11k RRM standard, and allow for periodic measurements to be performed (and reported) by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware. Similarly to SPECMEAS frames, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir handler allocates several bytes of data for each measurement IE encoded in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 request.

Most importantly, RMREQ frames include a field denoting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of repetitions that stations should perform when receiving cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 scan request. Going through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 specification reveals that this field also has a “special” value, allowing scans to continue indefinitely:

IEEE 802.11-2016, 9.6.7.3

By encoding this value in an RMREQ frame, we can guarantee that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding allocated buffer will not be subsequently freed, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore allowing safe storage of our code.

Lastly, we need to consider cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shellcode’s internal structure. Unlike SPECMEAS frames which allowed us to control multiple bytes in each chunk of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocated buffer, RMREQ frames only provide control over four subsequent bytes out of every 20-bytes allocated. Luckily, as Thumb is a dense instruction set, it allows us to cram two instruction into each 32-bit controlled word. Therefore, we can break up our shellcode using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following pattern: cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first 16-bit word will encode an instruction of our choosing, whereas cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second word will contain a relative branch to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next controlled chunk. Formatting our shellcode in this manner allows us to construct arbitrarily large chunks of shellcode:


Building a Backdoor


Combining all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 primitives above, we can finally stash and execute a chunk of shellcode on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware!

To allow for easier exploration of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware, it’s worth taking a moment to convert this rudimentary form of access to a more refined toolset. Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise, we’d have to resort to encoding all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 post-exploitation logic using segmented chunks of shellcode -- not an alluring prospect.

We’ll begin by using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shellcode above to write a small “backdoor” into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware, which we’ll call cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “initial payload”. This payload constitutes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most minimal backdoor imaginable; it simply intercepts cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NRREP handler, and reads two 32-bit words from it, storing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value of one word into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address denoted by 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. The initial payload cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore allows us to perform arbitrary 32-bit writes to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s RAM, by sending crafted NRREP frames over-cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365-air.

Next, we’ll use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initial payload in order to write a more sophisticated one, which we’ll refer to as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “secondary payload”. This payload also intercepts cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NRREP handler (replacing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous hook), but allows for a far richer set of commands, namely:
  1. Reading data from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware RAM
  2. Writing to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s RAM
  3. Executing a shellcode stub
  4. Performing a CRC32 calculation on a block of data

The capabilities above allow us to fully control cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s over-cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365-air, from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 safety of a python script. Indeed, not unlike our research platform, we’ve implemented cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 protocols for communicating with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 backdoor in python, allowing for APIs implementing all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 functionality above.

In fact, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two are so similar, that several of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 research framework’s modules can be directly executed using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 secondary payload, by simply replace cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory access APIs in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 research framework with those offered by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 secondary payload.

The Exploit


Summing up all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 work above, we’ve finally written a complete exploit, allowing code execution on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone 7. You can find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 complete exploit here.

The exploit has been tested against cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware present in iOS 10.2 (14C92). The vulnerability is present in versions of iOS up to (and including) iOS 10.3.3. Researchers wishing to utilise cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit on different iDevices or different versions, would be required to adjust cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 necessary symbols used by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit (see “exploit/symbols.py”).

Note that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit continuously attempts to install cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 backdoor into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware, until it is successful. For any unsuccessful attempt, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware simply silently reboots, allowing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit to continue along. Moreover, due to a clever feat of engineering by Apple, rebooting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware does not interrupt ongoing connections; instead, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are continued as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip reboots, allowing for a racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r stealthy attack.

Wrapping Up


Over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 course of this blog post we performed a deep dive into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi firmware present on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone 7. Our exploration led us to discover new attack surfaces, several added mitigations, and multiple vulnerabilities.

By exploiting one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned vulnerabilities, we were able to gain control over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi SoC, allowing us to gain a foothold on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device itself, directly over-cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365-air. In doing so, we also bypassed several of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 firmware’s exploit mitigations, demonstrating how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can be reinforced in future 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 complete our journey towards full control over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 target device, by devising a full exploit chain allowing us to leverage our newly acquired control over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wi-Fi chip in order to launch an attack against iOS itself. Ultimately, we’ll construct an over-cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365-air exploit allowing complete control over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iOS kernel.