Thursday, March 19, 2015

Taming cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wild copy: Parallel Thread Corruption

Posted by Chris Evans, Winner of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 occasional race

Back in 2002, a very interesting vulnerability was found and fixed in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Apache web server. Relating to a bug in chunked encoding handing, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability caused a memcpy() call with a negative length with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 destination on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack. Of course, many parties were quick to proclaim cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability unexploitable beyond a denial of service. After all, a negative length to memcpy() represents a huge copy which is surely guaranteed to hit an unmapped page and terminate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process. So it was a surprise when a working remote code execution exploit turned up for FreeBSD and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r BSD variants, due to a quirk in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir memcpy() implementations! This GIAC paper archives both cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit as well as an analysis (appendix D) of how it works.

For cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 purposes of this post, we define “wild copy” as a copy where both:
  • The attacker has limited control over 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 copy.
  • The copy will always end up being so large as to be guaranteed to hit an unmapped page.

There have been plenty of ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r interesting cases where a wild copy has ended up being exploitable:
  • A general attack against corruption of structured exception handlers (SEH) on Windows.
  • The BSD variants don’t have a monopoly on memcpy() quirks. In 2011, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re was a fascinating outright eglibc vulnerability in Ubuntu, triggering for any very large length to memcpy(). A memset() variant was exposed via cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Chromium Vulnerability Rewards Program.
  • The Java Runtime Environment has a very complicated crash handler installed, which is called when a wild copy inevitably causes an access violation. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 crash handler is not careful to be robust in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 presence of arbitrarily corrupted heap state, it might crash itself in a more controlled and exploitable way.

All of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above cases have one thing in common: cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wild copy becomes exploitable due to a secondary issue or quirk.

Is it possible to exploit a wild copy without relying on a secondary issue? This is an interesting question for Project Zero to tackle -- when we explore exploitation, we usually only do so for cases where we think we can learn new insights or advance cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 public state of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 art. Today, we’re going to explore a wild copy exploit in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash plug-in for 64-bit Chrome Linux.

It’s time to introduce issue 122 and “parallel thread corruption”. Issue 122 is an Adobe Flash vulnerability that was fixed back in November 2014. It’s a curious bug wherein cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 G711 sound codec is straight up broken on some platforms, always resulting in a wild copy when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 codec tries to decode some samples. When triggered, it causes a memmove() on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap with a small negative value as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length parameter. On modern Linux, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memmove() implementation appears to be solid, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 inexorable SIGSEGV appears to take cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process down cleanly. We have our work cut out!

Step 1: choose an approach

We’re going to attempt a “parallel thread corruption”, which is where we observe and abuse cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 side effects in thread A of an asynchronous memory corruption in thread B. Since thread B’s corruption will always end in a crash, we need to run both threads in parallel. We also need to win a tricky race condition: get code execution before thread B’s crash takes out thread A.
As is common in Flash exploits, we’re going to attempt to have our memory corruption corrupt cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 header of a Vector. buffer object, expanding its length beyond reality thus leading to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ability to read and write out of bounds. Vector. buffer objects have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir data allocated inline after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 header, and in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case of this specific vulnerability, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 errant memmove() always ends up shifting memory content backwards by 2048 bytes. So if we allocate a large enough Vector., we can attempt to corrupt its header with its own data:

| len: 2000 | some ptr | data[0] = 0, data[1] = 0, …, data[508] = 0xfee1dead, … |
      ^                                                          |
      |-----------------------------------------------------------

The offsets and alignments work out such that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 508th 4-byte uint data element will clobber cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 header.

Step 2: wrestle cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash heap into submission

Before we get too carried away, we need to remember that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corruption thread is going to be in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 middle of a wild memmove(). Even my laptop can copy memory at a rate of almost 10 gigabytes per second, so we’re going to need to land cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 copy on to a large runway of heap so that we have enough time to complete cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 copy hits an unmapped page. Getting a large, contiguous heap mapping sounds easy but it is not. If you naively just spray cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash heap with 512KB ByteArray buffers, you’ll see a large number of process mappings looking like this:

7fd138039000-7fd138679000 rw-p 00000000 00:00 0
7fd138679000-7fd139039000 ---p 00000000 00:00 0
7fd139039000-7fd139fb9000 rw-p 00000000 00:00 0
7fd139fb9000-7fd13a039000 ---p 00000000 00:00 0
7fd13a039000-7fd13ae79000 rw-p 00000000 00:00 0
7fd13ae79000-7fd13b039000 ---p 00000000 00:00 0
[...]

At first glance, as security professionals, we might proclaim “great! guard pages!” but what we are looking at here is an accidental inefficiency of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash heap. When trying to extend cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 limit of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap forwards and failing due to anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r mapping being in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way, it lets cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operating system decide where to put a new mapping. The default Linux heuristic happens to be “just before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last successful mapping”, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash heap will enter a permanent cycle of failing to extend cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap forwards. The “guard pages” come from 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 Flash heap (on 64-bit) will reserve address space in 16MB chunks, and commit regions of that as needed, and with granularity of 128KB. It’s quite common for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 series of commit requests to not add up exactly to 16MB, leaving a hole in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address space. Such a hole will cause a crash before our exploit is done!

To avoid all this and try and obtain a heap that grows forward, we follow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following heuristic:
  1. Allocate a 1GB object, which will be placed just before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current heap region.
  2. Spray 4KB allocations (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash heap block size) to fill in existing free blocks.
  3. Spray some more 4KB allocations to cause cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap to extend backwards, into a new 16MB region allocated before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 1GB object.
  4. Free cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 1GB object.

If all has gone well, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap will look something like this, with green representing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 space available for uninterrupted linear growth forward:

| committed: 1MB | reserved: 15MB     |         1GB hole         | committed: ~16MB | ...

Step 3: use heap grooming to align our exploitation objects

We’re now in good shape to use heap grooming to set up a row of important object allocations in a line, like this:

| 8KB buf | 8KB buf | 8KB buf | Vec.(2000) | Vec.(1000) | 100MB of bufs |
              .----- wild copy -------------------------------------------------->

In red is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vector we decided to corrupt in step 1, and in green is an object we will deliberately free now that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap is set up. Before we proceed, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s one more heap quirk that we need to beware of: as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap is extended, inline heap metadata is also extended to describe all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new 4KB blocks. This process of extending in-heap metadata creates free regions of blocks inside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap. This wouldn’t be an issue, but for anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r quirk: when a block range is returned to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap free list, it isn’t reallocated in MRU (most recently used) order. Therefore, we mount anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r heap spray to make sure all 8KB (2 block) heap chunks are allocated, leaving that particular freelist empty. We cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n free cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 middle 8KB buffer (in green above) to leave a heap free chunk in a useful place. Since we leave two allocated 8KB buffers eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r side, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 freed chunk will not be coalesced and will be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chosen option for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next 8KB allocation.

After all that heap manipulation, we leave ourselves with a range of important objects lined up in a neat row, and with a preceding and free 8KB heap chunk primed to be re-used at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next opportunity.

Step 4: light cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuse

It’s worth noting that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are platform specific differences in how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sound subsystem initializes. On some platforms, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subsystem initializes and starts asynchronously when play() is called for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first time. For cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Chrome Flash plug-in, this is not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case. If you look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit, you’ll see that we have to kick off cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subsystem by playing a different sound and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n returning to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 main event loop. This dance ensures that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second call to play() actually does kick off cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wild copy asynchronously.

With our heap in nice shape, we trigger cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wild memmove() by playing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 G711 sound. The wild copy will start immediately and proceed asynchronously so we need to get a move on! The G711 sound decoder object is about 4424 bytes in size, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap allocation granularity for sizes >= 4096 is 4096. So, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object will be placed in an 8192-sized chunk -- specifically cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one we just freed up if all is well. The wild heap corruption will start within this object and proceed forwards, very quickly corrupting all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following objects that we lined up, including cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Vector. and Vector..

The moment we’ve pulled cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trigger, we spin in a tight ActionScript loop that waits for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length of our Vector. to change from 2000 to 0xfee1dead.

Step 5: defeat ASLR

The moment we detect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corrupted Vector., we are in business: we can read and write arbitrary 4-byte values off-cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365-end of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object. As per cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap grooming in step 3, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object directly off cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer for a Vector., which is ideal for us because it contains two important things for us to read:

  • A vtable value into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash library, which gives us cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 location of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code.
  • A pointer to itself, which is very important because it allows us to turn a relative read/write into an absolute read/write.

Step 6: ROP-free code execution

The exploit proceeds not via a ROP chain, but by rewiring some function pointers in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GOT / PLT machinery. (Note that this relies on RELRO not being present, which it rarely is on common Linux variants and binaries. If RELRO were present, we’d likely simply target vtable pointer rewiring instead.) We have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address of a vtable, and from this, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GOT / PLT function pointers we want are a fixed offset away. There is quite an elegant and simple sequence to get us code execution:

  • Read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function pointer for memmove(), which we know is resolved.
  • Calculate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address of __libc_system, which is a fixed offset from __memmove_ssse3_back which we just read.
  • Write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address of __libc_system to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function pointer for munmap().

The effect of this wiring is that when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 program next calls munmap(buffer), it will actually be calling system(buffer). This is a useful primitive because large ByteArray buffers are backed by mmap() / munmap(), and we can control cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exact content of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer and when it is freed. So we can pass any string we want to system() at will.

Step 7: continuation of execution and sandbox

To illustrate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 level of control we now have over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process, our payload to system() is “killall -STOP chrome; gnome-calculator -e 31337”. This has two effects:

  • Displays cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 obligatory calculator to prove we have arbitrary code execution.
  • Sends a STOP signal to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existing Chrome processes. This will have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 effect of stopping cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wild memmove() before it has a chance to crash.

As a fun data point, if we attach to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stopped process and look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wild copy thread, it has managed to copy 50MB(!) of data, even though we tried to make our exploit as fast and simple as possible.

At this point, a real exploit that didn’t wish to leave any traces could easily attach to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 thread in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 middle of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 copy and stop cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 copy without having to kill cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 thread. 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 memory corrupted in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process of exploitation could be easily restored.

Of course, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sandbox escape is left as an exercise to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user. The system() library call won’t work at all in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Chrome sandbox; when demonstrating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit, we’re using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 --no-sandbox flag to focus purely on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 remote code execution aspect. An exploit inside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sandbox would instead likely rewire function pointers to attack cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IPC channels with bad messages, or deploy a ROP chain after all to attack cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel.

Closing notes

As always, Project Zero recommends that all memory corruptions are initially assumed to be exploitable. As we showed before in our posts on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Pwn4Fun Safari exploit, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 glibc off-by-one NUL byte corruption and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash regex exploit, situations that initially look dire for exploitation can sometimes be turned around with a trick or two.

Wild copies have a long history of being declared unexploitable, but based on our findings here, we think it likely that most wild copies in complicated multi-threaded software (browsers, browser plug-ins) are likely to be exploitable using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 parallel thread corruption method. We publish this finding to encourage developers and vendors to triage wild copies as more serious than previously believed.

Monday, March 9, 2015

Exploiting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DRAM rowhammer bug to gain kernel privileges

Rowhammer blog post (draft)

Posted by Mark Seaborn, sandbox builder and breaker, with contributions by Thomas Dullien, reverse engineer

[This guest post continues Project Zero’s practice of promoting excellence in security research on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Project Zero blog]

Overview

“Rowhammer” is a problem with some recent DRAM devices in which repeatedly accessing a row of memory can cause bit flips in adjacent rows. We tested a selection of laptops and found that a subset of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m exhibited cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem. We built two working privilege escalation exploits that use this effect. One exploit uses rowhammer-induced bit flips to gain kernel privileges on x86-64 Linux when run as an unprivileged userland process. When run on a machine vulnerable to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rowhammer problem, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process was able to induce bit flips in page table entries (PTEs). It was able to use this to gain write access to its own page table, and hence gain read-write access to all of physical memory.

We don’t know for sure how many machines are vulnerable to this attack, or how many existing vulnerable machines are fixable. Our exploit uses cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 x86 CLFLUSH instruction to generate many accesses to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 underlying DRAM, but ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r techniques might work on non-x86 systems too.

We expect our PTE-based exploit could be made to work on ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r operating systems; it is not inherently Linux-specific. Causing bit flips in PTEs is just one avenue of exploitation; ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r avenues for exploiting bit flips can be practical too. Our ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r exploit demonstrates this by escaping from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Native Client sandbox.

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

We learned about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rowhammer problem from Yoongu Kim et al’s paper, “Flipping Bits in Memory Without Accessing Them: An Experimental Study of DRAM Disturbance Errors” (Yoongu Kim, Ross Daly, Jeremie Kim, Chris Fallin, Ji Hye Lee, Donghyuk Lee, Chris Wilkerson, Konrad Lai, Onur Mutlu).

They demonstrate that, by repeatedly accessing two “aggressor” memory locations within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process’s virtual address space, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can cause bit flips in a third, “victim” location. The victim location is potentially outside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 virtual address space of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process — it is in a different DRAM row from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aggressor locations, and hence in a different 4k page (since rows are larger than 4k in modern systems).

This works because DRAM cells have been getting smaller and closer togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. As DRAM manufacturing scales down chip features to smaller physical dimensions, to fit more memory capacity onto a chip, it has become harder to prevent DRAM cells from interacting electrically with each ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. As a result, accessing one location in memory can disturb neighbouring locations, causing charge to leak into or out of neighbouring cells. With enough accesses, this can change a cell’s value from 1 to 0 or vice versa.

The paper explains that this tiny snippet of code can cause bit flips:

code1a:
  mov (X), %eax  // Read from address X
  mov (Y), %ebx  // Read from address Y
  clflush (X)  // Flush cache for address X
  clflush (Y)  // Flush cache for address Y
  jmp code1a

Two ingredients are required for this routine to cause bit flips:

  • Address selection: For code1a to cause bit flips, addresses X and Y must map to different rows of DRAM in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same bank.

    Some background: Each DRAM chip contains many rows of cells. Accessing a byte in memory involves transferring data from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 row into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chip’s “row buffer” (discharging cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 row’s cells in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process), reading or writing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 row buffer’s contents, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n copying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 row buffer’s contents back to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original row’s cells (recharging cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cells).

    It is this process of “activating” a row (discharging and recharging it) that can disturb adjacent rows. If this is done enough times, in between automatic refreshes of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 adjacent rows (which usually occur every 64ms), this can cause bit flips in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 adjacent rows.

    The row buffer acts as a cache, so if addresses X and Y point to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same row, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n code1a will just read from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 row buffer without activating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 row repeatedly.

    Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore, each bank of DRAM has its own notion of a “currently activated row”. So if addresses X and Y point to different banks, code1a will just read from those banks’ row buffers without activating rows repeatedly. (Banks are groups of DRAM chips whose rows are activated in lockstep.)

    However, if X and Y point to different rows in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same bank, code1a will cause X and Y’s rows to be repeatedly activated. This is termed “row hammering”.

  • Bypassing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cache: Without code1a’s CLFLUSH instructions, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory reads (MOVs) will be served from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CPU’s cache. Flushing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cache using CLFLUSH forces cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory accesses to be sent to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 underlying DRAM, which is necessary to cause cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rows to be repeatedly activated.

    Note that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 paper’s version of code1a also includes an MFENCE instruction. However, we found that using MFENCE was unnecessary and actually reduced cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of bit flips we saw. Yoongu Kim’s modified memtest also omits cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MFENCE from its row hammering code.

Refining cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 selection of addresses to hammer

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

How can we pick pairs of addresses that satisfy cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “different row, same bank” requirements?

One possibility is to use knowledge of how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CPU’s memory controller maps physical addresses to DRAM’s row, column and bank numbers, along with knowledge of eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r:

  • The absolute physical addresses of memory we have access to. Linux allows this via /proc/PID/pagemap.
  • The relative physical addresses of memory we have access to. Linux can allow this via its support for “huge pages”, which cover 2MB of contiguous physical address space per page. Whereas a normal 4k page is smaller than a typical DRAM row, a 2MB page will typically cover multiple rows, some of which will be in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same bank.

Yoongu Kim et al take this approach. They pick Y = X + 8MByte based on knowledge of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 physical address mapping used by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory controllers in Intel and AMD’s CPUs.

Random address selection

The CPU’s physical address mapping can be difficult to determine, though, and features such as /proc/PID/pagemap and huge pages are not available everywhere. Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore, if our guesses about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address mapping are wrong, we might pick an offset that pessimises our chances of successful row hammering. (For example, Y = X + 8 kByte might always give addresses in different banks.)

A simpler approach is to pick address pairs at random. We allocate a large block of memory (e.g. 1GB) and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n pick random virtual addresses within that block. On a machine with 16 DRAM banks (as one of our test machines has: 2 DIMMs with 8 banks per DIMM), this gives us a 1/16 chance that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chosen addresses are in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same bank, which is quite high. (The chance of picking two addresses in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same row is negligible.)

Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore, we can increase our chances of successful row hammering by modifying code1a to hammer more addresses per loop iteration. We find we can hammer 4 or 8 addresses without slowing down cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time per iteration.

Selecting addresses using timing

Anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r way to determine whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r a pair of addresses has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “different row, same bank” property would be to time uncached accesses to those addresses using a fine-grained timer such as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RDTSC instruction. The access time will be slower for pairs that satisfy this property than those that don’t.

Double-sided hammering

We have found that we can increase cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chances of getting bit flips in row N by row-hammering both of its neighbours (rows N-1 and N+1), racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than by hammering one neighbour and a more-distant row. We dub this “double-sided hammering”.

For many machines, double-sided hammering is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only way of producing bit flips in reasonable time. For machines where random selection is already sufficient to cause bit flips, double-sided hammering can lead to a vastly increased number of bits flipped. We have observed 25+ bits flipped in one row on one particularly fragile machine.

Performing double-sided hammering is made more complicated by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 underlying memory geometry. It requires cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker to know or guess what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 offset will be, in physical address space, between two rows that are in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same bank and are adjacent. Let’s call this cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “row offset”.

From our testing, we were able to naively extrapolate that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 row offset for laptop Model #4 (see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 table below) is 256k. We did this by observing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 likelihood of bit flips relative to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 distance cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 selected physical memory pages had from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 victim page. This likelihood was maximized when we hammered cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 locations 256k below and above a given target row.

This “256k target memory area, 256k victim memory area, 256k target memory area” setup has shown itself to be quite effective on ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r laptops by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same vendor. It is likely that this setup needs to be tweaked for ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r vendors.

This 256k row offset could probably be explained as being a product of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 row size (number of columns), number of banks, number of channels, etc., of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DRAM in this machine, though this requires furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r knowledge of how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hardware maps physical addresses to row and bank numbers.

Doing double-sided hammering does require that we can pick physically-contiguous pages (e.g. via /proc/PID/pagemap or huge pages).

Exploiting rowhammer bit flips

Yoongu Kim et al say that “With some engineering effort, we believe we can develop Code 1a into a disturbance attack that … hijacks control of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system”, but say that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y leave this research task for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 future. We took on this task!

We found various machines that exhibit bit flips (see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 experimental results below). Having done that, we wrote two exploits:

  • The first runs as a Native Client (NaCl) program and escalates privilege to escape from NaCl’s x86-64 sandbox, acquiring cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ability to call cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host OS’s syscalls directly. We have mitigated this by changing NaCl to disallow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CLFLUSH instruction. (I picked NaCl as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first exploit target because I work on NaCl and have written proof-of-concept NaCl sandbox escapes before.)
  • The second runs as a normal x86-64 process on Linux and escalates privilege to gain access to all of physical memory. This is harder to mitigate on existing machines.

NaCl sandbox escape

Native Client is a sandboxing system that allows running a subset of x86-64 machine code (among ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r architectures) inside a sandbox. Before running an x86-64 executable, NaCl uses a validator to check that its code conforms to a subset of x86 instructions that NaCl deems to be safe.

However, NaCl assumes that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hardware behaves correctly. It assumes that memory locations don’t change without being written to! NaCl’s approach of validating machine code is particularly vulnerable to bit flips, because:

  • A bit flip in validated code can turn a safe instruction sequence into an unsafe one.
  • Under NaCl, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sandboxed program’s code segment is readable by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 program. This means cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 program can check whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r a bit flip has occurred and determine whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r or how it can exploit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 change.

Our exploit targets NaCl’s instruction sequence for sandboxed indirect jumps, which looks like this:

  andl $~31, %eax  // Truncate address to 32 bits and mask to be 32-byte-aligned.
  addq %r15, %rax  // Add %r15, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sandbox base address.
  jmp *%rax  // Indirect jump.

The exploit works by triggering bit flips in that code sequence. It knows how to exploit 13% of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 possible bit flips. Currently it only handles bit flips that modify register numbers. (With more work, it could handle more exploitable cases, such as opcode changes.) For example, if a bit flip occurs in bit 0 of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 register number in “jmp *%rax”, this morphs to “jmp *%rcx”, which is easily exploitable — since %rcx is unconstrained, this allows jumping to any address. Normally NaCl only allows indirect jumps to 32-byte-aligned addresses (and it ensures that instructions do not cross 32-byte bundle boundaries). Once a program can jump to an unaligned address, it can escape cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sandbox, because it is possible to hide unsafe x86 instructions inside safe ones. For example:

  20ea0:       48 b8 0f 05 eb 0c f4 f4 f4 f4    movabs $0xf4f4f4f40ceb050f,%rax

This hides a SYSCALL instruction (0f 05) at address 0x20ea2.

Our NaCl exploit does cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following:

  • It fills cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sandbox’s dynamic code area with 250MB of NaClized indirect jump instruction sequences using NaCl’s dyncode_create() API.
  • In a loop:
    • It row-hammers cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dynamic code area using CLFLUSH, picking random pairs of addresses.
    • It searches cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dynamic code area for bit flips. If it sees an exploitable bit flip, it uses it to jump to shell code hidden inside NaCl-validated instructions. Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise, if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bit flip isn’t exploitable, it continues.

We have mitigated this by changing NaCl’s x86 validator to disallow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CLFLUSH instruction (tracked by CVE-2015-0565). However, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re might be ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r ways to cause row hammering besides CLFLUSH (see below).

Prior to disallowing CLFLUSH in NaCl, it may have been possible to chain this NaCl exploit togecá 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 kernel privilege escalation below so that a NaCl app in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Chrome Web Store app could gain kernel privileges, using just one underlying hardware bug for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole chain. To our knowledge cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re was no such app in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Chrome Web Store. PNaCl — which is available on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 open web — has an extra layer of protection because an attacker would have had to find an exploit in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PNaCl translator before being able to emit a CLFLUSH instruction.

Kernel privilege escalation

Our kernel privilege escalation works by using row hammering to induce a bit flip in a page table entry (PTE) that causes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PTE to point to a physical page containing a page table of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacking process. This gives cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacking process read-write access to one of its own page tables, and hence to all of physical memory.

There are two things that help ensure that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bit flip has a high probability of being exploitable:

  1. Rowhammer-induced bit flips tend to be repeatable. This means we can tell in advance if a DRAM cell tends to flip and whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r this bit location will be useful for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit.

    For example, bit 51 in a 64-bit word is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 top bit of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 physical page number in a PTE on x86-64. If this changes from 0 to 1, that will produce a page number that's bigger than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system's physical memory, which isn't useful for our exploit, so we can skip trying to use this bit flip. However, bit 12 is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bottom bit of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PTE's physical page number. If that changes from 0 to 1 or from 1 to 0, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PTE will still point to a valid physical page.

  2. We spray most of physical memory with page tables. This means that when a PTE's physical page number changes, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's a high probability that it will point to a page table for our process.

    We do this spraying by mmap()ing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same file repeatedly. This can be done quite quickly: filling 3GB of memory with page tables takes about 3 seconds on our test machine.

There are two caveats:

  • Our exploit runs in a normal Linux process. More work may be required for this to work inside a sandboxed Linux process (such as a Chromium renderer process).
  • We tested on a machine with low memory pressure. Making this work on a heavily-loaded machine may involve furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r work.

Break it down: exploit steps

The first step is to search for aggressor/victim addresses that produce useful bit flips:

  • mmap() a large block of memory.
  • Search this block for aggressor/victim addresses by row-hammering random address pairs. Alternatively, we can use aggressor/victim physical addresses that were discovered and recorded on a previous run; we use /proc/self/pagemap to search for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se in memory.
  • If we find aggressor/victim addresses where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bit flipped within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 64-bit word isn’t useful for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit, just skip that address set.
  • Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise, munmap() all but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aggressor and victim pages and begin cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit attempt.

In preparation for spraying page tables, we create a file in /dev/shm (a shared memory segment) that we will mmap() repeatedly. (See later for how we determine its size.) We write a marker value at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 start of each 4k page in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file so that we can easily identify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se pages later, when checking for PTE changes.

Note that we don’t want cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se data pages to be allocated from sequential physical addresses, because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n flips in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lower bits of physical page numbers would tend to be unexploitable: A PTE pointing to one data page would likely change to pointing to anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r data page.

To avoid that problem, we first deliberately fragment physical memory so that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel’s allocations from physical memory are randomised:

  • mmap() (with MAP_POPULATE) a block of memory that’s a large fraction of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 machine’s physical memory size.
  • Later, whenever we do something that will cause cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel to allocate a 4k page (such as a page table), we release a page from this block using madvise() + MADV_DONTNEED.

We are now ready to spray memory with page tables. To do this, we mmap() cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data file repeatedly:

  • We want each mapping to be at a 2MB-aligned virtual address, since each 4k page table covers a 2MB region of virtual address space. We use MAP_FIXED for this.
  • We cause cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel to populate some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PTEs by accessing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir corresponding pages. We only need to populate one PTE per page table: We know our bit flip hits cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Nth PTE in a page table, so, for speed, we only fault in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Nth 4k page in each 2MB chunk.
  • Linux imposes a limit of about 2^16 on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of VMAs (mmap()’d regions) a process can have. This means that our /dev/shm data file must be large enough such that, when mapped 2^16 times, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mappings create enough page tables to fill most of physical memory. At cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same time, we want to keep cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data file as small as possible so as not to waste memory that could instead be filled with page tables. We pick its size accordingly.
  • In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 middle of this, we munmap() cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 victim page. With a high probability, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel will reuse this physical page as a page table. We can’t touch this page directly any more, but we can potentially modify it via row hammering.

Having finished spraying, it’s hammer time. We hammer cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aggressor addresses. Hopefully this induces cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bit flip in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 victim page. We can’t observe cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bit flip directly (unlike in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NaCl exploit).

Now we can check whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r PTEs changed exploitably. We scan cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 large region we mapped to see whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r any of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PTEs now point to pages ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than our data file. Again, for speed, we only need to check cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Nth page within each 2MB chunk. We can check for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 marker value we wrote earlier. If we find no marker mismatches, our attempt failed (and we could retry).

If we find a marker mismatch, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n we have gained illicit access to a physical page. Hopefully this is one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page tables for our address space. If we want to be careful, we can verify whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r this page looks like one of our page tables. The Nth 64-bit field should look like a PTE (certain bits will be set or unset) and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rest should be zero. If not, our attempt failed (and we could retry).

At this point, we have write access to a page table, probably our own. However, we don’t yet know which virtual address this is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page table for. We can determine that as follows:

  • Write a PTE to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page (e.g. pointing to physical page 0).
  • Do a second scan of address space to find a second virtual page that now points to somewhere ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than our data file. If we don’t find it, our attempt failed (and we could retry).

Exploiting write access to page tables

We now have write access to one of our process’s page tables. By modifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page table, we can get access to any page in physical memory. We now have many options for how to exploit that, varying in portability, convenience and speed. The portable options work without requiring knowledge of kernel data structures. Faster options work in O(1) time, whereas slower options might require scanning all of physical memory to locate a data structure.

Some options are:

  • Currently implemented option: Modify a SUID-root executable such as /bin/ping, overwriting its entry point with our shell code, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n run it. Our shell code will cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n run as root. This approach is fast and portable, but it does require access to /proc/PID/pagemap: We load /bin/ping (using open() and mmap()+MAP_POPULATE) and query which physical pages it was loaded into using /proc/self/pagemap.
  • A similar approach is to modify a library that a SUID executable uses, such as /lib64/ld-linux-x86-64.so.2. (On some systems, SUID executables such as /bin/ping can’t be open()’d because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir permissions have been locked down.)
  • Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, less portable approaches are to modify kernel code or kernel data structures.
    • We could modify our process’s UID field. This would require locating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “struct cred” for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current process and knowing its layout.
    • We could modify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel’s syscall handling code. We can quickly determine its physical address using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SIDT instruction, which is exposed to unprivileged code.

Routes for causing row hammering

Our proof-of-concept exploits use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 x86 CLFLUSH instruction, because it’s cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 easiest way to force memory accesses to be sent to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 underlying DRAM and thus cause row hammering.

The fact that CLFLUSH is usable from unprivileged code is surprising, because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of legitimate uses for it outside of a kernel or device driver is probably very small. For comparison, ARM doesn’t have an unprivileged cache-flush instruction. (ARM Linux does have a cacheflush() syscall, used by JITs, for synchronising instruction and data caches. On x86, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 i-cache and d-cache are synchronised automatically, so CLFLUSH isn’t needed for this purpose.)

We have changed NaCl’s x86 validator to disallow CLFLUSH. Unfortunately, kernels can’t disable CLFLUSH for normal userland code. Currently, CLFLUSH can’t be intercepted or disabled, even using VMX (x86 virtualisation). (For example, RDTSC can be intercepted without VMX support. VMX allows intercepting more instructions, including WBINVD and CPUID, but not CLFLUSH.) There might be a case for changing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 x86 architecture to allow CLFLUSH to be intercepted. From a security engineering point of view, removing unnecessary attack surface is good practice.

However, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re might be ways of causing row hammering without CLFLUSH, which might work on non-x86 architectures too:

  • Normal memory accesses: Is it possible that normal memory accesses, in sufficient quantity or in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right pattern, can trigger enough cache misses to cause rowhammer-induced bit flips? This would require generating cache misses at every cache level (L1, L2, L3, etc.). Whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r this is feasible could depend on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 associativity of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se caches.

    If this is possible, it would be a serious problem, because it might be possible to generate bit flips from JavaScript code on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 open web, perhaps via JavaScript typed arrays.

  • Non-temporal memory accesses: On x86, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se include non-temporal stores (MOVNTI, MOVNTQ, MOVNTDQ(A), MOVNTPD, MOVNTSD and MOVNTSS) and non-temporals reads (via prefetches — PREFETCHNTA).

  • Atomic memory accesses: Some reports claim that non-malicious use of spinlocks can cause row hammering, although cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reports have insufficient detail and we’ve not been able to verify this. (See “The Known Failure Mechanism in DDR3 memory called ‘Row Hammer’”, Barbara Aichinger.) This seems unlikely on a multi-core system where cores share cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 highest-level cache. However, it might be possible on multi-socket systems where some pairs of cores don’t share any cache.

  • Misaligned atomic memory accesses: x86 CPUs guarantee that instructions with a LOCK prefix access memory atomically, even if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address being accessed is misaligned, and even if it crosses a cache line boundary. (See section 8.1.2.2, “Software Controlled Bus Locking”, in Intel’s architecture reference, which says “The integrity of a bus lock is not affected by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 alignment of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory field”.) This is done for backwards compatibility. In this case, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CPU doesn’t use modern cache coherency protocols for atomicity. Instead, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CPU falls back to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 older mechanism of locking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bus, and we believe it might use uncached memory accesses. (On some multi-CPU-socket NUMA machines, this locking is implemented via cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 QPI protocol racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than via a physical #LOCK pin.)

    If misaligned atomic ops generate uncached DRAM accesses, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y might be usable for row hammering.

    Initial investigation suggests that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se atomic ops do bypass cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cache, but that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are too slow for this to generate enough memory accesses, within a 64ms refresh period, to generate bit flips.

  • Uncached pages: For example, Windows’ CreateFileMapping() API has a SEC_NOCACHE flag for requesting a non-cacheable page mapping.

  • Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r OS interfaces: There might be cases in which kernels or device drivers, such as GPU drivers, do uncached memory accesses on behalf of userland code.

Experimental results

We tested a selection of x86 laptops that were readily available to us (all with non-ECC memory) using CLFLUSH with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “random address selection” approach above. We found that a large subset of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se machines exhibited rowhammer-induced bit flips. The results are shown in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 table below.

The testing was done using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rowhammer-test program available here:
https://github.com/google/rowhammer-test

Note that:

  • Our sample size was not large enough that it can be considered representative.
  • A negative result (an absence of bit flips) on a given machine does not definitively mean that it is not possible for rowhammer to cause bit flips on that machine. We have not performed enough testing to determine that a given machine is not vulnerable.

As a result, we have decided to anonymize our results below.

All of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 machines tested used DDR3 DRAM. It was not possible to identify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 age of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DRAM in all cases.

Laptop model Laptop year CPU family (microarchitecture) DRAM manufacturer Saw bit flip
1 Model #1 2010 Family V DRAM vendor E yes
2 Model #2 2011 Family W DRAM vendor A yes
3 Model #2 2011 Family W DRAM vendor A yes
4 Model #2 2011 Family W DRAM vendor E no
5 Model #3 2011 Family W DRAM vendor A yes
6 Model #4 2012 Family W DRAM vendor A yes
7 Model #5 2012 Family X DRAM vendor C no
8 Model #5 2012 Family X DRAM vendor C no
9 Model #5 2013 Family X DRAM vendor B yes
10 Model #5 2013 Family X DRAM vendor B yes
11 Model #5 2013 Family X DRAM vendor B yes
12 Model #5 2013 Family X DRAM vendor B yes
13 Model #5 2013 Family X DRAM vendor B yes
14 Model #5 2013 Family X DRAM vendor B yes
15 Model #5 2013 Family X DRAM vendor B yes
16 Model #5 2013 Family X DRAM vendor B yes
17 Model #5 2013 Family X DRAM vendor C no
18 Model #5 2013 Family X DRAM vendor C no
19 Model #5 2013 Family X DRAM vendor C no
20 Model #5 2013 Family X DRAM vendor C no
21 Model #5 2013 Family X DRAM vendor C yes
22 Model #5 2013 Family X DRAM vendor C yes
23 Model #6 2013 Family Y DRAM vendor A no
24 Model #6 2013 Family Y DRAM vendor B no
25 Model #6 2013 Family Y DRAM vendor B no
26 Model #6 2013 Family Y DRAM vendor B no
27 Model #6 2013 Family Y DRAM vendor B no
28 Model #7 2012 Family W DRAM vendor D no
29 Model #8 2014 Family Z DRAM vendor A no

We also tested some desktop machines, but did not see any bit flips on those. That could be because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y were all relatively high-end machines with ECC memory. The ECC could be hiding bit flips.

Testing your own machine

Users may wish to test cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own machines using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rowhammer-test tool above. If a machine produces bit flips during testing, users may wish to adjust security and trust decisions regarding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 machine accordingly.

While an absence of bit flips during testing on a given machine does not automatically imply safety, it does provide some baseline assurance that causing bit flips is at least difficult on that machine.

Mitigations

Targeted refreshes of adjacent rows

Some schemes have been proposed for preventing rowhammer-induced bit flips by changing DRAM, memory controllers, or both.

A system could ensure that, within a given refresh period, it does not activate any given row too many times without also ensuring that neighbouring rows are refreshed. Yoongu Kim et al discuss this in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir paper. They refer to proposals “to maintain an array of counters” (eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory controller or in DRAM) for counting activations. The paper proposes an alternative, probabilistic scheme called “PARA”, which is stateless and thus does not require maintaining counters.

There are signs that some newer hardware implements mitigations:

  • JEDEC’s recently-published LPDDR4 standard for DRAM (where “LP” = “Low Power”) specifies two rowhammer mitigation features that a memory controller would be expected to use. (See JEDEC document JESD209-4 — registration is required to download specs from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JEDEC site, but it’s free.)

    • “Targeted Row Refresh” (TRR) mode, which allows cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory controller to ask cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DRAM device to refresh a row’s neighbours.
    • A “Maximum Activate Count” (MAC) metadata field, which specifies how many activations a row can safely endure before its neighbours need refreshing.

    (The LPDDR4 spec does not mention “rowhammer” by name, but it does use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 term “victim row”.)

  • We found that at least one DRAM vendor indicates, in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir public data sheets, that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y implement rowhammer mitigations internally within a DRAM device, requiring no special memory controller support.

Some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 newer models of laptops that we tested did not exhibit bit flips. A possible explanation is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se laptops implement some rowhammer mitigations.

BIOS updates and increasing refresh rates

Have hardware vendors silently rolled out any BIOS updates to mitigate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rowhammer problem by changing how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BIOS configures cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CPU’s memory controller?

As an experiment, we measured cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time required to cause a bit flip via double-sided hammering on one Model #4 laptop. This ran in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “less than 5 minutes” range. Then we updated cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 laptop’s BIOS to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latest version and re-ran cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hammering test.

We initially thought this BIOS update had fixed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue. However, after almost 40 minutes of sequentially hammering memory, some locations exhibited bit flips.

We conjecture that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BIOS update increased cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DRAM refresh rate, making it harder — but not impossible — to cause enough disturbance between DRAM refresh cycles. This fits with data from Yoongu Kim et al’s paper (see Figure 4) which shows that, for some DRAM modules, a refresh period of 32ms is not short enough to reduce cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 error rate to zero.

We have not done a wider test of BIOS updates on ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r laptops.

Monitoring for row hammering using perf counters

It might be possible to detect row hammering attempts using CPUs’ performance counters. In order to hammer an area of DRAM effectively, an attacker must generate a large number of accesses to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 underlying DRAM in a short amount of time. Whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r this is done using CLFLUSH or using only normal memory accesses, it will generate a large number of cache misses.

Modern CPUs provide mechanisms that allow monitoring of cache misses for purposes of performance analysis. These mechanisms can be repurposed by a defender to monitor cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system for sudden bursts of cache misses, as truly cache-pessimal access patterns appear to be rare in typical laptop and desktop workloads. By measuring “time elapsed per N cache misses” and monitoring for abnormal changes, we have been able to detect aggressive hammering even on systems that were running under a heavy load (a multi-core Linux kernel compile) during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack. Unfortunately, while detection seems possible for aggressive hammering, it is unclear what to do in response, and unclear how common false positives will be.

While it is likely that attackers can adapt cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir attacks to evade such monitoring, this would increase cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 required engineering effort, making this monitoring somewhat comparable to an intrusion detection system.

On disclosures

The computing industry (of which Google is a part) is accustomed to security bugs in software. It has developed an understanding of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 importance of public discussion and disclosure of security issues. Through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se public discussions, it has developed a better understanding of when bugs have security implications. Though cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 industry is less accustomed to hardware bugs, hardware security can benefit from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same processes of public discussion and disclosure.

With this in mind, we can draw two lessons:

  • Exploitability of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug: Looking backward, had cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re been more public disclosures about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rowhammer problem, it might have been identified as an exploitable security issue sooner. It appears that vendors have known about rowhammer for a while, as shown by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 presence of rowhammer mitigations in LPDDR4. It may be that vendors only considered rowhammer to be a reliability problem.

  • Evaluating machines: Looking forward, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 release of more technical information about rowhammer would aid evaluation of which machines are vulnerable and which are not. At cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time of writing, it is difficult to tell which machines are definitely safe from rowhammer. Testing can show that a machine is vulnerable, but not that it is invulnerable.

We explore cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se two points in more detail below.

On exploitability of bugs

Vendors may have considered rowhammer to be only a reliability issue, and assumed that it is too difficult to exploit. None of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 public material we have seen on rowhammer (except for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 paper by Yoongu Kim et al) discusses security implications.

However, many bugs that appear to be difficult to exploit have turned out to be exploitable. These bugs might initially appear to be “only” reliability issues, but are really security issues.

An extreme example of a hard-to-exploit bug is described in a recent Project Zero blog post (see “The poisoned NUL byte, 2014 edition”). This shows how an off-by-one NUL byte overwrite could be exploited to gain root privileges from a normal user account.

To many security researchers, especially those who practice writing proof-of-concept exploits, it is well known that bit flips can be exploitable. For example, a 2003 paper explains how to use random bit flips to escape from a Java VM. (See “Using Memory Errors to Attack a Virtual Machine” by Sudhakar Govindavajhala and Andrew W. Appel.)

Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore, as we have shown, rowhammer-induced bit flips are sometimes more easily exploitable than random bit flips, because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are repeatable.

On vulnerability of machines

We encourage vendors to publicly release information about past, current and future devices so that security researchers, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 public at large, can evaluate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m with reference to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rowhammer problem.

The following information would be helpful:

  • For each model of DRAM device:

    • Is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DRAM device susceptible to rowhammer-induced bit flips at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 physical level?
    • What rowhammer mitigations does cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DRAM device implement? Does it implement TRR and MAC? Does it implement mitigations that require support from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory controller, or internal mitigations that don't require this?
  • For each model of CPU:

    • What mitigations does cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CPU's memory controller implement? Do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se mitigations require support from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DRAM devices?
    • Is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re public documentation for how to program cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory controller on machine startup?
    • Is it possible to read or write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory controller's settings after startup, to verify mitigations or enable mitigations?
    • What scheme does cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory controller use for mapping physical addresses to DRAM row, bank and column numbers? This is useful for determining which memory access patterns can cause row hammering.
  • For each BIOS: What rowhammer mitigations does cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BIOS enable in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CPU's memory controller settings? For example, does cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BIOS enable a double refresh rate, or enable use of TRR? Is it possible to review this?

At cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time of writing, we weren't able to find publicly available information on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above in most cases.

If more of this information were available, it would be easier to assess which machines are vulnerable. It would be easier to evaluate a negative test result, i.e. cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 absence of bit flips during testing. We could explain that a negative result for a machine is because (for example) its DRAM implements mitigations internally, or because its DRAM isn't susceptible at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 physical level (because it was manufactured using an older process), or because its BIOS enables 2x refresh. Such an explanation would give us more confidence that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 negative test result occurred not because our end-to-end testing was insufficient in some way, but because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 machine is genuinely not vulnerable to rowhammer.

We expect researchers will be interested in evaluating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 details of rowhammer mitigation algorithms. For example, does a device count row activations (as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MAC scheme suggests cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y should), or does it use probabilistic methods like PARA? Will cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mitigations be effective against double-sided row hammering as well as single-sided hammering? Could cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re be any problems if both cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DRAM device and memory controller independently implement cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own rowhammer mitigations?

Conclusion

We have shown two ways in which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DRAM rowhammer problem can be exploited to escalate privileges. History has shown that issues that are thought to be “only” reliability issues often have significant security implications, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rowhammer problem is a good example of this. Many layers of software security rest on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 assumption cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of memory locations don't change unless cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 locations are written to.

The public discussion of software flaws and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir exploitation has greatly expanded our industry’s understanding of computer security in past decades, and responsible software vendors advise users when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir software is vulnerable and provide updates. Though cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 industry is less accustomed to hardware bugs than to software bugs, we would like to encourage hardware vendors to take cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same approach: thoroughly analyse cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security impact of “reliability” issues, provide explanations of impact, offer mitigation strategies and — when possible — supply firmware or BIOS updates. Such discussion will lead to more secure hardware, which will benefit all users.

Credits

  • Matcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365w Dempsky proposed that bit flips in PTEs could be an effective route for exploiting rowhammer.
  • Thomas Dullien helped with investigating how many machines are affected, came up with double-sided hammering, ran cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BIOS upgrade experiment, and helped fill in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 details of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PTE bit flipping exploit.

Friday, February 13, 2015

Feedback and data-driven updates to Google’s disclosure policy

Posted by Chris Evans and Ben Hawkes, Project Zero; Heacá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r Adkins, Matt Moore and Michal Zalewski, Google Security; Gerhard Eschelbeck, Vice President, Google Security

Disclosure deadlines have long been an industry standard practice. They improve end-user security by getting security patches to users faster. As noted in CERT’s 45-day disclosure policy, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y also “balance cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 need of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 public to be informed of security vulnerabilities with vendors' need for time to respond effectively”. Yahoo!’s 90-day policy notes that “Time is of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 essence when we discover cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se types of issues: cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 more quickly we address cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 risks, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 less harm an attack can cause”. ZDI’s 120-day policy notes that releasing vulnerability details can “enable cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 defensive community to protect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user”.

Deadlines also acknowledge an uncomfortable fact that is alluded to by some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above policies: cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 offensive security community invests considerably more into vulnerability research than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 defensive community. Therefore, when we find a vulnerability in a high profile target, it is often already known by advanced and stealthy actors.

Project Zero has adhered to a 90-day disclosure deadline. Now we are applying this approach for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rest of Google as well. We notify vendors of vulnerabilities immediately, with details shared in public with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 defensive community after 90 days, or sooner if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendor releases a fix. We’ve chosen a middle-of-cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365-road deadline timeline and feel it’s reasonably calibrated for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current state of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 industry.

To see how things are going, we crunched some data on Project Zero’s disclosures to date. For example, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Adobe Flash team probably has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 largest install base and number of build combinations of any of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 products we’ve researched so far. To date, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y have fixed 37 Project Zero vulnerabilities (or 100%) within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 90-day deadline. More generally, of 154 Project Zero bugs fixed so far, 85% were fixed within 90 days. Restrict this to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 73 issues filed and fixed after Oct 1st, 2014, and 95% were fixed within 90 days. Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore, recent well-discussed deadline misses were typically fixed very quickly after 90 days. Looking ahead, we’re not going to have any deadline misses for at least cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rest of February.

Deadlines appear to be working to improve patch times and end user security -- especially when enforced consistently.

We’ve studied cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above data and taken on board some great debate and external feedback around some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corner cases for disclosure deadlines. We have improved cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 policy in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following ways:

  • Weekends and holidays. If a deadline is due to expire on a weekend or US public holiday, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 deadline will be moved to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next normal work day.
  • Grace period. We now have a 14-day grace period. If a 90-day deadline will expire but a vendor lets us know before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 deadline that a patch is scheduled for release on a specific day within 14 days following cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 deadline, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 public disclosure will be delayed until cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 availability of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 patch. Public disclosure of an unpatched issue now only occurs if a deadline will be significantly missed (2 weeks+).
  • Assignment of CVEs. CVEs are an industry standard for uniquely identifying vulnerabilities. To avoid confusion, it’s important that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first public mention of a vulnerability should include a CVE. For vulnerabilities that go past deadline, we’ll ensure that a CVE has been pre-assigned.

As always, we reserve cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right to bring deadlines forwards or backwards based on extreme circumstances. We remain committed to treating all vendors strictly equally. Google expects to be held to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same standard; in fact, Project Zero has bugs in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pipeline for Google products (Chrome and Android) and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se are subject to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same deadline policy.

Putting everything togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, we believe cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 policy updates are still strongly in line with our desire to improve industry response times to security bugs, but will result in softer landings for bugs marginally over deadline. Finally, we’d like to call on all researchers to adopt disclosure deadlines in some form, and feel free to use our policy verbatim if you find our data and reasoning compelling. We’re excited by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 early results that disclosure deadlines are delivering -- and with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 help of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 broader community, we can achieve even more.