From: Kees Cook <keescook@chromium.org>
To: Peter Zijlstra <peterz@infradead.org>
Cc: Jann Horn <jannh@google.com>,
Thomas Gleixner <tglx@linutronix.de>,
Linus Torvalds <torvalds@linux-foundation.org>,
the arch/x86 maintainers <x86@kernel.org>,
Dave Hansen <dave.hansen@intel.com>,
kernel list <linux-kernel@vger.kernel.org>,
Kernel Hardening <kernel-hardening@lists.openwall.com>
Subject: Re: [PATCH v3 3/3] x86/asm: Pin sensitive CR0 bits
Date: Tue, 18 Jun 2019 10:12:58 -0700 [thread overview]
Message-ID: <201906181010.922CE96EC@keescook> (raw)
In-Reply-To: <20190618122430.GF3419@hirez.programming.kicks-ass.net>
On Tue, Jun 18, 2019 at 02:24:30PM +0200, Peter Zijlstra wrote:
> On Tue, Jun 18, 2019 at 11:38:02AM +0200, Jann Horn wrote:
> > On Tue, Jun 18, 2019 at 6:55 AM Kees Cook <keescook@chromium.org> wrote:
> > > With sensitive CR4 bits pinned now, it's possible that the WP bit for
> > > CR0 might become a target as well. Following the same reasoning for
> > > the CR4 pinning, this pins CR0's WP bit (but this can be done with a
> > > static value).
> > >
> > > Suggested-by: Peter Zijlstra <peterz@infradead.org>
> > > Signed-off-by: Kees Cook <keescook@chromium.org>
> > > ---
> > > arch/x86/include/asm/special_insns.h | 15 ++++++++++++++-
> > > 1 file changed, 14 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/arch/x86/include/asm/special_insns.h b/arch/x86/include/asm/special_insns.h
> > > index c8c8143ab27b..b2e84d113f2a 100644
> > > --- a/arch/x86/include/asm/special_insns.h
> > > +++ b/arch/x86/include/asm/special_insns.h
> > > @@ -31,7 +31,20 @@ static inline unsigned long native_read_cr0(void)
> > >
> > > static inline void native_write_cr0(unsigned long val)
> > > {
> >
> > So, assuming a legitimate call to native_write_cr0(), we come in here...
> >
> > > - asm volatile("mov %0,%%cr0": : "r" (val), "m" (__force_order));
> > > + unsigned long bits_missing = 0;
>
> ^^^
>
> > > +
> > > +set_register:
> > > + asm volatile("mov %0,%%cr0": "+r" (val), "+m" (__force_order));
> >
> > ... here we've updated CR0...
> >
> > > + if (static_branch_likely(&cr_pinning)) {
> >
> > ... this branch is taken, since cr_pinning is set to true after boot...
> >
> > > + if (unlikely((val & X86_CR0_WP) != X86_CR0_WP)) {
> >
> > ... this branch isn't taken, because a legitimate update preserves the WP bit...
> >
> > > + bits_missing = X86_CR0_WP;
>
> ^^^
>
> > > + val |= bits_missing;
> > > + goto set_register;
> > > + }
> > > + /* Warn after we've set the missing bits. */
> > > + WARN_ONCE(bits_missing, "CR0 WP bit went missing!?\n");
> >
> > ... and we reach this WARN_ONCE()? Am I missing something, or does
> > every legitimate CR0 write after early boot now trigger a warning?
>
> bits_missing will be 0 and WARN will not be issued.
>
> > > + }
> > > }
Yup, as Peter points out, bits_missing is only non-zero when bits went
missing. The normal case will skip the WARN_ONCE() (which is also
internally wrapped in unlikely()). And I would have noticed the very
loud WARN at every boot if this wasn't true. ;)
--
Kees Cook
next prev parent reply other threads:[~2019-06-18 17:12 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-18 4:55 [PATCH v3 0/3] x86/asm: Pin sensitive CR4 and CR0 bits Kees Cook
2019-06-18 4:55 ` [PATCH v3 1/3] lkdtm: Check for SMEP clearing protections Kees Cook
2019-06-18 7:10 ` Rasmus Villemoes
2019-06-18 7:23 ` Kees Cook
2019-06-18 4:55 ` [PATCH v3 2/3] x86/asm: Pin sensitive CR4 bits Kees Cook
2019-06-22 9:58 ` [tip:x86/asm] " tip-bot for Kees Cook
2019-06-18 4:55 ` [PATCH v3 3/3] x86/asm: Pin sensitive CR0 bits Kees Cook
2019-06-18 9:38 ` Jann Horn
2019-06-18 12:24 ` Peter Zijlstra
2019-06-18 17:12 ` Kees Cook [this message]
2019-06-22 9:58 ` [tip:x86/asm] " tip-bot for Kees Cook
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=201906181010.922CE96EC@keescook \
--to=keescook@chromium.org \
--cc=dave.hansen@intel.com \
--cc=jannh@google.com \
--cc=kernel-hardening@lists.openwall.com \
--cc=linux-kernel@vger.kernel.org \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=x86@kernel.org \
/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.