| From: David Collier-Brown via talk <[email protected]>

| Oracle and Fujitsu (who actually make the chips) still hasn't said which
| machine types will suffer from speculation attacks, but did implement a
| hardware cache change recently in the M7 and M8  series (the conventional,
| glow-in-the-dark 5 GHz chipsets that speculate wildly) which they market as
| "Silicon Secured Memory".

The date on this document (2016 Feb 11) suggests that it isn't about
Spectre-like or Meltdown-like attacks.

| It reads as if they've been having trouble with "invalid [memory references],
| stale memory reference and buffer overflows", and have added microcode to
| cause SEGVs before the data arrives if you try to fetch a cache line that
| isn't the same "version" as your process. Version sounds like a short value
| used like a pid, but don't quote me on that: the papers are written by
| marketers, not engineers (;-))
| 
| See
| 
https://blogs.oracle.com/partnertech/sas-and-oracle-sparc-m7-silicon-secured-memory

Interesting.  This looks like it catches bugs where a program uses an old 
pointer that points to memory that has since been freed and possibly 
reallocated.

- the metadata is only 4 bits, so there could be cases that are not
  caught (not too likely unless the error is engineered by an
  opponent)

- the metadata is per cache-line.  I'm guessing that that means the
  malloc(3) and free(3) routines must paint the memory with this
  metadata, with one operation per cache-line-sized chunk of RAM.

An additional feature would be that if a pointer were used to
attempt to reference the next object in memory, it would likely fail
due to metadata clash.

On Linux there is a library called Electric Fence (efence) that will
catch roughly the same errors.  When you link it in, each malloc
allocates a whole new page of memory.  Free unmaps that page.  So
references through dangling pointers become segfaults.  Bonus: it
places the object at the end of the page so that overruns cause
segfaults.  (Fine print:  there is a global runtime option to place
the objects at the start of pages so underrun is caught instead.)

In theory, efence is quite expensive: each object takes a page of
memory.  Core dumps get quite large.  But in many real-world programs,
the memory isn't a problem.  I used this extensively many years ago
when memories were a lot smaller and addresses were only 32 bits.

I would expect that the SPARC feature could be used in production code
whereas few would use efence that way.

With a sensible high level language, these checks should not be important. 
But for C and C++ it is useful.  When trying to debug a failure, it is 
really nice to know automatically that it is or isn't due to this kind of 
error.  It is also nice to know that this kind of error won't be silent.
---
Talk Mailing List
[email protected]
https://gtalug.org/mailman/listinfo/talk

Reply via email to