Re: [RFC PATCH v5 00/18] pkeys-based page table hardening
From: Yang Shi
Date: Thu Aug 21 2025 - 13:32:48 EST
Hi Kevin,
On 8/15/25 1:54 AM, Kevin Brodsky wrote:
This is a proposal to leverage protection keys (pkeys) to harden
critical kernel data, by making it mostly read-only. The series includes
a simple framework called "kpkeys" to manipulate pkeys for in-kernel use,
as well as a page table hardening feature based on that framework,
"kpkeys_hardened_pgtables". Both are implemented on arm64 as a proof of
concept, but they are designed to be compatible with any architecture
that supports pkeys.
[...]
Note: the performance impact of set_memory_pkey() is likely to be
relatively low on arm64 because the linear mapping uses PTE-level
descriptors only. This means that set_memory_pkey() simply changes the
attributes of some PTE descriptors. However, some systems may be able to
use higher-level descriptors in the future [5], meaning that
set_memory_pkey() may have to split mappings. Allocating page tables
I'm supposed the page table hardening feature will be opt-in due to its
overhead? If so I think you can just keep kernel linear mapping using
PTE, just like debug page alloc.
from a contiguous cache of pages could help minimise the overhead, as
proposed for x86 in [1].
I'm a little bit confused about how this can work. The contiguous cache
of pages should be some large page, for example, 2M. But the page table
pages allocated from the cache may have different permissions if I
understand correctly. The default permission is RO, but some of them may
become R/W at sometime, for example, when calling set_pte_at(). You
still need to split the linear mapping, right?
Regards,
Yang