All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kevin Brodsky <kevin.brodsky@arm.com>
To: Linu Cherian <linu.cherian@arm.com>
Cc: linux-hardening@vger.kernel.org,
	"Andrew Morton" <akpm@linux-foundation.org>,
	"Andy Lutomirski" <luto@kernel.org>,
	"Catalin Marinas" <catalin.marinas@arm.com>,
	"Dave Hansen" <dave.hansen@linux.intel.com>,
	"David Hildenbrand (Arm)" <david@kernel.org>,
	"Jann Horn" <jannh@google.com>, "Jeff Xu" <jeffxu@chromium.org>,
	"Joey Gouly" <joey.gouly@arm.com>, "Kees Cook" <kees@kernel.org>,
	"Linus Walleij" <linusw@kernel.org>,
	"Marc Zyngier" <maz@kernel.org>,
	"Mark Brown" <broonie@kernel.org>,
	"Matthew Wilcox" <willy@infradead.org>,
	"Maxwell Bland" <mbland@motorola.com>,
	"Mike Rapoport (IBM)" <rppt@kernel.org>,
	"Peter Zijlstra" <peterz@infradead.org>,
	"Pierre Langlois" <pierre.langlois@arm.com>,
	"Pierre-Clément Tosi" <ptosi@google.com>,
	"Quentin Perret" <qperret@google.com>,
	"Rick Edgecombe" <rick.p.edgecombe@intel.com>,
	"Ryan Roberts" <ryan.roberts@arm.com>,
	"Vlastimil Babka" <vbabka@kernel.org>,
	"Will Deacon" <will@kernel.org>,
	"Yang Shi" <yang@os.amperecomputing.com>,
	"Yeoreum Yun" <yeoreum.yun@arm.com>,
	linux-arm-kernel@lists.infradead.org, linux-mm@kvack.org,
	x86@kernel.org, "Ira Weiny" <iweiny@kernel.org>,
	"Lorenzo Stoakes" <ljs@kernel.org>,
	"Thomas Gleixner" <tglx@kernel.org>
Subject: Re: [PATCH RFC v9 00/25] pkeys-based page table hardening
Date: Thu, 10 Sep 2026 10:30:47 +0200	[thread overview]
Message-ID: <46a747b8-bc06-4ccc-9265-68aa613bd7c4@arm.com> (raw)
In-Reply-To: <aqAyAymMO5sytqtr@a079125.arm.com>

On 08/09/2026 18:04, Linu Cherian wrote:
>> [...]
>>
>>>>>> Open questions
>>>>>> ==============
>>>>>>
>>>>>> A few aspects in this RFC that are debatable and/or worth discussing:
>>>>>>
>>>>>> - There is currently no restriction on how kpkeys contexts map to pkeys
>>>>>>   permissions. A typical approach is to allocate one pkey per context and
>>>>>>   make it writable in that context only. As the number of contexts
>>>>> Probably to avoid the assumption, may be we can we have something like
>>>>> below 
>>>>>
>>>>> For a pkey P, we could define
>>>>> PKEY_P_PERM_CTXT_OTHERS	 //permission for pkey p in other contexts
>>>>> PKEY_P_PERM_CTXT_SELF	 //permission for pkey p in self context
>>>>>
>>>>> With the assumption of one pkey mapped for every context,
>>>>> the permission for the default context would look something like,
>>>>>
>>>>> PKEY_DEF_PERM_CTXT_SELF << PKEY_DEF_PKEY_SHIFT |
>>>>> PKEY_CT0_PERM_CTXT_OTHERS << PKEY_CT0_PKEY_SHIFT | 
>>>>> PKEY_CT1_PERM_CTXT_OTHERS << PKEY_CT1_PKEY_SHIFT |
>>>>> ...(for all valid contexts)
>>>>>
>>>>> where,
>>>>> Permission key, PKEY_DEF is associated with context DEFAULT,
>>>>> Permission key, PKEY_CT0 is associated with context CT0,
>>>>> Permission key, PKEY_CT1 is associated with context CT1
>>>> This adds assumptions rather than avoiding them. *Typically* when adding
>>>> a context you'd allocate a pkey that's only writable by this context,
>>>> but it doesn't have to be this way.
>>> Okay agree. Then may be something like
>>>
>>> Define permissions:
>>>
>>> For default context,
>>> KPKEYS_CTX_DEFAULT_PERM_PKEY_DEF
>>> KPKEYS_CTX_DEFAULT_PERM_PKEY_CT0
>>>
>>> For CT0 context,
>>> KPKEYS_CTX_CT0_PERM_PKEY_DEF
>>> KPKEYS_CTX_CT0_PERM_PKEY_CT0
>>>
>>> Define POR_EL1:
>>>
>>> For default context,
>>> KPKEYS_POR_EL1_DEFAULT
>>>
>>> For CT0 context,
>>> KPKEYS_POR_EL1_CT0
>>>
>>> Finally,
>>> #define POR_EL1_INIT KPKEYS_POR_EL1_DEFAULT
>> We cannot do this because POR_EL1 is arm64-specific and its format is
>> not at all the same as x86's PKRS for instance.
>>
>> I think what you're getting at is that the permissions for each pkeys in
>> a given context could be defined at the generic level. This could be
>> done, but I'm not sure this is essential, and we may not need all archs
>> to use exactly the same permissions. There's also the issue that x86
>> only encodes RW permissions directly, not X.
> Really didnt mean to keep these macros generic. Sorry for the confusion. I could
> have replied this on a arm64 specific patch.
>
> The original intention was to suggest the use of macros similar to above in the arm64
> world.

Ah I see :) The problem is that again, kpkeys is not supposed to take
over the entire POR_EL1, just the pkeys we've allocated for it (0 and 1
for now). What could be done is something like

#define CTX_DEFAULT_PKEY_0_PERMS RW
#define CTX_DEFAULT_PKEY_PGTABLES_PERMS R

#define CTX_PGTABLES_PKEY_0_PERMS RW
#define CTX_PGTABLES_PKEY_PGTABLES_PERMS RW

That seems very heavy to me though. Is there really something wrong with
what por_set_kpkeys_context() does? I'd argue it's at least as readable
as #defining the configuration for each context, especially when the
number of pkeys increases.


>
>>> Probably using something similar would make the idea of kpkeys context 
>>> more evident in the code as well ?
>>>
>>>> The configuration space is more easily understood by considering the
>>>> other use-cases we've investigated (struct cred protection and eBPF
>>>> isolation, linked further down). For instance, for cred protection, we
>>>> had KPKEYS_LVL_UNRESTRICTED with write access to all pkeys, and for eBPF
>>>> isolation, we need a level that is less privileged and therefore does
>>>> *not* have write access to pkey 0.
>>>>
>>>>>>   increases, we may however run out of pkeys, especially on arm64 (just
>>>>>>   8 pkeys with POE). Depending on the use-cases, it may be acceptable to
>>>>>>   use the same pkey for the data associated to multiple contexts.
>>>>> Lets say two contexts A and B, use the same pkey P as their permission matches.
>>>>> But then, when we enter context A, permission for pkey P gets
>>>>> relaxed, then that would relax permission for pages associated with
>>>>> context B as well which is unintended ?
>>>> That may be exactly what is intended, it all depends on the use-case. C1
>>>> may have a private pkey P1, and C2 P2, and then P3 that is shared by C1
>>>> and C2 (writable by both)
>>> Got it. With each context defining permissions for each pkey owned by
>>> kpkeys makes sense. 
>>>
>>> Also do we need to assume that nesting of different contexts is not valid ?
>>> For example,
>>> Default context:
>>> 	enter CTX 0
>>> 		enter CTX 1
>>> 		leave CTX 1
>>> 	leave CTX 0
>>> Default context:
>> That is a good question. The enter/leave logic does support nesting,
>> since leave() restores the pkeys register as it was on enter(), but
>> whether the inner context has sufficient permissions will depend on the
>> situation. Certainly if nesting is expected then it has to be taken into
>> account when defining the permissions for each context.
>>
> Exactly. Also if nesting need to be disallowed for certain contexts,
> then it needs to be taken care as well ?  Feels like would be worth
> covering the aspect of nesting in documentation and cover letter.

I think having logic allowing/denying nesting would be overkill at this
stage, but agreed this should be documented.

- Kevin

  reply	other threads:[~2026-09-10  8:31 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-18 14:08 [PATCH RFC v9 00/25] pkeys-based page table hardening Kevin Brodsky
2026-08-18 14:08 ` [PATCH RFC v9 01/25] mm: Introduce kpkeys Kevin Brodsky
2026-08-27 18:00   ` David Hildenbrand (Arm)
2026-08-31 15:25     ` Kevin Brodsky
2026-09-07 10:54   ` Mike Rapoport
2026-09-07 15:49     ` Kevin Brodsky
2026-09-08  6:52       ` Mike Rapoport
2026-09-08  7:57         ` Kevin Brodsky
2026-08-18 14:08 ` [PATCH RFC v9 02/25] set_memory: Introduce set_memory_pkey() stub Kevin Brodsky
2026-09-01 14:33   ` Linu Cherian
2026-09-03 16:41     ` Kevin Brodsky
2026-09-07 13:36       ` Linu Cherian
2026-09-07 15:57         ` Kevin Brodsky
2026-08-18 14:08 ` [PATCH RFC v9 03/25] arm64: mm: Enable overlays for all EL1 indirect permissions Kevin Brodsky
2026-09-01 14:39   ` Linu Cherian
2026-09-03 16:41     ` Kevin Brodsky
2026-09-01 14:41   ` Linu Cherian
2026-09-03 16:43     ` Kevin Brodsky
2026-08-18 14:08 ` [PATCH RFC v9 04/25] arm64: Introduce por_elx_set_pkey_perms() helper Kevin Brodsky
2026-09-01 14:42   ` Linu Cherian
2026-09-03 16:43     ` Kevin Brodsky
2026-08-18 14:08 ` [PATCH RFC v9 05/25] arm64: Implement asm/kpkeys.h using POE Kevin Brodsky
2026-09-01 14:48   ` Linu Cherian
2026-09-03 16:44     ` Kevin Brodsky
2026-08-18 14:08 ` [PATCH RFC v9 06/25] arm64: set_memory: Implement set_memory_pkey() Kevin Brodsky
2026-08-18 14:08 ` [PATCH RFC v9 07/25] arm64: Context-switch POR_EL1 Kevin Brodsky
2026-09-03  5:58   ` Linu Cherian
2026-08-18 14:08 ` [PATCH RFC v9 08/25] arm64: Initialize POR_EL1 register on cpu_resume() Kevin Brodsky
2026-09-03  5:56   ` Linu Cherian
2026-09-03 16:45     ` Kevin Brodsky
2026-08-18 14:08 ` [PATCH RFC v9 09/25] arm64: Enable kpkeys Kevin Brodsky
2026-09-03  9:14   ` Linu Cherian
2026-08-18 14:08 ` [PATCH RFC v9 10/25] memblock: Move INIT_MEMBLOCK_* macros to header Kevin Brodsky
2026-08-18 14:08 ` [PATCH RFC v9 11/25] mm: kpkeys: Introduce kpkeys_hardened_pgtables feature Kevin Brodsky
2026-09-07 10:54   ` Mike Rapoport
2026-09-07 15:50     ` Kevin Brodsky
2026-08-18 14:08 ` [PATCH RFC v9 12/25] mm: kpkeys: Protect regular page tables Kevin Brodsky
2026-09-07 10:54   ` Mike Rapoport
2026-09-07 15:52     ` Kevin Brodsky
2026-09-08  7:33       ` Mike Rapoport
2026-09-08 10:11         ` Kevin Brodsky
2026-09-09 17:25           ` Mike Rapoport
2026-08-18 14:08 ` [PATCH RFC v9 13/25] mm: kpkeys: Introduce early page table allocator Kevin Brodsky
2026-08-27 18:08   ` David Hildenbrand (Arm)
2026-08-31 15:28     ` Kevin Brodsky
2026-09-07 16:05       ` David Hildenbrand (Arm)
2026-08-27 18:17   ` Dave Hansen
2026-08-31 15:30     ` Kevin Brodsky
2026-08-18 14:08 ` [PATCH RFC v9 14/25] mm: kpkeys: Protect vmemmap page tables Kevin Brodsky
2026-08-31 15:33   ` Kevin Brodsky
2026-08-18 14:08 ` [PATCH RFC v9 15/25] mm: kpkeys: Introduce hook for protecting static " Kevin Brodsky
2026-08-18 14:08 ` [PATCH RFC v9 16/25] arm64: kpkeys: Implement arch_supports_kpkeys_early() Kevin Brodsky
2026-08-18 14:08 ` [PATCH RFC v9 17/25] arm64: kpkeys: Support KPKEYS_CTX_PGTABLES Kevin Brodsky
2026-08-18 14:09 ` [PATCH RFC v9 18/25] arm64: kpkeys: Ensure the linear map can be modified Kevin Brodsky
2026-08-18 14:09 ` [PATCH RFC v9 19/25] arm64: kpkeys: Protect early page tables Kevin Brodsky
2026-08-18 14:09 ` [PATCH RFC v9 20/25] arm64: mm: Map kernel image alias of init_pg_dir read-only Kevin Brodsky
2026-08-18 14:09 ` [PATCH RFC v9 21/25] arm64: kpkeys: Protect init_pg_dir Kevin Brodsky
2026-08-18 14:09 ` [PATCH RFC v9 22/25] arm64: kpkeys: Guard page table writes Kevin Brodsky
2026-08-18 14:09 ` [PATCH RFC v9 23/25] arm64: kpkeys: Batch KPKEYS_CTX_PGTABLES switches Kevin Brodsky
2026-08-18 14:09 ` [PATCH RFC v9 24/25] arm64: kpkeys: Enable kpkeys_hardened_pgtables support Kevin Brodsky
2026-08-18 14:09 ` [PATCH RFC v9 25/25] mm: Add basic tests for kpkeys_hardened_pgtables Kevin Brodsky
2026-08-27 17:24 ` [PATCH RFC v9 00/25] pkeys-based page table hardening Yeoreum Yun
2026-08-31 15:35   ` Kevin Brodsky
2026-09-01 14:24 ` Linu Cherian
2026-09-03 16:47   ` Kevin Brodsky
2026-09-07 12:19     ` Linu Cherian
2026-09-08  7:56       ` Kevin Brodsky
2026-09-08 16:04         ` Linu Cherian
2026-09-10  8:30           ` Kevin Brodsky [this message]
2026-09-01 15:02 ` Linu Cherian
2026-09-01 15:13   ` Linu Cherian

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=46a747b8-bc06-4ccc-9265-68aa613bd7c4@arm.com \
    --to=kevin.brodsky@arm.com \
    --cc=akpm@linux-foundation.org \
    --cc=broonie@kernel.org \
    --cc=catalin.marinas@arm.com \
    --cc=dave.hansen@linux.intel.com \
    --cc=david@kernel.org \
    --cc=iweiny@kernel.org \
    --cc=jannh@google.com \
    --cc=jeffxu@chromium.org \
    --cc=joey.gouly@arm.com \
    --cc=kees@kernel.org \
    --cc=linu.cherian@arm.com \
    --cc=linusw@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-hardening@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=ljs@kernel.org \
    --cc=luto@kernel.org \
    --cc=maz@kernel.org \
    --cc=mbland@motorola.com \
    --cc=peterz@infradead.org \
    --cc=pierre.langlois@arm.com \
    --cc=ptosi@google.com \
    --cc=qperret@google.com \
    --cc=rick.p.edgecombe@intel.com \
    --cc=rppt@kernel.org \
    --cc=ryan.roberts@arm.com \
    --cc=tglx@kernel.org \
    --cc=vbabka@kernel.org \
    --cc=will@kernel.org \
    --cc=willy@infradead.org \
    --cc=x86@kernel.org \
    --cc=yang@os.amperecomputing.com \
    --cc=yeoreum.yun@arm.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.