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.

40 comments:

  1. Very impressive. What is scarier is that this problem will remain with us for years to come since it might not be possible to "patch" it

    ReplyDelete
  2. Does cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 test results above make a distinction between DDR3 and DDR3L memory? It seems like that family Y and Z are completely immune to rowhammering, X is a coin-flip, and W is mostly vulnerable. It should be noted that Intel started supporting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lower voltage DDR3L as an option in Ivy Bridge machines, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n made it mandatory in Haswells and above. Could this be a factor as well?

    ReplyDelete
    Replies
    1. There's only one entry for family Z so it's probably not safe to say that it's completely immune.

      Delete
    2. It would depend far more on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Silicon' construction techniques used by various memory builders.

      What might be an 'interesting' test would be to see if it only applies to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 complete CRAP cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y sell into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 consumer markets or if it applies to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 high level quality memory used in top end servers.

      This might also be useable in 'fake' Static' rams where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 actual internal array is Dram but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n it attempts to look like a Static ram externally :-), by having internal refresh circuitry

      If i was running research I would run tests in this area Static ram area as well, I would suspect that it might be more susceptible.

      Delete
    3. Rowhammer is a design defect in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory array. It will show up in all devices in a manufacturers' process node regardless of 2/3/4/3L or LP. It cannot be screened out.

      Pseudo-SRAM could also be susceptible if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are built with a defective bitcell design.

      Delete
  3. This comment has been removed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 author.

    ReplyDelete
  4. aww you ruined my crowdfunding campaign on Darkleaks

    ReplyDelete
  5. For testing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 full memory range, outside of an operating system, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is also MemTest86 V6.0, which also implements a row hammer test.

    ReplyDelete
  6. Glad desktops have better chances of being safe (although all of my credit cards are in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cloud) :) I turned this off after 500 iterations on desktop with not result while executing on a popular hosting provider exited on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first one!

    ReplyDelete
  7. Impressive!!!

    This exploit technology can be definitely applied to hypervisor, and cause privilege escalation to VMX root mode.

    ReplyDelete
  8. AMD makes available cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 information you've requested but were unable to find. See cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aptly named BIOS and Kernel Developer's Guides, which have been publicly available for years.

    An example of from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir most recent "Steamroller" cores: http://support.amd.com/TechDocs/49125_15h_Models_30h-3Fh_BKDG.pdf

    Of your requests:
    * "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?"

    Do you want to know which mitigation schemes from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 research paper are available? Likely few! It may not surprise you, but hardware takes a long time to change (assuredly longer than software).

    If you want to know current DRAM refresh time, see D18F2x8C on page 365 for each DRAM controller. Bits 17:16 define cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hardware refresh rate. A value of 3 in this field means cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 refresh rate is double normal. Section 2.9.14 "DRAM On DIMM Thermal Management and Power Capping" explains that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 controller may speed refresh rate because of temperature.

    * "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?"

    Section 2.9 "DRAM Controllers (DCTs)" contains cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subsection 2.9.9, "DCT/DRAM Initialization and Resume".

    * "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 set per DRAM controller. See cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 definition for D18F2x80 on page 363. Also Section 2.9.11 for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Channel and Chip Select interleaving settings. You may also want to read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 definition for D18F2x[5C:40] on pages 358-360 to see how chip select is done.

    * "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?"

    Reading: Yes, MSRs and PCI configuration space values make this available to kernel mode software as shown in BKDG.

    Writing: This is harder. Many DRAM controller settings require BIOS intervention and may break in protected mode. Worth trying!

    ReplyDelete
  9. This comment has been removed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 author.

    ReplyDelete
  10. If I understand correctly now everybody knows about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bad guys can build cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 special exploit software and exploit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability and we cannot do anything about it? The DRAM cannot be fixed/patched. Really?

    ReplyDelete
    Replies
    1. This comment has been removed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 author.

      Delete
  11. Hi! Is this also an issue for PPC? Look at section 11.5 here: http://cache.freescale.com/files/32bit/doc/ref_manual/E500CORERM.pdf
    Could clflush be replaced in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rowhammer-test program by one of those instructions? Which one in that case?

    ReplyDelete
  12. For me this is simply a NOT WORKING memory and it should be retired from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 market.

    ReplyDelete
    Replies
    1. DRAM suppliers agree. Everyone should buy new DRAM. I wonder if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y planned this.

      Delete
  13. This comment has been removed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 author.

    ReplyDelete
  14. The problem seems not solvable by DRAM-testing at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory-manufacturers. Even if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 testing gets intesified, DRAMs degredate and might show cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issues lateron.
    DRAM memory is not like a simple switch that is eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r on or off. The databits are stored in leaky capacitors having a size of a few nanometers, holding a charge of less than 10 to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 power of -15 coulombs (that is "femtocoulombs'!). If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 charge is above a certain level, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bit is a 1 and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise a 0. The charge leaks out within a few milliseconds and must be refreshed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CPU. At cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same time we expect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory cells to be able to change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir content 1.6 billion times per second or more, we want billions of bits to be in a tiny little chip and it should please consume practically no power.
    DRAM memory is extremely sensitive. All cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cells are connected to each ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r by bitlines, wordlines, address lines. If you store a pattern of bits into one corner, some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 power leaks out to ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r memory cells and affects cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m. Some cells have better isolation and can hold cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data a few milliseconds longer than ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rs. Heat, antennas, radiation, electromagnetic fields stress cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory. DRAM memory also degradates over time. That means: New DRAM memory often is failure-free for a while, but at some point of time sometimes shows a single bit-flip here or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re.
    Bit-flips in DRAM do happen quite often, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are not 'defects'! They are transient effects having many possible root-causes. Overwriting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 flipped bit works and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue is not directly reproducable. This explains why every crashed application works fine again after a Reset, simply because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is no 'permanent defect', but just a 'bit-flip effect'.
    I recommend to read this document: http://users.ece.cmu.edu/~yoonguk/papers/liu-isca13.pdf
    It shows furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r examples of why bit-flips occur unexpectedly.

    The only good news is: ECC error correction helps to solve or at least reduce cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem.

    ECC does not only protect from hacker-attacks by row-hammering, it also improves cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overall stability.

    While a PC tends to fail sometimes with freezing mousepointers, crashing programs, erratic menu-bars or even blue-screens, you won't find such issues on systems equipped with ECC. Most servers use ECC and run for years without ever having to be rebooted. Some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 High-End Cisco routers use ECC-memory and never have issues.

    For PCs and laptops, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are new memory-modules coming to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 market which are built with Intelligent Memory ECC DRAMs. These are Non-ECC DIMMs and SO-DIMMs made of DRAMs that have an on-chip ECC correction (called ECC DRAM, read more here: http://www.intelligentmemory.com/fileadmin/download/PB_IM_ECC_DRAM.pdf).

    The modules made of those ECC DRAMs will be called intECC-modules and are about to hit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 market next week.
    Unfortunately cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 maximum memory capacity is limited to 2GB per module for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time being.

    The Intelligent Memory ECC DRAM chips which are used on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 upcoming intECC memory modules, could also be used on many ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r electronic products of our daily life to make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m more reliable.
    How often does your WiFi-Router, smartphone, settop box, DVR or ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r electronics need to be rebooted? I bet cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first thing we all learn about a new device is how to restart it. Many or maybe most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se hiccups are bit-errors in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory, which ECC protects from.

    Even HDD drives use a DRAM-memory chip for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 write-buffer/cache. A bit flip in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DRAM on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 HDD can cause those ugly effects of "file is corrupted and can not be opened".
    If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 manufacturers would replace cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 conventional unprotected memory chips with those new ECC DRAMs, I am sure we'd see a new level of reliability with much less failures.

    ReplyDelete
    Replies
    1. Alas, most such issues as you describe are caused by bugs in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 software - in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 applications, or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 libraries used. The errors caused by ram errors are comparatively infrequent. I have definitely found strong correlation of bugginess with particular applications or device driver versions, no matter what hardware it is running on. ECC ram is nice, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stability you are seeing is simply due to a lot of work by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 engineers working on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 higher price systems.

      Delete
    2. Well, if this was cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n why does a server with ECC - running Windows server and many complex software 24/7 for years - never fail? ECC does not help when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 software is buggy, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PC also runs Windows and less complex software, but you can hardly keep it switched on for longer than a day and still randomly have unexpected erratic behaviour sometimes.

      Delete
    3. Rowhammer is a defect of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory array design, not a degradation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device, although degradation DOES happen it is not related to row hammer.

      Rowhammer is a problem because it causes corruption of multiple bits in a row. This cannot be corrected by ECC.

      Delete
    4. cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chances to corrupt multi bits in a row that are used for ECC checksum correction are quite small. Statistically this will reduce cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 effect by many order of magnitudes. Once you have read out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ECC algorithm is finding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fail and correcting it. Double bits are still detected, and also cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chance to detect multibit errors is still given.
      The test will run on all DRAMs of a rank in parallel. In case of controller based ECC you might get a chance that single bit flips on multiple DRAMs will happen.
      if you use DRAM with integrated ECC as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Intelligent memory chips in combination with controller based ECC you would have double protection: one for a fail inside a DRAM and one for single bit fails over multiple DRAMs.
      ==> on DRAMs it will always come down to statistics and propability when talking about fails .. but with ECC (controller and/or DRAM based) cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 propability to get fails is reduced by magnitudes ..
      Hermann

      Delete
    5. Hermann, I'm not sure why you mention cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 statistical implications. We are not discussing typical system operation where statistical behavior applies, racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r a pathological worst case exploit in which you need just one key to open cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 door. Yes, ECC covers SECDED, but can you explain why once you go beyond 2 bit errors you claim this is not a risk?
      As I understand it RH has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 potential in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 worst case to corrupt all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bits in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 physically adjacent row. Under this scenario what mechanisms does cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system have to detect or protect against this? Once that is determined we can cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n delve into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 statistics of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 implications of partial row corruption, all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way down to 3 bits. Thanks,

      Delete
    6. Hi mgs,
      in DRAM everything is about statistics .. Even DRAM spec up to DDR3 assumes a BER=0 (on interface and array) this is just a nice assumption but just not valid .. just DDR4 starts to take this into account. ..
      All fail mechanisms (including RowHammer) are just a matter of probaility if it fails and if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fail can be corrected or detected with any means. Getting a 3bit error is haveing a low probability and once you got it you will have a statistical probability that you are going to catch it even with SECDED. I did not mention that it is no risk, I'm just saying this is question of statistics.

      Yes, row hammer can have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 potential to corrupt bits in adjacent rows (if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DRAM vendor did not a good job in eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r designing or testing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 array).
      You don't know at which point in time a single bit error occurs, and once you do a readout with ECC you will correct it. if you wait longer you might get a double bit error and an ECC based system will stop and tell you that it run into an uncorrectable error. If you get more than 2 errors cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are still chances that that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 error is detected and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system stops. if you run rowhammer too long you have so many errors that you can not attack cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system any more, as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code crashes completely .. so we are back in probabilities if you want to use this behavior for attacking a system. And ECC will lower cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 probability that you will get a fail allows cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack.
      If you combine now Chipset ECC (correcting one bit fail over 4, 8 or 16DRAM DQ width) with DRAM devices with built in ECC (correcting one fail for each DRAM burst) you are going to decrease cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 probability for a Fail that allows cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack even furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r.
      And even if a single bit fails it need to be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right bit to allow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack ..

      Thats cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reason why I think especially with ECC it's all about statistics for such a scenario ...

      The question for me is: Why this discussion on RowHammer ?

      You can get you fails in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DRAM much simpler, but maybe with less accuracy where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fail happens. Is this really less critical for security ?
      - There is no protection to change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 controller registers during runtime. So adjusting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Refreshtimes is very simple. Now you can eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r try rowhammer on with this weakend array or just access all ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r WL in order to refresh cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se by read accesses ..
      - Maybe you want to check your SPD on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DIMMs ... is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Software Write protect really set ?
      Change write recovery times for AP and do a lot of reads to one Row. Nobody says that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 critical addresspace does not share one row. So you can introduce errors along cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 row ..

      There are so many options to get a Fail on a DRAM .. it is just a question of statistics and probability which one leads fastest to a Fail that allows to attack a system. With ECC (on controller or on DRAM) this probaility is just lowered a lot .. but still not 0.

      Hermann

      Delete
    7. It is just a given that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DRAM vendors as a whole did do a poor job designing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 array. Prior to this it was assumed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DRAM were not susceptible to RH and on secure systems I'd assume cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 alternate attacks you mention are not possible. So in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re was a zero risk from this. Now by introducing susceptible DRAM into a secure system cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 risk is non-zero and needs to be mitigated. It seems that every DRAM produced in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last 5 years has this susceptibility. That's a huge installed base at risk.

      Delete
    8. Hi mgs, sorry to destroy your secure world ;-) ..
      RowHammer is an old issue and DRAM has never been save (at least in my understanding).. in order to get save DRAM systems people implement things like chipkill, DIMM redundancy and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r fancy features .. but only to lower cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 risk of a fail (or attack), not to have zero risk.
      And I don't agree on DRAM vendors as ahole did a pure job. It is really a difficult task to Design a DRAM array and test it properly. How good it is done (especially cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 testing) is economy driven.
      If you spend enough money you can buy DRAM and Systems that lower cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 probaility of a fail (that can be used for an attack) to very low numbers .. but industry is not willing to spend this money (and I have to admit, that also my system is having no ECC for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 100GB of Memory installed.)
      Seems that probability of fail is still with conventional methods low enough ..

      Why do you think cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 methods I describe are not possible? I think cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are simpler to implement than row hammer code and have more potential to get a successfull attack executed.

      Hermann

      Hermann

      Delete
    9. This comment has been removed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 author.

      Delete
    10. I suppose you are right. The systems which are capable of being secured against cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacks you describe are built by companies who are also capable of and have already mitigated against RH.

      I used to program ATE memory test a long time ago and row hammer never failed. I think this problem emerged when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DRAM makers made a conscious decision to design an array that had less margin to this failure mode. They were assuming that statistically, during normal system operation, that RH would never occur, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y were right. Until one day a certain server CPU maker decided to allow customers to turn off caching to speed up database performance. That's when row hammer re-appeared having been dormant for nearly 30 years, and caused system crashes on ECC protected, chipkill protected, high end enterprise servers. That was several years ago. The patents didn't start to appear until after that.

      Delete
    11. and even so, row hammer defective DRAMs are still being produced.

      Delete
  15. So consumer-grade gear lacking ECC protection doesn't use anything at all to detect even single-bit errors? Heck, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original IBM PC used DRAM parity.

    ReplyDelete
    Replies
    1. The IBM PC was a business machine and was built with DRAM that inherently had soft errors. Eventually soft errors were bought down to a tolerable level and parity was dropped. This row-hammer problem is a really big oops. Fortunately DRAM makers have designed it out (again) in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir newer array designs.

      Delete
  16. We have been writing about this topic for almost 9 months now. Glad Google gave us a mention. We created a feature in our DDR Detective tool to detect excessive ACTIVATE (ACT) commands to a single row address on a DIMM or SODIMM module. We have posted videos on our YouTube channel giving more information (FuturePlus Systems). If you have critical applications I highly recommend you test to see if your application creates cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se excessive ACT commands. Our tool is available for short term rental. Please contact us barb.aichinger@futureplus.com if you would like more information. Also check out www.DDRDetective.com/row-hammer for more information

    ReplyDelete
  17. Amused me somewhat reading this that one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first computers I built, back in 1979, used 4K x1 DRAM chips that ICL had rejected (and essentially thrown away) because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y suffered from what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y called pattern sensitivity failures... essentially cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same problem as this, writing certain patterns into memory could induce changes in nearby bits if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory timing was near cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 limit.

    ReplyDelete
  18. > In https://github.com/google/rowhammer-test
    >
    > How to run cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 test:
    >
    > ./make.sh
    > ./rowhammer_test
    > The test should work on Linux or Mac OS X, on x86 only.


    Why on x86 only, is x86-64 is also ok?


    x86 only.

    ReplyDelete
  19. I got some results from our own row-hammer tests performed on Non-ECC modules on different platforms using Memtest 6.0. All platforms failed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 row-hammer test with different memories sooner or later.
    Every single fail was a single bit flip and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re were no double-bit flips at all. The amount of single-bit-flips per each pass of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 test was between 3 and 40 bit-flips and spread over multiple different addresses and different DRAMs on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 modules.

    Let's say a memory module uses 8 Chips of 2Gbit capacity each = 2GByte (256Mx64).
    With 40 bit-flips in a row-hammer-test run by Memtest, this is averaging to 5 bit-flips per DRAM chip throughout a complete row-hammer test-pass. Unfortunately I do not know how often Memtest hammers cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rows in one pass.

    The modules output data in 64 bit-words. There are 256 Million of such 64 Bit words in a 2GB module. By having ECC, each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se 256 million 64 bit words could have one bit-flip and ECC would still be able to correct cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m.
    40 bit-flips within 256 million 64 bit-words is 'peanuts' for ECC! With such small amount of bit-flips it is very unlikely that TWO of those bit-flips occur in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same 64 bit-word causing an uncorrectable double-bit error.
    This said, ECC is a very effective row-hammer protection-method.

    I doubt that TRR, MAC or increasing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 refresh-rate can solve cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem. The cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ory is that adjacent rows survive a certain amount of row-hammers before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y better should be refreshed. "Testing" if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DRAMs can take 300k hammer-cycles is not a guarantee that it will always survive 300k hammers. It could also sometimes fail after just a handful of accesses when you are unlucky. It is not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "amount of cycles" that causes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bit-flips.

    Also: Don't forget that DRAMs do degredate and get more sensitive to disturbances after some time of use. A brandnew DRAM might be surviving 300k hammers, but what if it gets a bit older?

    Besides row-hammering, DRAMs are also sensitive to heat and to radiation (from antennas or radioactivity, even natural ground-radiation). VRT-effects (variable retention time) and data-pattern-dependence (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 retention time of each DRAM cell is significantly affected by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data stored in ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r DRAM cells) also cause bit-flips. TRR and MAC does not help against this at all.
    The only solution is to detect and correct cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bit-flips -> ECC Error Correction

    Row-Hammer is a typical hacker-attack (=intentional), while all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r issues are non-intentional bit-flips. If you are unlucky, it does not even need a row-hammer software, but a simple multi-read of a row by your own software-code can cause a bit-flip in an adjacent row.

    ANY bit-flip - no matter if intentionally triggered or not - can cause a malfunction of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 software/cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system, or result in a crash or data corruption. Please do not only look at PCs, laptops or servers, but also think of all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r intelligent electronics out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re, like networking systems, access controls, telecommunication, medical devices, automotive, industrial computers of all kinds, etc. These will typically not be row-hammered, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y still sometimes fail and need to be reset, although cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are expected to always run stable.
    I think everybody had cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 experience that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 smartphone, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 settop box, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 router or ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r electronics "needed a reset" -> this was most-likely caused by a bit-flip. While home-electronics are less critical, most industrial electronics are expected not to have such issues. Still cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y do.

    All bit-flips have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same root-cause -> weaknesses of memory-cells
    The best solution for ALL above mentioned issues is to have ECC

    With ECC, all applications could become a lot more stable. They would run for years without ever having to be reset/rebooted. And at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same time cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y will also be row-hammer-safer.

    The DRAM makers should follow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trend that Intelligent Memory started: Integrate ECC into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DRAM-chips instead of trying to find insecure workarounds only against row-hammering by MAC, TRR, faster refreshing, etc.

    ReplyDelete
  20. Can anyone suggest cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 equivalent instruction of CLFLUSH for ARM Processor. The CLFLUSH is specific to x86 Processor

    ReplyDelete
    Replies
    1. http://infocenter.arm.com/help/topic/com.arm.doc.ddi0092b/DDI0092B_ARM940T_TRM.pdf
      Page 25

      Delete
  21. How long exactly did you leave those test running to find those bit flips?

    Are we talking about in 5 minutes, hours, days?

    ReplyDelete
  22. I am confused as to why this problem is not treated as a memory defect due to which under certain conditions when a row is accessed many times cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 charge is leaks between cells in different rows? this sounds like something that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dram vendor could easily screen for with a memory test algorithm during production like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y already do for ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r memory defect behaviors. I would think of this as a bad dram part being used in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system and hence causing unexpected behavior.

    ReplyDelete