WSL2-Linux-Kernel/arch
Michael Ellerman d835f9c4ed powerpc/64s/radix: Fix RWX mapping with relocated kernel
[ Upstream commit 111bcb3738 ]

If a relocatable kernel is loaded at a non-zero address and told not to
relocate to zero (kdump or RELOCATABLE_TEST), the mapping of the
interrupt code at zero is left with RWX permissions.

That is a security weakness, and leads to a warning at boot if
CONFIG_DEBUG_WX is enabled:

  powerpc/mm: Found insecure W+X mapping at address 00000000056435bc/0xc000000000000000
  WARNING: CPU: 1 PID: 1 at arch/powerpc/mm/ptdump/ptdump.c:193 note_page+0x484/0x4c0
  CPU: 1 PID: 1 Comm: swapper/0 Not tainted 6.2.0-rc1-00001-g8ae8e98aea82-dirty #175
  Hardware name: IBM pSeries (emulated by qemu) POWER9 (raw) 0x4e1202 0xf000005 of:SLOF,git-dd0dca hv:linux,kvm pSeries
  NIP:  c0000000004a1c34 LR: c0000000004a1c30 CTR: 0000000000000000
  REGS: c000000003503770 TRAP: 0700   Not tainted  (6.2.0-rc1-00001-g8ae8e98aea82-dirty)
  MSR:  8000000002029033 <SF,VEC,EE,ME,IR,DR,RI,LE>  CR: 24000220  XER: 00000000
  CFAR: c000000000545a58 IRQMASK: 0
  ...
  NIP note_page+0x484/0x4c0
  LR  note_page+0x480/0x4c0
  Call Trace:
    note_page+0x480/0x4c0 (unreliable)
    ptdump_pmd_entry+0xc8/0x100
    walk_pgd_range+0x618/0xab0
    walk_page_range_novma+0x74/0xc0
    ptdump_walk_pgd+0x98/0x170
    ptdump_check_wx+0x94/0x100
    mark_rodata_ro+0x30/0x70
    kernel_init+0x78/0x1a0
    ret_from_kernel_thread+0x5c/0x64

The fix has two parts. Firstly the pages from zero up to the end of
interrupts need to be marked read-only, so that they are left with R-X
permissions. Secondly the mapping logic needs to be taught to ensure
there is a page boundary at the end of the interrupt region, so that the
permission change only applies to the interrupt text, and not the region
following it.

Fixes: c55d7b5e64 ("powerpc: Remove STRICT_KERNEL_RWX incompatibility with RELOCATABLE")
Reported-by: Sachin Sant <sachinp@linux.ibm.com>
Tested-by: Sachin Sant <sachinp@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20230110124753.1325426-2-mpe@ellerman.id.au
Signed-off-by: Sasha Levin <sashal@kernel.org>
2023-02-25 12:06:44 +01:00
..
alpha exit: Add and use make_task_dead. 2023-02-01 08:27:20 +01:00
arc arc: iounmap() arg is volatile 2022-11-03 23:59:15 +09:00
arm kprobes: treewide: Cleanup the error messages for kprobes 2023-02-22 12:57:00 +01:00
arm64 kprobes: treewide: Cleanup the error messages for kprobes 2023-02-22 12:57:00 +01:00
csky kprobes: treewide: Cleanup the error messages for kprobes 2023-02-22 12:57:00 +01:00
h8300 h8300: Fix build errors from do_exit() to make_task_dead() transition 2023-02-01 08:27:21 +01:00
hexagon hexagon: Fix function name in die() 2023-02-01 08:27:20 +01:00
ia64 ia64: make IA64_MCA_RECOVERY bool instead of tristate 2023-02-01 08:27:21 +01:00
m68k exit: Add and use make_task_dead. 2023-02-01 08:27:20 +01:00
microblaze exit: Add and use make_task_dead. 2023-02-01 08:27:20 +01:00
mips kprobes: treewide: Cleanup the error messages for kprobes 2023-02-22 12:57:00 +01:00
nds32 exit: Add and use make_task_dead. 2023-02-01 08:27:20 +01:00
nios2 exit: Add and use make_task_dead. 2023-02-01 08:27:20 +01:00
openrisc exit: Add and use make_task_dead. 2023-02-01 08:27:20 +01:00
parisc parisc: Wire up PTRACE_GETREGS/PTRACE_SETREGS for compat case 2023-02-09 11:26:44 +01:00
powerpc powerpc/64s/radix: Fix RWX mapping with relocated kernel 2023-02-25 12:06:44 +01:00
riscv riscv: kprobe: Fixup misaligned load text 2023-02-22 12:57:00 +01:00
s390 s390/decompressor: specify __decompress() buf len to avoid overflow 2023-02-22 12:57:02 +01:00
sh exit: Add and use make_task_dead. 2023-02-01 08:27:20 +01:00
sparc exit: Add and use make_task_dead. 2023-02-01 08:27:20 +01:00
um UM: cpuinfo: Fix a warning for CONFIG_CPUMASK_OFFSTACK 2022-10-26 12:34:23 +02:00
x86 KVM: VMX: Execute IBPB on emulated VM-exit when guest has IBRS 2023-02-25 12:06:43 +01:00
xtensa exit: Add and use make_task_dead. 2023-02-01 08:27:20 +01:00
.gitignore
Kconfig arch: make TRACE_IRQFLAGS_NMI_SUPPORT generic 2022-08-17 14:23:00 +02:00