From: Ingo Molnar <mingo@kernel.org>
To: Thomas Garnier <thgarnie@google.com>
Cc: Andy Lutomirski <luto@kernel.org>,
Arjan van de Ven <arjan@linux.intel.com>,
Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, "H . Peter Anvin" <hpa@zytor.com>,
Kees Cook <keescook@chromium.org>, Borislav Petkov <bp@alien8.de>,
Dave Hansen <dave@sr71.net>, Chen Yucong <slaoub@gmail.com>,
Paul Gortmaker <paul.gortmaker@windriver.com>,
Andrew Morton <akpm@linux-foundation.org>,
Masahiro Yamada <yamada.masahiro@socionext.com>,
Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
Anna-Maria Gleixner <anna-maria@linutronix.de>,
Boris Ostrovsky <boris.ostrovsky@oracle.com>,
Rasmus Villemoes <linux@rasmusvillemoes.dk>,
Michael Ellerman <mpe@ellerman.id.au>,
Juergen Gross <jgross@suse.com>,
Richard Weinberger <richard@nod.at>, X86 ML <x86@kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"kernel-hardening@lists.openwall.com"
<kernel-hardening@lists.openwall.com>
Subject: [kernel-hardening] Re: [RFC] x86/mm/KASLR: Remap GDTs at fixed location
Date: Sat, 7 Jan 2017 08:35:53 +0100 [thread overview]
Message-ID: <20170107073553.GA13565@gmail.com> (raw)
In-Reply-To: <CAJcbSZEDfL=AWmgxAnbzmnXFMnvF68_Tp_34Dt+X1o7WE9bffw@mail.gmail.com>
* Thomas Garnier <thgarnie@google.com> wrote:
> > No, and I had the way this worked on 64-bit wrong. LTR requires an
> > available TSS and changes it to busy. So here are my thoughts on how
> > this should work:
> >
> > Let's get rid of any connection between this code and KASLR. Every
> > time KASLR makes something work differently, a kitten turns all
> > Schrödinger on us. This is moving the GDT to the fixmap, plain and
> > simple. For now, make it one page per CPU and don't worry about the
> > GDT limit.
>
> I am all for this change but that's more significant.
>
> Ingo: What do you think about that?
I agree with Andy: as I alluded to earlier as well this should be an unconditional
change (tested properly, etc.) that robustifies the GDT mapping for everyone. That
KASLR kernels improve too is a happy side effect!
> > On 32-bit, we're going to have to make the fixmap GDT be read-write because
> > making it read-only will break double-fault handling.
> >
> > On 64-bit, we can use your trick of temporarily mapping the GDT read-write
> > every time we load TR, which should happen very rarely. Alternatively, we can
> > reload the *GDT* every time we reload TR, which should be comparably slow.
> > This is going to regress performance in the extremely rare case where KVM
> > exits to a process that uses ioperm() (I think), but I doubt anyone cares. Or
> > maybe we could arrange to never reload TR when GDT points at the fixmap by
> > having KVM set the host GDT to the direct version and letting KVM's code to
> > reload the GDT switch to the fixmap copy.
Please check whether the LTR write generates a page fault to a RO PTE even if the
busy bit is already set. LTR is pretty slow which suggests that it's microcode,
and microcode is usually not sloppy about such things: i.e. LTR would only
generate an unconditional write if there's a compatibility dependency on it. But I
could easily be wrong ...
> > If we need a quirk to keep the fixmap copy read-write, so be it.
> >
> > None of this should depend on KASLR. IMO it should happen unconditionally.
>
> I looked back at the fixmap, and I can see a way it could be done
> (using NR_CPUS) like the other fixmap ranges. It would limit the
> number of cpus to 512 (there is 2M memory left on fixmap on the
> default configuration). That's if we never add any other fixmap on
> x64. I don't know if it is an acceptable number and if the fixmap
> region could be increased. (128 if we do your kvm trick, of course).
>
> Ingo: What do you think?
I think we should scale the fixmap size flexibly with NR_CPUs on 64-bit, and we
should limit CPUs on 32-bit to a reasonable value.
I.e. let's just do it, if we run into problems it's all solvable AFAICS.
Thanks,
Ingo
WARNING: multiple messages have this Message-ID (diff)
From: Ingo Molnar <mingo@kernel.org>
To: Thomas Garnier <thgarnie@google.com>
Cc: Andy Lutomirski <luto@kernel.org>,
Arjan van de Ven <arjan@linux.intel.com>,
Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, "H . Peter Anvin" <hpa@zytor.com>,
Kees Cook <keescook@chromium.org>, Borislav Petkov <bp@alien8.de>,
Dave Hansen <dave@sr71.net>, Chen Yucong <slaoub@gmail.com>,
Paul Gortmaker <paul.gortmaker@windriver.com>,
Andrew Morton <akpm@linux-foundation.org>,
Masahiro Yamada <yamada.masahiro@socionext.com>,
Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
Anna-Maria Gleixner <anna-maria@linutronix.de>,
Boris Ostrovsky <boris.ostrovsky@oracle.com>,
Rasmus Villemoes <linux@rasmusvillemoes.dk>,
Michael Ellerman <mpe@ellerman.id.au>,
Juergen Gross <jgross@suse.com>,
Richard Weinberger <richard@nod.at>, X86 ML <x86@kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"kernel-hardening@lists.openwall.com"
<kernel-hardening@lists.openwall.com>
Subject: Re: [RFC] x86/mm/KASLR: Remap GDTs at fixed location
Date: Sat, 7 Jan 2017 08:35:53 +0100 [thread overview]
Message-ID: <20170107073553.GA13565@gmail.com> (raw)
In-Reply-To: <CAJcbSZEDfL=AWmgxAnbzmnXFMnvF68_Tp_34Dt+X1o7WE9bffw@mail.gmail.com>
* Thomas Garnier <thgarnie@google.com> wrote:
> > No, and I had the way this worked on 64-bit wrong. LTR requires an
> > available TSS and changes it to busy. So here are my thoughts on how
> > this should work:
> >
> > Let's get rid of any connection between this code and KASLR. Every
> > time KASLR makes something work differently, a kitten turns all
> > Schrödinger on us. This is moving the GDT to the fixmap, plain and
> > simple. For now, make it one page per CPU and don't worry about the
> > GDT limit.
>
> I am all for this change but that's more significant.
>
> Ingo: What do you think about that?
I agree with Andy: as I alluded to earlier as well this should be an unconditional
change (tested properly, etc.) that robustifies the GDT mapping for everyone. That
KASLR kernels improve too is a happy side effect!
> > On 32-bit, we're going to have to make the fixmap GDT be read-write because
> > making it read-only will break double-fault handling.
> >
> > On 64-bit, we can use your trick of temporarily mapping the GDT read-write
> > every time we load TR, which should happen very rarely. Alternatively, we can
> > reload the *GDT* every time we reload TR, which should be comparably slow.
> > This is going to regress performance in the extremely rare case where KVM
> > exits to a process that uses ioperm() (I think), but I doubt anyone cares. Or
> > maybe we could arrange to never reload TR when GDT points at the fixmap by
> > having KVM set the host GDT to the direct version and letting KVM's code to
> > reload the GDT switch to the fixmap copy.
Please check whether the LTR write generates a page fault to a RO PTE even if the
busy bit is already set. LTR is pretty slow which suggests that it's microcode,
and microcode is usually not sloppy about such things: i.e. LTR would only
generate an unconditional write if there's a compatibility dependency on it. But I
could easily be wrong ...
> > If we need a quirk to keep the fixmap copy read-write, so be it.
> >
> > None of this should depend on KASLR. IMO it should happen unconditionally.
>
> I looked back at the fixmap, and I can see a way it could be done
> (using NR_CPUS) like the other fixmap ranges. It would limit the
> number of cpus to 512 (there is 2M memory left on fixmap on the
> default configuration). That's if we never add any other fixmap on
> x64. I don't know if it is an acceptable number and if the fixmap
> region could be increased. (128 if we do your kvm trick, of course).
>
> Ingo: What do you think?
I think we should scale the fixmap size flexibly with NR_CPUs on 64-bit, and we
should limit CPUs on 32-bit to a reasonable value.
I.e. let's just do it, if we run into problems it's all solvable AFAICS.
Thanks,
Ingo
next prev parent reply other threads:[~2017-01-07 7:35 UTC|newest]
Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-04 22:16 [kernel-hardening] [RFC] x86/mm/KASLR: Remap GDTs at fixed location Thomas Garnier
2017-01-04 22:16 ` Thomas Garnier
2017-01-05 8:11 ` [kernel-hardening] " Ingo Molnar
2017-01-05 8:11 ` Ingo Molnar
2017-01-05 15:08 ` [kernel-hardening] " Arjan van de Ven
2017-01-05 15:08 ` Arjan van de Ven
2017-01-05 16:40 ` [kernel-hardening] " Thomas Garnier
2017-01-05 16:40 ` Thomas Garnier
2017-01-05 18:56 ` [kernel-hardening] " Arjan van de Ven
2017-01-05 18:56 ` Arjan van de Ven
2017-01-05 19:00 ` [kernel-hardening] " Thomas Garnier
2017-01-05 19:00 ` Thomas Garnier
2017-01-06 17:44 ` [kernel-hardening] " Borislav Petkov
2017-01-06 17:44 ` Borislav Petkov
2017-01-06 18:04 ` [kernel-hardening] " Thomas Garnier
2017-01-06 18:04 ` Thomas Garnier
2017-01-05 16:39 ` [kernel-hardening] " Thomas Garnier
2017-01-05 16:39 ` Thomas Garnier
2017-01-06 6:34 ` [kernel-hardening] " Ingo Molnar
2017-01-06 6:34 ` Ingo Molnar
2017-01-05 17:51 ` [kernel-hardening] " Andy Lutomirski
2017-01-05 17:51 ` Andy Lutomirski
2017-01-05 17:54 ` [kernel-hardening] " Thomas Garnier
2017-01-05 17:54 ` Thomas Garnier
2017-01-05 18:01 ` [kernel-hardening] " Andy Lutomirski
2017-01-05 18:01 ` Andy Lutomirski
2017-01-05 18:35 ` [kernel-hardening] " Thomas Garnier
2017-01-05 18:35 ` Thomas Garnier
2017-01-05 18:58 ` [kernel-hardening] " Arjan van de Ven
2017-01-05 18:58 ` Arjan van de Ven
2017-01-05 19:03 ` [kernel-hardening] " Thomas Garnier
2017-01-05 19:03 ` Thomas Garnier
2017-01-05 20:18 ` [kernel-hardening] " Andy Lutomirski
2017-01-05 20:18 ` Andy Lutomirski
2017-01-05 21:08 ` [kernel-hardening] " Thomas Garnier
2017-01-05 21:08 ` Thomas Garnier
2017-01-05 21:19 ` [kernel-hardening] " Andy Lutomirski
2017-01-05 21:19 ` Andy Lutomirski
2017-01-05 21:58 ` [kernel-hardening] " Thomas Garnier
2017-01-05 21:58 ` Thomas Garnier
2017-01-06 6:49 ` [kernel-hardening] " Ingo Molnar
2017-01-06 6:49 ` Ingo Molnar
2017-01-06 18:03 ` [kernel-hardening] " Thomas Garnier
2017-01-06 18:03 ` Thomas Garnier
2017-01-06 21:59 ` [kernel-hardening] " Andy Lutomirski
2017-01-06 21:59 ` Andy Lutomirski
2017-01-06 22:54 ` [kernel-hardening] " Thomas Garnier
2017-01-06 22:54 ` Thomas Garnier
2017-01-06 23:39 ` [kernel-hardening] " Andy Lutomirski
2017-01-06 23:39 ` Andy Lutomirski
2017-01-07 7:45 ` [kernel-hardening] " Ingo Molnar
2017-01-07 7:45 ` Ingo Molnar
2017-01-07 15:58 ` [kernel-hardening] " Andy Lutomirski
2017-01-07 15:58 ` Andy Lutomirski
2017-01-07 7:35 ` Ingo Molnar [this message]
2017-01-07 7:35 ` Ingo Molnar
2017-01-07 16:02 ` [kernel-hardening] " Andy Lutomirski
2017-01-07 16:02 ` Andy Lutomirski
2017-01-09 22:32 ` [kernel-hardening] " Thomas Garnier
2017-01-09 22:32 ` Thomas Garnier
2017-01-10 10:27 ` [kernel-hardening] " Ingo Molnar
2017-01-10 10:27 ` Ingo Molnar
2017-01-10 17:13 ` [kernel-hardening] " Thomas Garnier
2017-01-10 17:13 ` Thomas Garnier
2017-01-05 23:05 ` [kernel-hardening] " Linus Torvalds
2017-01-05 23:05 ` Linus Torvalds
2017-01-05 23:16 ` [kernel-hardening] " Thomas Garnier
2017-01-05 23:16 ` Thomas Garnier
2017-01-06 2:34 ` [kernel-hardening] " Andy Lutomirski
2017-01-06 2:34 ` Andy Lutomirski
2017-01-06 18:02 ` [kernel-hardening] " Thomas Garnier
2017-01-06 18:02 ` Thomas Garnier
2017-01-06 21:53 ` [kernel-hardening] " Andy Lutomirski
2017-01-06 21:53 ` Andy Lutomirski
2017-01-07 7:46 ` [kernel-hardening] " Ingo Molnar
2017-01-07 7:46 ` Ingo Molnar
2017-01-06 6:45 ` [kernel-hardening] " Ingo Molnar
2017-01-06 6:45 ` Ingo Molnar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170107073553.GA13565@gmail.com \
--to=mingo@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=anna-maria@linutronix.de \
--cc=arjan@linux.intel.com \
--cc=bigeasy@linutronix.de \
--cc=boris.ostrovsky@oracle.com \
--cc=bp@alien8.de \
--cc=dave@sr71.net \
--cc=hpa@zytor.com \
--cc=jgross@suse.com \
--cc=keescook@chromium.org \
--cc=kernel-hardening@lists.openwall.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@rasmusvillemoes.dk \
--cc=luto@kernel.org \
--cc=mingo@redhat.com \
--cc=mpe@ellerman.id.au \
--cc=paul.gortmaker@windriver.com \
--cc=richard@nod.at \
--cc=slaoub@gmail.com \
--cc=tglx@linutronix.de \
--cc=thgarnie@google.com \
--cc=x86@kernel.org \
--cc=yamada.masahiro@socionext.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.