> On Apr 5, 2019, at 9:56 AM, Tycho Andersen <ty...@tycho.ws> wrote:
> 
>> On Fri, Apr 05, 2019 at 09:24:50AM -0600, Andy Lutomirski wrote:
>> 
>> 
>>> On Apr 5, 2019, at 8:44 AM, Dave Hansen <dave.han...@intel.com> wrote:
>>> 
>>> On 4/5/19 12:17 AM, Thomas Gleixner wrote:
>>>>> process. Is that an acceptable trade-off?
>>>> You are not seriously asking whether creating a user controllable ret2dir
>>>> attack window is a acceptable trade-off? April 1st was a few days ago.
>>> 
>>> Well, let's not forget that this set at least takes us from "always
>>> vulnerable to ret2dir" to a choice between:
>>> 
>>> 1. fast-ish and "vulnerable to ret2dir for a user-controllable window"
>>> 2. slow and "mitigated against ret2dir"
>>> 
>>> Sounds like we need a mechanism that will do the deferred XPFO TLB
>>> flushes whenever the kernel is entered, and not _just_ at context switch
>>> time.  This permits an app to run in userspace with stale kernel TLB
>>> entries as long as it wants... that's harmless.
>> 
>> I don’t think this is good enough. The bad guys can enter the kernel and 
>> arrange for the kernel to wait, *in kernel*, for long enough to set up the 
>> attack.  userfaultfd is the most obvious way, but there are plenty. I 
>> suppose we could do the flush at context switch *and* entry.  I bet that 
>> performance still utterly sucks, though — on many workloads, this turns 
>> every entry into a full flush, and we already know exactly how much that 
>> sucks — it’s identical to KPTI without PCID.  (And yes, if we go this route, 
>> we need to merge this logic together — we shouldn’t write CR3 twice on 
>> entry).
>> 
>> I feel like this whole approach is misguided. ret2dir is not such a game 
>> changer that fixing it is worth huge slowdowns. I think all this effort 
>> should be spent on some kind of sensible CFI. For example, we should be able 
>> to mostly squash ret2anything by inserting a check that the high bits of RSP 
>> match the value on the top of the stack before any code that pops RSP.  On 
>> an FPO build, there aren’t all that many hot POP RSP instructions, I think.
>> 
>> (Actually, checking the bits is suboptimal. Do:
>> 
>> unsigned long offset = *rsp - rsp;
>> offset >>= THREAD_SHIFT;
>> if (unlikely(offset))
>> BUG();
>> POP RSP;
> 
> This is a neat trick, and definitely prevents going random places in
> the heap. But,
> 
>> This means that it’s also impossible to trick a function to return into a 
>> buffer that is on that function’s stack.)
> 
> Why is this true? All you're checking is that you can't shift the
> "location" of the stack. If you can inject stuff into a stack buffer,
> can't you just inject the right frame to return to your code as well,
> so you don't have to shift locations?
> 
> 

But the injected ROP payload will be *below* RSP, so you’ll need a gadget that 
can decrement RSP.  This makes the attack a good deal harder.

Something like RAP on top, or CET, will make this even harder.

> 
> Tycho
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to