A more general possible meltdown/spectre countermeasure

Eric McCorkle eric at metricspace.net
Fri Jan 5 23:30:21 UTC 2018


Ah, superpages. I wouldn't think so. The cpu still has to do a page table walk (just stopping at the top level page table), and would discover that it's not accessible.

On January 5, 2018 6:24:14 PM EST, Warner Losh <imp at bsdimp.com> wrote:
>I mean the mappings we have in the kernel that map all of memory to a
>specific page using 512GB pages in
>sys/amd64/amd64/pmap.c:create_pagetables. This allows us to map any PA
>to a
>VA with simple math rather than a page table walk.
>
>Warner
>
>On Fri, Jan 5, 2018 at 4:10 PM, Eric McCorkle <eric at metricspace.net>
>wrote:
>
>> I'm not sure what you mean by direct map.  Do you mean TLB?
>>
>> On 01/05/2018 18:08, Warner Losh wrote:
>> > Wouldn't you have to also unmap it from the direct map for this to
>be
>> > effective?
>> >
>> > Warner
>> >
>> >
>> > On Fri, Jan 5, 2018 at 3:31 PM, Eric McCorkle <eric at metricspace.net
>> > <mailto:eric at metricspace.net>> wrote:
>> >
>> >     Well, the only way to find out would be to try it out.
>> >
>> >     However, unless I'm missing something, if you're trying to pull
>a
>> >     meltdown attack, you try and fetch from the kernel.  If that
>location
>> >     isn't cached (or if your cache is physically indexed), you need
>the
>> >     physical address (otherwise you don't know where to look), and
>thus
>> have
>> >     to go through address translation, at which point you detect
>that the
>> >     page isn't accessible and fault.  In the mean time, you can't
>> >     speculatively execute any of the operations that load up the
>> >     side-channels, because you don't have the sensitive data.
>> >
>> >     The reason you can pull off a meltdown attack at all is that a
>> >     virtually-indexed cache lets you get the data in parallel with
>> address
>> >     translation (breaking the dependency between address
>translation and
>> >     fetching data), which takes 1000s of cycles for a TLB miss,
>during
>> which
>> >     you have the data and can launch a whole bunch of transient
>ops.
>> >
>> >     Again, these are uncharted waters we're in; so it's entirely
>possible
>> >     I'm missing something here.
>> >
>> >     On 01/05/2018 17:22, Warner Losh wrote:
>> >     > While you might be right, I've seen no indication that a
>cache miss
>> >     > would defeat these attacks in the public and non-public data
>I've
>> looked
>> >     > at, even though a large number of alternatives to the
>published
>> >     > workarounds have been discussed. I'm therefore somewhat
>skeptical
>> this
>> >     > would be effective. I'm open, however, to data that changes
>that
>> >     > skepticism...
>> >     >
>> >     > Warner
>> >     >
>> >     > On Fri, Jan 5, 2018 at 3:15 PM, Eric McCorkle <
>> eric at metricspace.net <mailto:eric at metricspace.net>
>> >     > <mailto:eric at metricspace.net <mailto:eric at metricspace.net>>>
>> wrote:
>> >     >
>> >     >     Right, but you have to get the value "foo" into the
>pipeline
>> in order
>> >     >     for it to affect the side-channels.  This technique
>attempts
>> to stop
>> >     >     that from happening.
>> >     >
>> >     >     Unless I made a mistake, non-cached memory reads force
>address
>> >     >     translation to happen first, which detects faults and
>blocks
>> the
>> >     >     meltdown attack.
>> >     >
>> >     >     It also stops spectre with very high probability, as it's
>very
>> unlikely
>> >     >     that an uncached load will arrive before the speculative
>> thread gets
>> >     >     squashed.
>> >     >
>> >     >     On 01/05/2018 17:10, Warner Losh wrote:
>> >     >     > I think this is fatally flawed.
>> >     >     >
>> >     >     > The side channel is the cache. Not the data at risk.
>> >     >     >
>> >     >     > Any mapped memory, cached or not, can be used to
>influence
>> the cache.
>> >     >     > Storing stuff in uncached memory won't affect the side
>> channel one bit.
>> >     >     >
>> >     >     > Basically, all attacks boil down to tricking the
>processor,
>> at elevated
>> >     >     > privs, to doing something like
>> >     >     >
>> >     >     > a = foo[offset];
>> >     >     >
>> >     >     > where foo + offset are designed to communicate
>information
>> by populating
>> >     >     > a cache line. offset need not be cached itself and can
>be
>> the result of
>> >     >     > simple computations that depend on anything accessible
>at
>> all in the kernel.
>> >     >     >
>> >     >     > Warner
>> >     >     >
>> >     >     > On Fri, Jan 5, 2018 at 3:02 PM, Eric McCorkle <
>> eric at metricspace.net <mailto:eric at metricspace.net>
>> >     <mailto:eric at metricspace.net <mailto:eric at metricspace.net>>
>> >     >     > <mailto:eric at metricspace.net
><mailto:eric at metricspace.net>
>> >     <mailto:eric at metricspace.net <mailto:eric at metricspace.net>>>>
>wrote:
>> >     >     >
>> >     >     >     Re-posting to -hackers and -arch.  I'm going to
>start
>> working on
>> >     >     >     something like this over the weekend.
>> >     >     >
>> >     >     >     -------- Forwarded Message --------
>> >     >     >     Subject: A more general possible meltdown/spectre
>> countermeasure
>> >     >     >     Date: Thu, 4 Jan 2018 23:05:40 -0500
>> >     >     >     From: Eric McCorkle <eric at metricspace.net <mailto:
>> eric at metricspace.net>
>> >     >     <mailto:eric at metricspace.net
><mailto:eric at metricspace.net>>
>> >     <mailto:eric at metricspace.net <mailto:eric at metricspace.net>
>> >     >     <mailto:eric at metricspace.net
><mailto:eric at metricspace.net>>>>
>> >     >     >     To: freebsd-security at freebsd.org <mailto:
>> freebsd-security at freebsd.org>
>> >     >     <mailto:freebsd-security at freebsd.org
><mailto:freebsd-security@
>> freebsd.org>>
>> >     >     >     <mailto:freebsd-security at freebsd.org <mailto:
>> freebsd-security at freebsd.org>
>> >     >     <mailto:freebsd-security at freebsd.org
><mailto:freebsd-security@
>> freebsd.org>>>
>> >     <freebsd-security at freebsd.org
><mailto:freebsd-security at freebsd.org>
>> >     >     <mailto:freebsd-security at freebsd.org
><mailto:freebsd-security@
>> freebsd.org>>
>> >     >     >     <mailto:freebsd-security at freebsd.org
>> >     <mailto:freebsd-security at freebsd.org>
>> >     >     <mailto:freebsd-security at freebsd.org
>> >     <mailto:freebsd-security at freebsd.org>>>>
>> >     >     >
>> >     >     >     I've thought more about how to deal with
>> >     meltdown/spectre, and
>> >     >     I have an
>> >     >     >     idea I'd like to put forward.  However, I'm still
>in
>> >     something
>> >     >     of a
>> >     >     >     panic mode, so I'm not certain as to its
>effectiveness.
>> >     >     Needless to
>> >     >     >     say, I welcome any feedback on this, and I may be
>> completely
>> >     >     off-base.
>> >     >     >
>> >     >     >     I'm calling this a "countermeasure" as opposed to a
>> >     >     "mitigation", as
>> >     >     >     it's something that requires modification of code
>as
>> >     opposed to a
>> >     >     >     drop-in patch.
>> >     >     >
>> >     >     >     == Summary ==
>> >     >     >
>> >     >     >     Provide a kernel and userland API by which memory
>> allocation
>> >     >     can be done
>> >     >     >     with extended attributes.  In userland, this could
>be
>> >     >     accomplished by
>> >     >     >     extending MMAP flags, and I could imagine a
>> >     >     malloc-with-attributes flag.
>> >     >     >      In kernel space, this must already exist, as
>drivers
>> >     need to
>> >     >     allocate
>> >     >     >     memory with various MTRR-type attributes set.
>> >     >     >
>> >     >     >     The immediate aim here is to store sensitive
>information
>> >     that must
>> >     >     >     remain memory-resident in non-cacheable memory
>locations
>> >     (or,
>> >     >     if more
>> >     >     >     effective attribute combinations exist, using those
>> >     instead).
>> >     >     See the
>> >     >     >     rationale for the argument why this should work.
>> >     >     >
>> >     >     >     Assuming the rationale holds, then the attack
>surface
>> should
>> >     >     be greatly
>> >     >     >     reduced.  Attackers would need to grab sensitive
>data
>> >     out of stack
>> >     >     >     frames or similar locations if/when it gets copied
>there
>> for
>> >     >     faster use.
>> >     >     >      Moreover, if this is done right, it could dovetail
>> >     nicely into a
>> >     >     >     framework for storing and processing sensitive
>assets in
>> >     more
>> >     >     secure
>> >     >     >     hardware[0] (like smart cards, the FPGAs I posted
>> >     earlier, or
>> >     >     other
>> >     >     >     options).
>> >     >     >
>> >     >     >     The obvious downside is that you take a performance
>hit
>> >     >     storing things
>> >     >     >     in non-cacheable locations, especially if you plan
>on
>> >     doing heavy
>> >     >     >     computation in that memory (say,
>encryption/decryption).
>> >     >     However, this
>> >     >     >     is almost certainly going to be less than the
>projected
>> >     30-50%
>> >     >     >     performance hit from other mitigations.  Also, this
>> >     technique
>> >     >     should
>> >     >     >     work against spectre as well as meltdown (assuming
>the
>> >     >     rationale holds).
>> >     >     >
>> >     >     >     The second downside is that you have to modify code
>for
>> this
>> >     >     to work,
>> >     >     >     and you have to be careful not to keep copies of
>> sensitive
>> >     >     information
>> >     >     >     around too long (this gets tricky in userland,
>where you
>> >     might get
>> >     >     >     interrupted and switched out).
>> >     >     >
>> >     >     >
>> >     >     >     [0]: Full disclosure, enabling open hardware
>> implementations
>> >     >     of this
>> >     >     >     kind of thing is something of an agenda of mine.
>> >     >     >
>> >     >     >     == Rationale ==
>> >     >     >
>> >     >     >     (Again, I'm tired, rushed, and somewhat panicked so
>my
>> logic
>> >     >     could be
>> >     >     >     faulty at any point, so please point it out if it
>is)
>> >     >     >
>> >     >     >     The rationale for why this should work relies on
>> >     assumptions about
>> >     >     >     out-of-order pipelines that cannot be guaranteed to
>> >     hold, but are
>> >     >     >     extremely likely to be true.
>> >     >     >
>> >     >     >     As background, these attacks depend on out-of-order
>> >     execution
>> >     >     performing
>> >     >     >     operations that end up affecting cache and
>> branch-prediction
>> >     >     state,
>> >     >     >     ultimately storing information about sensitive data
>in
>> these
>> >     >     >     side-channels before the fault conditions are
>detected
>> and
>> >     >     acted upon.
>> >     >     >     I'll borrow terminology from the paper, using
>"transient
>> >     >     instructions"
>> >     >     >     to refer to speculatively executed instructions
>that will
>> >     >     eventually be
>> >     >     >     cancelled by a fault.
>> >     >     >
>> >     >     >     These attacks depend entirely on transient
>instructions
>> >     being
>> >     >     able to
>> >     >     >     get sensitive information into the processor core
>and
>> then
>> >     >     perform some
>> >     >     >     kind of instruction on them before the fault
>condition
>> >     cancels
>> >     >     them.
>> >     >     >     Therefore, anything that prevents them from doing
>this
>> >     >     *should* counter
>> >     >     >     the attack.  If the actual sensitive data never
>makes it
>> to
>> >     >     the core
>> >     >     >     before the fault is detected, the dependent memory
>> >     >     accesses/branches
>> >     >     >     never get executed and the data never makes it to
>the
>> >     >     side-channels.
>> >     >     >
>> >     >     >     Another assumption here is that CPU architects are
>going
>> to
>> >     >     want to
>> >     >     >     squash faulted instructions ASAP and stop issuing
>along
>> >     those
>> >     >     >     speculative branches, so as to reclaim execution
>units.
>> So
>> >     >     I'm assuming
>> >     >     >     once a fault comes back from address translation,
>then
>> >     transient
>> >     >     >     execution stops dead.
>> >     >     >
>> >     >     >     Now, break down the cases for whether the address
>> containing
>> >     >     sensitive
>> >     >     >     data is in cache and TLB or not.  (I'm assuming
>here that
>> >     >     caches are
>> >     >     >     virtually-indexed, which enables cache lookups to
>bypass
>> >     address
>> >     >     >     translation.)
>> >     >     >
>> >     >     >     * In cache, in TLB: You end up basically racing
>between
>> the
>> >     >     cache and
>> >     >     >     TLB, which will very likely end up detecting the
>fault
>> >     before
>> >     >     the data
>> >     >     >     arrives, but at the very worst, you get one or two
>> cycles of
>> >     >     transient
>> >     >     >     instruction execution before the fault.
>> >     >     >
>> >     >     >     * In cache, not in TLB: Virtually-indexed tagged
>means
>> >     you get
>> >     >     a cache
>> >     >     >     lookup racing a page-table walk.  The cache lookup
>beats
>> the
>> >     >     page table
>> >     >     >     walk by potentially hundreds (maybe thousands) of
>cycles,
>> >     >     giving you a
>> >     >     >     bunch of transient instructions before a fault gets
>> >     >     triggered.  This is
>> >     >     >     the main attack case.
>> >     >     >
>> >     >     >     * Not in cache, in TLB: Memory access requires
>address
>> >     >     translation,
>> >     >     >     which comes back almost immediately as a fault.
>> >     >     >
>> >     >     >     * Not in cache, not in TLB: You have to do a page
>table
>> walk
>> >     >     before you
>> >     >     >     can fetch the location, as you have to go out to
>physical
>> >     >     memory (and
>> >     >     >     therefore need a physical address).  The page table
>walk
>> >     will
>> >     >     come back
>> >     >     >     with a fault, stopping the attack.
>> >     >     >
>> >     >     >     So, unless I'm missing something here, both
>non-cached
>> cases
>> >     >     defeat the
>> >     >     >     meltdown attack, as you *cannot* get the data
>unless you
>> do
>> >     >     address
>> >     >     >     translation first (and therefore detect faults).
>> >     >     >
>> >     >     >     As for why this defeats the spectre attack, the
>logic is
>> >     >     similar: you've
>> >     >     >     jumped into someone else's executable code, hoping
>to
>> >     scoop up
>> >     >     enough
>> >     >     >     information into your branch predictor before the
>fault
>> >     kicks
>> >     >     you out.
>> >     >     >     However, to capture anything about sensitive
>information
>> >     in your
>> >     >     >     side-channels, the transient instructions need to
>> >     actually get
>> >     >     it into
>> >     >     >     the core before a fault gets detected.  The same
>case
>> >     analysis
>> >     >     as above
>> >     >     >     applies, so you never actually get the sensitive
>info
>> >     into the
>> >     >     core
>> >     >     >     before a fault comes back and you get squashed.
>> >     >     >
>> >     >     >
>> >     >     >     [1]: A physically-indexed cache would be largely
>immune
>> to
>> >     >     this attack,
>> >     >     >     as you'd have to do address translation before
>doing a
>> cache
>> >     >     lookup.
>> >     >     >
>> >     >     >
>> >     >     >     I have some ideas that can build on this, but I'd
>like
>> >     to get some
>> >     >     >     feedback first.
>> >     >     >     _______________________________________________
>> >     >     >     freebsd-security at freebsd.org
>> >     <mailto:freebsd-security at freebsd.org>
>> >     >     <mailto:freebsd-security at freebsd.org
>> >     <mailto:freebsd-security at freebsd.org>>
>> >     >     <mailto:freebsd-security at freebsd.org
>> >     <mailto:freebsd-security at freebsd.org>
>> >     >     <mailto:freebsd-security at freebsd.org
><mailto:freebsd-security@
>> freebsd.org>>>
>> >     >     >     mailing list
>> >     >     >     https://lists.freebsd.org/mailman/listinfo/freebsd-
>> security
>> >     <https://lists.freebsd.org/mailman/listinfo/freebsd-security>
>> >     >    
><https://lists.freebsd.org/mailman/listinfo/freebsd-security
>> >     <https://lists.freebsd.org/mailman/listinfo/freebsd-security>>
>> >     >     >    
><https://lists.freebsd.org/mailman/listinfo/freebsd-
>> security
>> >     <https://lists.freebsd.org/mailman/listinfo/freebsd-security>
>> >     >    
><https://lists.freebsd.org/mailman/listinfo/freebsd-security
>> >     <https://lists.freebsd.org/mailman/listinfo/freebsd-security>>>
>> >     >     >     To unsubscribe, send any mail to
>> >     >     >     "freebsd-security-unsubscribe at freebsd.org
>> >     <mailto:freebsd-security-unsubscribe at freebsd.org>
>> >     >     <mailto:freebsd-security-unsubscribe at freebsd.org
>> >     <mailto:freebsd-security-unsubscribe at freebsd.org>>
>> >     >     >     <mailto:freebsd-security-unsubscribe at freebsd.org
>> >     <mailto:freebsd-security-unsubscribe at freebsd.org>
>> >     >     <mailto:freebsd-security-unsubscribe at freebsd.org
>> >     <mailto:freebsd-security-unsubscribe at freebsd.org>>>"
>> >     >     >     _______________________________________________
>> >     >     >     freebsd-arch at freebsd.org
><mailto:freebsd-arch at freebsd.
>> org>
>> >     <mailto:freebsd-arch at freebsd.org
><mailto:freebsd-arch at freebsd.org>>
>> >     >     <mailto:freebsd-arch at freebsd.org
>> >     <mailto:freebsd-arch at freebsd.org>
><mailto:freebsd-arch at freebsd.org
>> >     <mailto:freebsd-arch at freebsd.org>>>
>> >     >     mailing list
>> >     >     >    
>https://lists.freebsd.org/mailman/listinfo/freebsd-arch
>> >     <https://lists.freebsd.org/mailman/listinfo/freebsd-arch>
>> >     >     <https://lists.freebsd.org/mailman/listinfo/freebsd-arch
>> >     <https://lists.freebsd.org/mailman/listinfo/freebsd-arch>>
>> >     >     >    
><https://lists.freebsd.org/mailman/listinfo/freebsd-arch
>> >     <https://lists.freebsd.org/mailman/listinfo/freebsd-arch>
>> >     >     <https://lists.freebsd.org/mailman/listinfo/freebsd-arch
>> >     <https://lists.freebsd.org/mailman/listinfo/freebsd-arch>>>
>> >     >     >     To unsubscribe, send any mail to
>> >     >     >     "freebsd-arch-unsubscribe at freebsd.org
>> >     <mailto:freebsd-arch-unsubscribe at freebsd.org>
>> >     >     <mailto:freebsd-arch-unsubscribe at freebsd.org
>> >     <mailto:freebsd-arch-unsubscribe at freebsd.org>>
>> >     >     >     <mailto:freebsd-arch-unsubscribe at freebsd.org
>> >     <mailto:freebsd-arch-unsubscribe at freebsd.org>
>> >     >     <mailto:freebsd-arch-unsubscribe at freebsd.org
>> >     <mailto:freebsd-arch-unsubscribe at freebsd.org>>>"
>> >     >     >
>> >     >     >
>> >     >
>> >     >
>> >
>> >
>>

-- 
Sent from my Android device with K-9 Mail. Please excuse my brevity.


More information about the freebsd-arch mailing list