All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kees Cook <keescook@chromium.org>
To: ira.weiny@intel.com
Cc: Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
	Andy Lutomirski <luto@kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	x86@kernel.org, Dave Hansen <dave.hansen@linux.intel.com>,
	Dan Williams <dan.j.williams@intel.com>,
	Vishal Verma <vishal.l.verma@intel.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Fenghua Yu <fenghua.yu@intel.com>,
	linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-nvdimm@lists.01.org, linux-fsdevel@vger.kernel.org,
	linux-mm@kvack.org, linux-kselftest@vger.kernel.org,
	Igor Stoppa <igor.stoppa@gmail.com>,
	Nadav Amit <nadav.amit@gmail.com>
Subject: Re: [PATCH RFC V2 00/17] PKS: Add Protection Keys Supervisor (PKS) support
Date: Fri, 24 Jul 2020 15:19:35 -0700	[thread overview]
Message-ID: <202007241455.010B049A@keescook> (raw)
In-Reply-To: <20200717072056.73134-1-ira.weiny@intel.com>

On Fri, Jul 17, 2020 at 12:20:39AM -0700, ira.weiny@intel.com wrote:
> From: Ira Weiny <ira.weiny@intel.com>
> 
> This RFC series has been reviewed by Dave Hansen.
> 
> Changes from RFC:
> 	Clean up commit messages based on Peter Zijlstra's and Dave Hansen's
> 		feedback
> 	Fix static branch anti-pattern
> 	New patch:
> 	(memremap: Convert devmap static branch to {inc,dec})
> 		This was the code I used as a model for my static branch which
> 		I believe is wrong now.
> 	New Patch:
> 	(x86/entry: Preserve PKRS MSR through exceptions)
> 		This attempts to preserve the per-logical-processor MSR, and
> 		reference counting during exceptions.  I'd really like feed
> 		back on this because I _think_ it should work but I'm afraid
> 		I'm missing something as my testing has shown a lot of spotty
> 		crashes which don't make sense to me.
> 
> This patch set introduces a new page protection mechanism for supervisor pages,
> Protection Key Supervisor (PKS) and an initial user of them, persistent memory,
> PMEM.
> 
> PKS enables protections on 'domains' of supervisor pages to limit supervisor
> mode access to those pages beyond the normal paging protections.  They work in
> a similar fashion to user space pkeys.  Like User page pkeys (PKU), supervisor
> pkeys are checked in addition to normal paging protections and Access or Writes
> can be disabled via a MSR update without TLB flushes when permissions change.
> A page mapping is assigned to a domain by setting a pkey in the page table
> entry.
> 
> Unlike User pkeys no new instructions are added; rather WRMSR/RDMSR are used to
> update the PKRS register.
> 
> XSAVE is not supported for the PKRS MSR.  To reduce software complexity the
> implementation saves/restores the MSR across context switches but not during
> irqs.  This is a compromise which results is a hardening of unwanted access
> without absolute restriction.
> 
> For consistent behavior with current paging protections, pkey 0 is reserved and
> configured to allow full access via the pkey mechanism, thus preserving the
> default paging protections on mappings with the default pkey value of 0.
> 
> Other keys, (1-15) are allocated by an allocator which prepares us for key
> contention from day one.  Kernel users should be prepared for the allocator to
> fail either because of key exhaustion or due to PKS not being supported on the
> arch and/or CPU instance.
> 
> Protecting against stray writes is particularly important for PMEM because,
> unlike writes to anonymous memory, writes to PMEM persists across a reboot.
> Thus data corruption could result in permanent loss of data.
> 
> The following attributes of PKS makes it perfect as a mechanism to protect PMEM
> from stray access within the kernel:
> 
>    1) Fast switching of permissions
>    2) Prevents access without page table manipulations
>    3) Works on a per thread basis
>    4) No TLB flushes required

Cool! This seems like it'd be very handy to make other types of kernel
data "read-only at rest" (as was long ago proposed via X86_CR0_WP[1],
which only provided to protection levels, not 15). For example, I think
at least a few other kinds of areas stand out to me that are in need
of PKS markings (i.e. only things that actually manipulate these areas
should gain temporary PK access):
- Page Tables themselves
- Identity mapping
- The "read-only at rest" stuff, though it'll need special plumbing to
  make it work with the slab allocator, etc (more like the later "static
  allocation" work[2]).

[1] https://lore.kernel.org/lkml/1490811363-93944-1-git-send-email-keescook@chromium.org/
[2] https://lore.kernel.org/lkml/cover.1550097697.git.igor.stoppa@huawei.com/

-- 
Kees Cook

WARNING: multiple messages have this Message-ID (diff)
From: Kees Cook <keescook@chromium.org>
To: ira.weiny@intel.com
Cc: Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
	Andy Lutomirski <luto@kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	x86@kernel.org, Dave Hansen <dave.hansen@linux.intel.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Fenghua Yu <fenghua.yu@intel.com>,
	linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-nvdimm@lists.01.org, linux-fsdevel@vger.kernel.org,
	linux-mm@kvack.org, linux-kselftest@vger.kernel.org,
	Igor Stoppa <igor.stoppa@gmail.com>,
	Nadav Amit <nadav.amit@gmail.com>
Subject: Re: [PATCH RFC V2 00/17] PKS: Add Protection Keys Supervisor (PKS) support
Date: Fri, 24 Jul 2020 15:19:35 -0700	[thread overview]
Message-ID: <202007241455.010B049A@keescook> (raw)
In-Reply-To: <20200717072056.73134-1-ira.weiny@intel.com>

On Fri, Jul 17, 2020 at 12:20:39AM -0700, ira.weiny@intel.com wrote:
> From: Ira Weiny <ira.weiny@intel.com>
> 
> This RFC series has been reviewed by Dave Hansen.
> 
> Changes from RFC:
> 	Clean up commit messages based on Peter Zijlstra's and Dave Hansen's
> 		feedback
> 	Fix static branch anti-pattern
> 	New patch:
> 	(memremap: Convert devmap static branch to {inc,dec})
> 		This was the code I used as a model for my static branch which
> 		I believe is wrong now.
> 	New Patch:
> 	(x86/entry: Preserve PKRS MSR through exceptions)
> 		This attempts to preserve the per-logical-processor MSR, and
> 		reference counting during exceptions.  I'd really like feed
> 		back on this because I _think_ it should work but I'm afraid
> 		I'm missing something as my testing has shown a lot of spotty
> 		crashes which don't make sense to me.
> 
> This patch set introduces a new page protection mechanism for supervisor pages,
> Protection Key Supervisor (PKS) and an initial user of them, persistent memory,
> PMEM.
> 
> PKS enables protections on 'domains' of supervisor pages to limit supervisor
> mode access to those pages beyond the normal paging protections.  They work in
> a similar fashion to user space pkeys.  Like User page pkeys (PKU), supervisor
> pkeys are checked in addition to normal paging protections and Access or Writes
> can be disabled via a MSR update without TLB flushes when permissions change.
> A page mapping is assigned to a domain by setting a pkey in the page table
> entry.
> 
> Unlike User pkeys no new instructions are added; rather WRMSR/RDMSR are used to
> update the PKRS register.
> 
> XSAVE is not supported for the PKRS MSR.  To reduce software complexity the
> implementation saves/restores the MSR across context switches but not during
> irqs.  This is a compromise which results is a hardening of unwanted access
> without absolute restriction.
> 
> For consistent behavior with current paging protections, pkey 0 is reserved and
> configured to allow full access via the pkey mechanism, thus preserving the
> default paging protections on mappings with the default pkey value of 0.
> 
> Other keys, (1-15) are allocated by an allocator which prepares us for key
> contention from day one.  Kernel users should be prepared for the allocator to
> fail either because of key exhaustion or due to PKS not being supported on the
> arch and/or CPU instance.
> 
> Protecting against stray writes is particularly important for PMEM because,
> unlike writes to anonymous memory, writes to PMEM persists across a reboot.
> Thus data corruption could result in permanent loss of data.
> 
> The following attributes of PKS makes it perfect as a mechanism to protect PMEM
> from stray access within the kernel:
> 
>    1) Fast switching of permissions
>    2) Prevents access without page table manipulations
>    3) Works on a per thread basis
>    4) No TLB flushes required

Cool! This seems like it'd be very handy to make other types of kernel
data "read-only at rest" (as was long ago proposed via X86_CR0_WP[1],
which only provided to protection levels, not 15). For example, I think
at least a few other kinds of areas stand out to me that are in need
of PKS markings (i.e. only things that actually manipulate these areas
should gain temporary PK access):
- Page Tables themselves
- Identity mapping
- The "read-only at rest" stuff, though it'll need special plumbing to
  make it work with the slab allocator, etc (more like the later "static
  allocation" work[2]).

[1] https://lore.kernel.org/lkml/1490811363-93944-1-git-send-email-keescook@chromium.org/
[2] https://lore.kernel.org/lkml/cover.1550097697.git.igor.stoppa@huawei.com/

-- 
Kees Cook
_______________________________________________
Linux-nvdimm mailing list -- linux-nvdimm@lists.01.org
To unsubscribe send an email to linux-nvdimm-leave@lists.01.org

  parent reply	other threads:[~2020-07-24 22:19 UTC|newest]

Thread overview: 146+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-17  7:20 [PATCH RFC V2 00/17] PKS: Add Protection Keys Supervisor (PKS) support ira.weiny
2020-07-17  7:20 ` ira.weiny
2020-07-17  7:20 ` [PATCH RFC V2 01/17] x86/pkeys: Create pkeys_internal.h ira.weiny
2020-07-17  7:20   ` ira.weiny
2020-07-17  7:20 ` [PATCH RFC V2 02/17] x86/fpu: Refactor arch_set_user_pkey_access() for PKS support ira.weiny
2020-07-17  7:20   ` ira.weiny
2020-07-17  8:54   ` Peter Zijlstra
2020-07-17  8:54     ` Peter Zijlstra
2020-07-17 20:52     ` Ira Weiny
2020-07-17 20:52       ` Ira Weiny
2020-07-20  9:14       ` Peter Zijlstra
2020-07-20  9:14         ` Peter Zijlstra
2020-07-17 22:36     ` Dave Hansen
2020-07-17 22:36       ` Dave Hansen
2020-07-20  9:13       ` Peter Zijlstra
2020-07-20  9:13         ` Peter Zijlstra
2020-07-17  7:20 ` [PATCH RFC V2 03/17] x86/pks: Enable Protection Keys Supervisor (PKS) ira.weiny
2020-07-17  7:20   ` ira.weiny
2020-07-17  7:20 ` [PATCH RFC V2 04/17] x86/pks: Preserve the PKRS MSR on context switch ira.weiny
2020-07-17  7:20   ` ira.weiny
2020-07-17  8:31   ` Peter Zijlstra
2020-07-17  8:31     ` Peter Zijlstra
2020-07-17 21:39     ` Ira Weiny
2020-07-17 21:39       ` Ira Weiny
2020-07-17  8:59   ` Peter Zijlstra
2020-07-17  8:59     ` Peter Zijlstra
2020-07-17 22:34     ` Ira Weiny
2020-07-17 22:34       ` Ira Weiny
2020-07-20  9:15       ` Peter Zijlstra
2020-07-20  9:15         ` Peter Zijlstra
2020-07-20 18:35         ` Ira Weiny
2020-07-20 18:35           ` Ira Weiny
2020-07-17  7:20 ` [PATCH RFC V2 05/17] x86/pks: Add PKS kernel API ira.weiny
2020-07-17  7:20   ` ira.weiny
2020-07-17  7:20 ` [PATCH RFC V2 06/17] x86/pks: Add a debugfs file for allocated PKS keys ira.weiny
2020-07-17  7:20   ` ira.weiny
2020-07-17  7:20 ` [PATCH RFC V2 07/17] Documentation/pkeys: Update documentation for kernel pkeys ira.weiny
2020-07-17  7:20   ` ira.weiny
2020-07-17  7:20 ` [PATCH RFC V2 08/17] x86/pks: Add PKS Test code ira.weiny
2020-07-17  7:20   ` ira.weiny
2020-07-17  7:20 ` [PATCH RFC V2 09/17] memremap: Convert devmap static branch to {inc,dec} ira.weiny
2020-07-17  7:20   ` ira.weiny
2020-07-17  7:20 ` [PATCH RFC V2 10/17] fs/dax: Remove unused size parameter ira.weiny
2020-07-17  7:20   ` ira.weiny
2020-07-17  7:20 ` [PATCH RFC V2 11/17] drivers/dax: Expand lock scope to cover the use of addresses ira.weiny
2020-07-17  7:20   ` ira.weiny
2020-07-17  7:20 ` [PATCH RFC V2 12/17] memremap: Add zone device access protection ira.weiny
2020-07-17  7:20   ` ira.weiny
2020-07-17  9:10   ` Peter Zijlstra
2020-07-17  9:10     ` Peter Zijlstra
2020-07-18  5:06     ` Ira Weiny
2020-07-18  5:06       ` Ira Weiny
2020-07-20  9:16       ` Peter Zijlstra
2020-07-20  9:16         ` Peter Zijlstra
2020-07-17  9:17   ` Peter Zijlstra
2020-07-17  9:17     ` Peter Zijlstra
2020-07-18  5:51     ` Ira Weiny
2020-07-18  5:51       ` Ira Weiny
2020-07-17  9:20   ` Peter Zijlstra
2020-07-17  9:20     ` Peter Zijlstra
2020-07-17  7:20 ` [PATCH RFC V2 13/17] kmap: Add stray write protection for device pages ira.weiny
2020-07-17  7:20   ` ira.weiny
2020-07-17  9:21   ` Peter Zijlstra
2020-07-17  9:21     ` Peter Zijlstra
2020-07-19  4:13     ` Ira Weiny
2020-07-19  4:13       ` Ira Weiny
2020-07-20  9:17       ` Peter Zijlstra
2020-07-20  9:17         ` Peter Zijlstra
2020-07-21 16:31         ` Ira Weiny
2020-07-21 16:31           ` Ira Weiny
2020-07-17  7:20 ` [PATCH RFC V2 14/17] dax: Stray write protection for dax_direct_access() ira.weiny
2020-07-17  7:20   ` ira.weiny
2020-07-17  9:22   ` Peter Zijlstra
2020-07-17  9:22     ` Peter Zijlstra
2020-07-19  4:41     ` Ira Weiny
2020-07-19  4:41       ` Ira Weiny
2020-07-17  7:20 ` [PATCH RFC V2 15/17] nvdimm/pmem: Stray write protection for pmem->virt_addr ira.weiny
2020-07-17  7:20   ` ira.weiny
2020-07-17  7:20 ` [PATCH RFC V2 16/17] [dax|pmem]: Enable stray write protection ira.weiny
2020-07-17  7:20   ` ira.weiny
2020-07-17  9:25   ` Peter Zijlstra
2020-07-17  9:25     ` Peter Zijlstra
2020-07-17  7:20 ` [PATCH RFC V2 17/17] x86/entry: Preserve PKRS MSR across exceptions ira.weiny
2020-07-17  7:20   ` ira.weiny
2020-07-17  9:30   ` Peter Zijlstra
2020-07-17  9:30     ` Peter Zijlstra
2020-07-21 18:01     ` Ira Weiny
2020-07-21 18:01       ` Ira Weiny
2020-07-21 19:11       ` Peter Zijlstra
2020-07-21 19:11         ` Peter Zijlstra
2020-07-17  9:34   ` Peter Zijlstra
2020-07-17  9:34     ` Peter Zijlstra
2020-07-17 10:06   ` Peter Zijlstra
2020-07-17 10:06     ` Peter Zijlstra
2020-07-22  5:27     ` Ira Weiny
2020-07-22  5:27       ` Ira Weiny
2020-07-22  9:48       ` Peter Zijlstra
2020-07-22  9:48         ` Peter Zijlstra
2020-07-22 21:24         ` Ira Weiny
2020-07-22 21:24           ` Ira Weiny
2020-07-23 20:08       ` Thomas Gleixner
2020-07-23 20:08         ` Thomas Gleixner
2020-07-23 20:15         ` Thomas Gleixner
2020-07-23 20:15           ` Thomas Gleixner
2020-07-24 17:23           ` Ira Weiny
2020-07-24 17:23             ` Ira Weiny
2020-07-24 17:29             ` Andy Lutomirski
2020-07-24 17:29               ` Andy Lutomirski
2020-07-24 19:43               ` Ira Weiny
2020-07-24 19:43                 ` Ira Weiny
2020-07-22 16:21   ` Andy Lutomirski
2020-07-22 16:21     ` Andy Lutomirski
2020-07-23 16:18     ` Fenghua Yu
2020-07-23 16:18       ` Fenghua Yu
2020-07-23 16:23       ` Dave Hansen
2020-07-23 16:23         ` Dave Hansen
2020-07-23 16:52         ` Fenghua Yu
2020-07-23 16:52           ` Fenghua Yu
2020-07-23 17:08           ` Andy Lutomirski
2020-07-23 17:08             ` Andy Lutomirski
2020-07-23 17:30             ` Dave Hansen
2020-07-23 17:30               ` Dave Hansen
2020-07-23 20:23               ` Thomas Gleixner
2020-07-23 20:23                 ` Thomas Gleixner
2020-07-23 20:22             ` Thomas Gleixner
2020-07-23 20:22               ` Thomas Gleixner
2020-07-23 21:30               ` Andy Lutomirski
2020-07-23 21:30                 ` Andy Lutomirski
2020-07-23 22:14                 ` Thomas Gleixner
2020-07-23 22:14                   ` Thomas Gleixner
2020-07-23 19:53   ` Thomas Gleixner
2020-07-23 19:53     ` Thomas Gleixner
2020-07-23 22:04     ` Ira Weiny
2020-07-23 22:04       ` Ira Weiny
2020-07-23 23:41       ` Thomas Gleixner
2020-07-23 23:41         ` Thomas Gleixner
2020-07-24 21:24         ` Thomas Gleixner
2020-07-24 21:24           ` Thomas Gleixner
2020-07-24 21:31           ` Thomas Gleixner
2020-07-24 21:31             ` Thomas Gleixner
2020-07-25  0:09           ` Andy Lutomirski
2020-07-25  0:09             ` Andy Lutomirski
2020-07-27 20:59           ` Ira Weiny
2020-07-27 20:59             ` Ira Weiny
2020-07-24 22:19 ` Kees Cook [this message]
2020-07-24 22:19   ` [PATCH RFC V2 00/17] PKS: Add Protection Keys Supervisor (PKS) support 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=202007241455.010B049A@keescook \
    --to=keescook@chromium.org \
    --cc=akpm@linux-foundation.org \
    --cc=bp@alien8.de \
    --cc=dan.j.williams@intel.com \
    --cc=dave.hansen@linux.intel.com \
    --cc=fenghua.yu@intel.com \
    --cc=igor.stoppa@gmail.com \
    --cc=ira.weiny@intel.com \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-nvdimm@lists.01.org \
    --cc=luto@kernel.org \
    --cc=mingo@redhat.com \
    --cc=nadav.amit@gmail.com \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    --cc=vishal.l.verma@intel.com \
    --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.