From: Ard Biesheuvel <[email protected]>

Nothing in the fixmap or in its vicinity requires executable
permissions, and given that it is placed at exactly 1 GiB from the end
of the virtual address space, we can safely set the hierarchical XN
attributes on the level 2 table entries covering the fixmap, without
running the risk of inadvertently taking away the executable permissions
on an adjacent mappings.

This is a hardening measure that reduces the risk of the fixmap being
abused to create executable mappings in the kernel address space.

Signed-off-by: Ard Biesheuvel <[email protected]>
---
 arch/arm64/mm/fixmap.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/arch/arm64/mm/fixmap.c b/arch/arm64/mm/fixmap.c
index c5c5425791da..c3dd3c868cf5 100644
--- a/arch/arm64/mm/fixmap.c
+++ b/arch/arm64/mm/fixmap.c
@@ -48,7 +48,8 @@ static void __init early_fixmap_init_pte(pmd_t *pmdp, 
unsigned long addr)
        if (pmd_none(pmd)) {
                ptep = bm_pte[BM_PTE_TABLE_IDX(addr)];
                __pmd_populate(pmdp, __pa_symbol(ptep),
-                              PMD_TYPE_TABLE | PMD_TABLE_AF);
+                              PMD_TYPE_TABLE | PMD_TABLE_AF |
+                              PMD_TABLE_PXN | PMD_TABLE_UXN);
        }
 }
 
-- 
2.53.0.959.g497ff81fa9-goog


Reply via email to