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


6 comments:

  1. I find this whole website so hypocrite. Why would you even bocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r with Windows? And please don't pretend to care about Windows users. Especially as you have a rich history of NOT supporting your own services on this very platform!
    Focus on your own great products to make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m even better. But again, please stop this childish behaviour.

    ReplyDelete
  2. The discrepancy in memset()s with sizes off by one is probably difference between a[100] = {} and a[100] = { 0 }. The first one calls memset() on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole array. The second one will first initialize cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first element to 0 and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n memset() 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 array. You can check it here: https://godbolt.org/g/D5YtX9

    ReplyDelete
    Replies
    1. This is not quite true. I've done a few tests playing with MSVS 2017 optimization options. I've found that this is true only if you disable C/C++ optimization completely. In any ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r cases (combining any optimization flags) cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is always will be just one memset without initialization of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first array member.

      Delete
  3. Android is a malware rotten OS with gigantic security holes around some of which Google has spread its ad-based business. Update situation is chaotic with OEMs almost never patching cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir versions.

    Windows is no better but at least nowhere near Android' situation. Windows 10 is a fine OS. I hope many more upgrade and devs jump on board.

    No need for this. Fix Android first cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n mock Windows. Or help to fix Windows by upgrading to Windows 10 and forwarding bugs data to Microsoft.

    ReplyDelete
  4. when do you'll focus on android too?

    ReplyDelete
  5. Windows 7 is still getting security updates though... Please improve Android so security updates can be pushed out regardless of who cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OEM is, like is possible with Windows. Everyone would benefit from that.

    ReplyDelete