linux/arch/mips/kernel
Kees Cook fbb1d4b381 MIPS: Modernize READ_IMPLIES_EXEC
I'm doing some thread necromancy of
https://lore.kernel.org/lkml/202007081624.82FA0CC1EA@keescook/

x86, arm64, and arm32 adjusted their READ_IMPLIES_EXEC logic to better
align with the safer defaults and the interactions with other mappings,
which I illustrated with this comment on x86:

/*
 * An executable for which elf_read_implies_exec() returns TRUE will
 * have the READ_IMPLIES_EXEC personality flag set automatically.
 *
 * The decision process for determining the results are:
 *
 *                 CPU: | lacks NX*  | has NX, ia32     | has NX, x86_64 |
 * ELF:                 |            |                  |                |
 * ---------------------|------------|------------------|----------------|
 * missing PT_GNU_STACK | exec-all   | exec-all         | exec-none      |
 * PT_GNU_STACK == RWX  | exec-stack | exec-stack       | exec-stack     |
 * PT_GNU_STACK == RW   | exec-none  | exec-none        | exec-none      |
 *
 *  exec-all  : all PROT_READ user mappings are executable, except when
 *              backed by files on a noexec-filesystem.
 *  exec-none : only PROT_EXEC user mappings are executable.
 *  exec-stack: only the stack and PROT_EXEC user mappings are
 *  executable.
 *
 *  *this column has no architectural effect: NX markings are ignored by
 *   hardware, but may have behavioral effects when "wants X" collides with
 *   "cannot be X" constraints in memory permission flags, as in
 *   https://lkml.kernel.org/r/20190418055759.GA3155@mellanox.com
 *
 */

For MIPS, the "lacks NX" above is the "!cpu_has_rixi" check. On x86,
we decided that the READ_IMPLIES_EXEC flag needed to reflect the
expectations, not the architectural behavior due to bad interactions
as noted above, as always returning "1" on non-NX hardware breaks
some mappings.

The other part of the issue is "what does the MIPS toolchain do for
PT_GNU_STACK?" The answer seems to be "by default, include PT_GNU_STACK,
but mark it executable" (likely due to concerns over non-NX hardware):

$ mipsel-linux-gnu-gcc -o hello_world hello_world.c
$ llvm-readelf -lW hellow_world | grep GNU_STACK
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RWE 0x10

Given that older hardware doesn't support non-executable memory, it
seems safe to make the "PT_GNU_STACK is absent" logic mean "assume
non-executable", but this might break very old software running on
modern MIPS. This situation matches the ia32-on-x86_64 logic x86
uses (which assumes needing READ_IMPLIES_EXEC in that situation). But
modern toolchains on modern MIPS hardware should follow a safer default
(assume NX stack).

A follow-up to this change would be to switch the MIPS toolchain to emit
a non-executable PT_GNU_STACK, as this seems to be unneeded.

Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Cc: Tiezhu Yang <yangtiezhu@loongson.cn>
Cc: Xuefeng Li <lixuefeng@loongson.cn>
Cc: Juxin Gao <gaojuxin@loongson.cn>
Cc: linux-mips@vger.kernel.org
Signed-off-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
2022-02-23 13:08:30 +01:00
..
syscalls mm/mempolicy: wire up syscall set_mempolicy_home_node 2022-01-15 16:30:30 +02:00
.gitignore
access-helper.h MIPS: Fix new sparse warnings 2021-04-07 16:11:05 +02:00
asm-offsets.c sched,arch: Remove unused TASK_STATE offsets 2021-06-18 11:43:09 +02:00
bmips_5xxx_init.S
bmips_vec.S
branch.c
cacheinfo.c drivers: base: cacheinfo: Get rid of DEFINE_SMP_CALL_CACHE_FUNCTION() 2021-09-01 10:29:10 +02:00
cevt-bcm1480.c
cevt-ds1287.c
cevt-gt641xx.c
cevt-r4k.c MIPS: Remove KVM_GUEST support 2021-03-10 15:18:40 +01:00
cevt-sb1250.c MIPS: Replace setup_irq() by request_irq() 2020-03-05 16:47:35 +01:00
cevt-txx9.c
cmpxchg.c locking/atomic: mips: move to ARCH_ATOMIC 2021-05-26 13:20:51 +02:00
cps-vec-ns16550.S
cps-vec.S
cpu-probe.c MIPS: loongson64: fix FTLB configuration 2021-11-25 16:46:31 +01:00
cpu-r3k-probe.c MIPS: kernel: Reserve exception base early to prevent corruption 2021-03-09 11:22:59 +01:00
crash.c
crash_dump.c MIPS: crash_dump.c: Simplify copy_oldmem_page() 2021-02-09 13:30:12 +01:00
csrc-bcm1480.c
csrc-ioasic.c
csrc-r4k.c
csrc-sb1250.c
early_printk.c
early_printk_8250.c
elf.c MIPS: Modernize READ_IMPLIES_EXEC 2022-02-23 13:08:30 +01:00
entry.S MIPS: remove asm/war.h 2022-02-22 09:35:49 +01:00
fpu-probe.c
fpu-probe.h
ftrace.c MIPS: kernel: Remove not needed set_fs calls 2021-04-06 14:36:56 +02:00
genex.S MIPS: remove asm/war.h 2022-02-22 09:35:49 +01:00
gpio_txx9.c
head.S MIPS: of: Introduce helper function to get DTB 2021-02-04 13:34:51 +01:00
i8253.c
idle.c MIPS: Remove NETLOGIC support 2021-10-24 17:24:47 +02:00
irq-gt641xx.c
irq-msc01.c
irq.c MIPS: irq: Avoid an unused-variable error 2021-10-28 13:28:52 +01:00
irq_txx9.c
jump_label.c
kgdb.c MIPS: kernel: Drop kgdb_call_nmi_hook 2021-02-15 12:23:54 +01:00
kprobes.c kprobes: treewide: Make it harder to refer kretprobe_trampoline directly 2021-09-30 21:24:06 -04:00
linux32.c
machine_kexec.c
Makefile MIPS: Makefile: Replace -pg with CC_FLAGS_FTRACE 2021-04-21 13:44:35 +02:00
mcount.S
mips-cm.c mips: cm: Convert to bitfield API to fix out-of-bounds access 2021-11-02 10:53:52 +01:00
mips-cpc.c MIPS: CPC: Use bitfield helpers 2021-11-29 12:42:57 +01:00
mips-mt-fpaff.c MIPS: Replace deprecated CPU-hotplug functions. 2021-08-05 10:57:01 +02:00
mips-mt.c
mips-r2-to-r6-emul.c MIPS: Fix build error due to PTR used in more places 2022-01-27 09:04:19 +01:00
module.c
octeon_switch.S
perf_event.c
perf_event_mipsxx.c MIPS: Remove NETLOGIC support 2021-10-24 17:24:47 +02:00
perf_regs.c MIPS: kernel: Support extracting off-line stack traces from user-space with perf 2021-02-04 21:55:45 +01:00
pm-cps.c
pm.c
probes-common.h
proc.c MIPS: Fix using smp_processor_id() in preemptible in show_cpuinfo() 2021-11-25 16:45:58 +01:00
process.c sched: Add wrapper for get_wchan() to keep task blocked 2021-10-15 11:25:14 +02:00
prom.c
ptrace.c Revert "MIPS: Add basic support for ptrace single step" 2021-02-18 11:57:44 +01:00
ptrace32.c
r4k-bugs64.c MIPS: remove asm/war.h 2022-02-22 09:35:49 +01:00
r4k_fpu.S MIPS: Fix build error due to PTR used in more places 2022-01-27 09:04:19 +01:00
r4k_switch.S
r2300_fpu.S MIPS: Fix build error due to PTR used in more places 2022-01-27 09:04:19 +01:00
r2300_switch.S
relocate.c kernel.h: split out panic and oops helpers 2021-07-01 11:06:04 -07:00
relocate_kernel.S MIPS: Fix build error due to PTR used in more places 2022-01-27 09:04:19 +01:00
reset.c
rtlx-cmp.c
rtlx-mt.c
rtlx.c
scall32-o32.S MIPS: remove asm/war.h 2022-02-22 09:35:49 +01:00
scall64-n32.S MIPS: Fix build error due to PTR used in more places 2022-01-27 09:04:19 +01:00
scall64-n64.S MIPS: remove asm/war.h 2022-02-22 09:35:49 +01:00
scall64-o32.S MIPS: Fix build error due to PTR used in more places 2022-01-27 09:04:19 +01:00
segment.c
setup.c memblock: make memblock_find_in_range method private 2021-09-03 09:58:17 -07:00
signal-common.h
signal.c MIPS: remove asm/war.h 2022-02-22 09:35:49 +01:00
signal32.c
signal_n32.c MIPS: remove asm/war.h 2022-02-22 09:35:49 +01:00
signal_o32.c
smp-bmips.c MIPS: BMIPS: Remove use of irq_cpu_offline 2021-10-20 20:06:32 +01:00
smp-cmp.c
smp-cps.c
smp-mt.c
smp-up.c
smp.c sched/core: Initialize the idle task with preemption disabled 2021-05-12 13:01:45 +02:00
spinlock_test.c mips: kernel: use DEFINE_DEBUGFS_ATTRIBUTE with debugfs_create_file_unsafe() 2021-03-14 14:09:49 +01:00
spram.c
stacktrace.c
sync-r4k.c
syscall.c MIPS: Fix build error due to PTR used in more places 2022-01-27 09:04:19 +01:00
sysrq.c
time.c
topology.c
traps.c exit: Add and use make_task_dead. 2021-12-13 12:04:45 -06:00
unaligned.c MIPS: Fix new sparse warnings 2021-04-07 16:11:05 +02:00
uprobes.c MIPS: Fix fall-through warnings for Clang 2021-10-13 14:47:42 -05:00
vdso.c MIPS: Add support for CONFIG_DEBUG_VIRTUAL 2021-04-06 14:34:02 +02:00
vmlinux.lds.S MIPS: vmlinux.lds.S: Fix appended dtb not properly aligned 2021-03-16 22:53:08 +01:00
vpe-cmp.c
vpe-mt.c
vpe.c
watch.c