Skip to content

Commit 69ebc01

Browse files
committed
Revert "arm64: mm: add support for WXN memory translation attribute"
This reverts commit 50e3ed0. The SCTLR_EL1.WXN control forces execute-never when a page has write permissions. While the idea of hardening such write/exec combinations is good, with permissions indirection enabled (FEAT_PIE) this control becomes RES0. FEAT_PIE introduces a slightly different form of WXN which only has an effect when the base permission is RWX and the write is toggled by the permission overlay (FEAT_POE, not yet supported by the arm64 kernel). Revert the patch for now. Signed-off-by: Catalin Marinas <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent f1bbc4e commit 69ebc01

File tree

7 files changed

+2
-116
lines changed

7 files changed

+2
-116
lines changed

arch/arm64/Kconfig

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1606,17 +1606,6 @@ config RODATA_FULL_DEFAULT_ENABLED
16061606
This requires the linear region to be mapped down to pages,
16071607
which may adversely affect performance in some cases.
16081608

1609-
config ARM64_WXN
1610-
bool "Enable WXN attribute so all writable mappings are non-exec"
1611-
help
1612-
Set the WXN bit in the SCTLR system register so that all writable
1613-
mappings are treated as if the PXN/UXN bit is set as well.
1614-
If this is set to Y, it can still be disabled at runtime by
1615-
passing 'arm64.nowxn' on the kernel command line.
1616-
1617-
This should only be set if no software needs to be supported that
1618-
relies on being able to execute from writable mappings.
1619-
16201609
config ARM64_SW_TTBR0_PAN
16211610
bool "Emulate Privileged Access Never using TTBR0_EL1 switching"
16221611
help

arch/arm64/include/asm/cpufeature.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
#define ARM64_SW_FEATURE_OVERRIDE_NOKASLR 0
1919
#define ARM64_SW_FEATURE_OVERRIDE_HVHE 4
2020
#define ARM64_SW_FEATURE_OVERRIDE_RODATA_OFF 8
21-
#define ARM64_SW_FEATURE_OVERRIDE_NOWXN 12
2221

2322
#ifndef __ASSEMBLY__
2423

@@ -968,13 +967,6 @@ static inline bool kaslr_disabled_cmdline(void)
968967
return arm64_test_sw_feature_override(ARM64_SW_FEATURE_OVERRIDE_NOKASLR);
969968
}
970969

971-
static inline bool arm64_wxn_enabled(void)
972-
{
973-
if (!IS_ENABLED(CONFIG_ARM64_WXN))
974-
return false;
975-
return !arm64_test_sw_feature_override(ARM64_SW_FEATURE_OVERRIDE_NOWXN);
976-
}
977-
978970
u32 get_kvm_ipa_limit(void);
979971
void dump_cpu_features(void);
980972

arch/arm64/include/asm/mman.h

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -35,40 +35,11 @@ static inline unsigned long arch_calc_vm_flag_bits(unsigned long flags)
3535
}
3636
#define arch_calc_vm_flag_bits(flags) arch_calc_vm_flag_bits(flags)
3737

38-
static inline bool arm64_check_wx_prot(unsigned long prot,
39-
struct task_struct *tsk)
40-
{
41-
/*
42-
* When we are running with SCTLR_ELx.WXN==1, writable mappings are
43-
* implicitly non-executable. This means we should reject such mappings
44-
* when user space attempts to create them using mmap() or mprotect().
45-
*/
46-
if (arm64_wxn_enabled() &&
47-
((prot & (PROT_WRITE | PROT_EXEC)) == (PROT_WRITE | PROT_EXEC))) {
48-
/*
49-
* User space libraries such as libffi carry elaborate
50-
* heuristics to decide whether it is worth it to even attempt
51-
* to create writable executable mappings, as PaX or selinux
52-
* enabled systems will outright reject it. They will usually
53-
* fall back to something else (e.g., two separate shared
54-
* mmap()s of a temporary file) on failure.
55-
*/
56-
pr_info_ratelimited(
57-
"process %s (%d) attempted to create PROT_WRITE+PROT_EXEC mapping\n",
58-
tsk->comm, tsk->pid);
59-
return false;
60-
}
61-
return true;
62-
}
63-
6438
static inline bool arch_validate_prot(unsigned long prot,
6539
unsigned long addr __always_unused)
6640
{
6741
unsigned long supported = PROT_READ | PROT_WRITE | PROT_EXEC | PROT_SEM;
6842

69-
if (!arm64_check_wx_prot(prot, current))
70-
return false;
71-
7243
if (system_supports_bti())
7344
supported |= PROT_BTI;
7445

@@ -79,13 +50,6 @@ static inline bool arch_validate_prot(unsigned long prot,
7950
}
8051
#define arch_validate_prot(prot, addr) arch_validate_prot(prot, addr)
8152

82-
static inline bool arch_validate_mmap_prot(unsigned long prot,
83-
unsigned long addr)
84-
{
85-
return arm64_check_wx_prot(prot, current);
86-
}
87-
#define arch_validate_mmap_prot arch_validate_mmap_prot
88-
8953
static inline bool arch_validate_flags(unsigned long vm_flags)
9054
{
9155
if (!system_supports_mte())

arch/arm64/include/asm/mmu_context.h

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -20,41 +20,13 @@
2020
#include <asm/cpufeature.h>
2121
#include <asm/daifflags.h>
2222
#include <asm/proc-fns.h>
23+
#include <asm-generic/mm_hooks.h>
2324
#include <asm/cputype.h>
2425
#include <asm/sysreg.h>
2526
#include <asm/tlbflush.h>
2627

2728
extern bool rodata_full;
2829

29-
static inline int arch_dup_mmap(struct mm_struct *oldmm,
30-
struct mm_struct *mm)
31-
{
32-
return 0;
33-
}
34-
35-
static inline void arch_exit_mmap(struct mm_struct *mm)
36-
{
37-
}
38-
39-
static inline void arch_unmap(struct mm_struct *mm,
40-
unsigned long start, unsigned long end)
41-
{
42-
}
43-
44-
static inline bool arch_vma_access_permitted(struct vm_area_struct *vma,
45-
bool write, bool execute, bool foreign)
46-
{
47-
if (IS_ENABLED(CONFIG_ARM64_WXN) && execute &&
48-
(vma->vm_flags & (VM_WRITE | VM_EXEC)) == (VM_WRITE | VM_EXEC)) {
49-
pr_warn_ratelimited(
50-
"process %s (%d) attempted to execute from writable memory\n",
51-
current->comm, current->pid);
52-
/* disallow unless the nowxn override is set */
53-
return !arm64_wxn_enabled();
54-
}
55-
return true;
56-
}
57-
5830
static inline void contextidr_thread_switch(struct task_struct *next)
5931
{
6032
if (!IS_ENABLED(CONFIG_PID_IN_CONTEXTIDR))

arch/arm64/kernel/pi/idreg-override.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,6 @@ static const struct ftr_set_desc sw_features __prel64_initconst = {
189189
FIELD("nokaslr", ARM64_SW_FEATURE_OVERRIDE_NOKASLR, NULL),
190190
FIELD("hvhe", ARM64_SW_FEATURE_OVERRIDE_HVHE, hvhe_filter),
191191
FIELD("rodataoff", ARM64_SW_FEATURE_OVERRIDE_RODATA_OFF, NULL),
192-
FIELD("nowxn", ARM64_SW_FEATURE_OVERRIDE_NOWXN, NULL),
193192
{}
194193
},
195194
};
@@ -222,9 +221,8 @@ static const struct {
222221
{ "arm64.nomops", "id_aa64isar2.mops=0" },
223222
{ "arm64.nomte", "id_aa64pfr1.mte=0" },
224223
{ "nokaslr", "arm64_sw.nokaslr=1" },
225-
{ "rodata=off", "arm64_sw.rodataoff=1 arm64_sw.nowxn=1" },
224+
{ "rodata=off", "arm64_sw.rodataoff=1" },
226225
{ "arm64.nolva", "id_aa64mmfr2.varange=0" },
227-
{ "arm64.nowxn", "arm64_sw.nowxn=1" },
228226
};
229227

230228
static int __init parse_hexdigit(const char *p, u64 *v)

arch/arm64/kernel/pi/map_kernel.c

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -132,25 +132,6 @@ static void __init map_kernel(u64 kaslr_offset, u64 va_offset, int root_level)
132132
idmap_cpu_replace_ttbr1(swapper_pg_dir);
133133
}
134134

135-
static void noinline __section(".idmap.text") disable_wxn(void)
136-
{
137-
u64 sctlr = read_sysreg(sctlr_el1) & ~SCTLR_ELx_WXN;
138-
139-
/*
140-
* We cannot safely clear the WXN bit while the MMU and caches are on,
141-
* so turn the MMU off, flush the TLBs and turn it on again but with
142-
* the WXN bit cleared this time.
143-
*/
144-
asm(" msr sctlr_el1, %0 ;"
145-
" isb ;"
146-
" tlbi vmalle1 ;"
147-
" dsb nsh ;"
148-
" isb ;"
149-
" msr sctlr_el1, %1 ;"
150-
" isb ;"
151-
:: "r"(sctlr & ~SCTLR_ELx_M), "r"(sctlr));
152-
}
153-
154135
static void noinline __section(".idmap.text") set_ttbr0_for_lpa2(u64 ttbr)
155136
{
156137
u64 sctlr = read_sysreg(sctlr_el1);
@@ -248,10 +229,6 @@ asmlinkage void __init early_map_kernel(u64 boot_status, void *fdt)
248229
if (va_bits > VA_BITS_MIN)
249230
sysreg_clear_set(tcr_el1, TCR_T1SZ_MASK, TCR_T1SZ(va_bits));
250231

251-
if (IS_ENABLED(CONFIG_ARM64_WXN) &&
252-
arm64_test_sw_feature_override(ARM64_SW_FEATURE_OVERRIDE_NOWXN))
253-
disable_wxn();
254-
255232
/*
256233
* The virtual KASLR displacement modulo 2MiB is decided by the
257234
* physical placement of the image, as otherwise, we might not be able

arch/arm64/mm/proc.S

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -546,12 +546,6 @@ alternative_else_nop_endif
546546
* Prepare SCTLR
547547
*/
548548
mov_q x0, INIT_SCTLR_EL1_MMU_ON
549-
#ifdef CONFIG_ARM64_WXN
550-
ldr_l x1, arm64_sw_feature_override + FTR_OVR_VAL_OFFSET
551-
tst x1, #0xf << ARM64_SW_FEATURE_OVERRIDE_NOWXN
552-
orr x1, x0, #SCTLR_ELx_WXN
553-
csel x0, x0, x1, ne
554-
#endif
555549
ret // return to head.S
556550

557551
.unreq mair

0 commit comments

Comments
 (0)