|
|
Message-ID: <20161110233004.GQ3568@worktop.programming.kicks-ass.net>
Date: Fri, 11 Nov 2016 00:30:04 +0100
From: Peter Zijlstra <peterz@...radead.org>
To: Kees Cook <keescook@...omium.org>
Cc: Elena Reshetova <elena.reshetova@...el.com>,
"kernel-hardening@...ts.openwall.com" <kernel-hardening@...ts.openwall.com>,
Arnd Bergmann <arnd@...db.de>, Thomas Gleixner <tglx@...utronix.de>,
Ingo Molnar <mingo@...hat.com>,
"H. Peter Anvin" <h.peter.anvin@...el.com>,
Will Deacon <will.deacon@....com>,
Hans Liljestrand <ishkamiel@...il.com>,
David Windsor <dwindsor@...il.com>
Subject: Re: [RFC v4 PATCH 12/13] x86: implementation for HARDENED_ATOMIC
On Thu, Nov 10, 2016 at 03:07:37PM -0800, Kees Cook wrote:
> On Thu, Nov 10, 2016 at 2:50 PM, Peter Zijlstra <peterz@...radead.org> wrote:
> > On Thu, Nov 10, 2016 at 09:40:46PM +0100, Peter Zijlstra wrote:
> >> On Thu, Nov 10, 2016 at 10:24:47PM +0200, Elena Reshetova wrote:
> >> > static __always_inline void atomic_add(int i, atomic_t *v)
> >> > {
> >> > + asm volatile(LOCK_PREFIX "addl %1,%0\n"
> >> > +
> >> > +#ifdef CONFIG_HARDENED_ATOMIC
> >> > + "jno 0f\n"
> >> > + LOCK_PREFIX "subl %1,%0\n"
> >> > + "int $4\n0:\n"
> >> > + _ASM_EXTABLE(0b, 0b)
> >>
> >>
> >> This is unreadable gunk.
> >
> > Worse, this is fundamentally racy and therefore not a proper atomic at
> > all.
>
> The race was discussed earlier as well
Which is useless, since nobody was listening etc..
> (and some of that should
> already have been covered in the commit message)
it does not.
> , but basically this
> is a race in the overflow protection, so it's not operationally a
> problem. The process that caused the overflow still gets killed, and
> if the system isn't already set up to panic on oops, this becomes a
> resource leak instead of an exploitable condition.
Now is this harmless? If you have two increments racing like:
inc
jno 1 // overflow
inc
jno 1 // !overflow
dec
1: 1:
The second thread will still affect your wrap and not BUG.
>
> > The only way to do this is a cmpxchg loop and not issue the result on
> > overflow. Of course, that would completely suck performance wise, but
> > having a non atomic atomic blows more.
>
> There was some work to examine this performance impact, and it didn't
> look terrible, but this race-on-overflow isn't viewed as a meaningful
> risk in the refcount situation.
I have a benchmark somewhere, I can run numbers tomorrow, but it really
shows once you get a bit of contention going. Once you hit 4 nodes
contending on a variable its completely out there IIRC.
The unconditional atomic ops really are loads faster than cmpxchg loops.
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.