Star64_linux/arch/powerpc
Nathan Lynch 2f226dc13e powerpc/rtas_flash: allow user copy to flash block cache objects
commit 4f3175979e upstream.

With hardened usercopy enabled (CONFIG_HARDENED_USERCOPY=y), using the
/proc/powerpc/rtas/firmware_update interface to prepare a system
firmware update yields a BUG():

  kernel BUG at mm/usercopy.c:102!
  Oops: Exception in kernel mode, sig: 5 [#1]
  LE PAGE_SIZE=64K MMU=Hash SMP NR_CPUS=2048 NUMA pSeries
  Modules linked in:
  CPU: 0 PID: 2232 Comm: dd Not tainted 6.5.0-rc3+ #2
  Hardware name: IBM,8408-E8E POWER8E (raw) 0x4b0201 0xf000004 of:IBM,FW860.50 (SV860_146) hv:phyp pSeries
  NIP:  c0000000005991d0 LR: c0000000005991cc CTR: 0000000000000000
  REGS: c0000000148c76a0 TRAP: 0700   Not tainted  (6.5.0-rc3+)
  MSR:  8000000000029033 <SF,EE,ME,IR,DR,RI,LE>  CR: 24002242  XER: 0000000c
  CFAR: c0000000001fbd34 IRQMASK: 0
  [ ... GPRs omitted ... ]
  NIP usercopy_abort+0xa0/0xb0
  LR  usercopy_abort+0x9c/0xb0
  Call Trace:
    usercopy_abort+0x9c/0xb0 (unreliable)
    __check_heap_object+0x1b4/0x1d0
    __check_object_size+0x2d0/0x380
    rtas_flash_write+0xe4/0x250
    proc_reg_write+0xfc/0x160
    vfs_write+0xfc/0x4e0
    ksys_write+0x90/0x160
    system_call_exception+0x178/0x320
    system_call_common+0x160/0x2c4

The blocks of the firmware image are copied directly from user memory
to objects allocated from flash_block_cache, so flash_block_cache must
be created using kmem_cache_create_usercopy() to mark it safe for user
access.

Fixes: 6d07d1cd30 ("usercopy: Restrict non-usercopy caches to size 0")
Signed-off-by: Nathan Lynch <nathanl@linux.ibm.com>
Reviewed-by: Kees Cook <keescook@chromium.org>
[mpe: Trim and indent oops]
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20230810-rtas-flash-vs-hardened-usercopy-v2-1-dcf63793a938@linux.ibm.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2023-08-28 23:27:00 +08:00
..
boot powerpc: dts: t1040rdb: fix compatible string for Rev A boards 2023-04-19 18:00:41 +08:00
configs Remove DECnet support from kernel 2023-08-20 15:23:42 +08:00
crypto powerpc: flexible GPR range save/restore macros 2023-04-19 17:51:06 +08:00
include word-at-a-time: use the same return type for has_zero regardless of endianness 2023-08-20 16:01:31 +08:00
kernel powerpc/rtas_flash: allow user copy to flash block cache objects 2023-08-28 23:27:00 +08:00
kexec powerpc: Set crashkernel offset to mid of RMA region 2023-04-19 17:47:36 +08:00
kvm KVM: PPC: Book3S HV: Fix "rm_exit" entry in debugfs timings 2023-04-19 17:53:14 +08:00
lib powerpc: flexible GPR range save/restore macros 2023-04-19 17:51:06 +08:00
math-emu powerpc/math_emu/efp: Include module.h 2023-04-19 17:55:26 +08:00
mm powerpc/kasan: Disable KCOV in KASAN code 2023-08-28 23:26:57 +08:00
net powerpc64/bpf: Limit 'ldbrx' to processors compliant with ISA v2.06 2023-04-19 17:44:54 +08:00
perf powerpc/imc-pmu: Revert nest_init_lock to being a mutex 2023-04-19 17:59:17 +08:00
platforms powerpc/powernv/sriov: perform null check on iov before dereferencing iov 2023-08-20 15:24:35 +08:00
purgatory powerpc/purgatory: remove PGO flags 2023-08-20 15:23:41 +08:00
sysdev powerpc/sysdev/tsi108: fix resource printk format warnings 2023-06-06 18:37:24 +08:00
tools powerpc/64: Add UADDR64 relocation support 2023-04-19 17:48:32 +08:00
xmon powerpc/xmon: Fix -Wswitch-unreachable warning in bpt_cmds 2023-04-19 17:57:50 +08:00
Kbuild
Kconfig powerpc/memhotplug: Add add_pages override for PPC 2023-04-19 17:50:53 +08:00
Kconfig.debug powerpc: allow PPC_EARLY_DEBUG_CPM only when SERIAL_CPM=y 2023-08-20 15:24:46 +08:00
Makefile powerpc: Fail build if using recordmcount with binutils v2.37 2023-08-20 15:24:58 +08:00
Makefile.postlink