linux/arch/powerpc/mm
Ritesh Harjani (IBM) 15f78d2c3d powerpc/mm/fault: Fix kfence page fault reporting
[ Upstream commit 06dbbb4d5f ]

copy_from_kernel_nofault() can be called when doing read of /proc/kcore.
/proc/kcore can have some unmapped kfence objects which when read via
copy_from_kernel_nofault() can cause page faults. Since *_nofault()
functions define their own fixup table for handling fault, use that
instead of asking kfence to handle such faults.

Hence we search the exception tables for the nip which generated the
fault. If there is an entry then we let the fixup table handler handle the
page fault by returning an error from within ___do_page_fault().

This can be easily triggered if someone tries to do dd from /proc/kcore.
eg. dd if=/proc/kcore of=/dev/null bs=1M

Some example false negatives:

  ===============================
  BUG: KFENCE: invalid read in copy_from_kernel_nofault+0x9c/0x1a0
  Invalid read at 0xc0000000fdff0000:
   copy_from_kernel_nofault+0x9c/0x1a0
   0xc00000000665f950
   read_kcore_iter+0x57c/0xa04
   proc_reg_read_iter+0xe4/0x16c
   vfs_read+0x320/0x3ec
   ksys_read+0x90/0x154
   system_call_exception+0x120/0x310
   system_call_vectored_common+0x15c/0x2ec

  BUG: KFENCE: use-after-free read in copy_from_kernel_nofault+0x9c/0x1a0
  Use-after-free read at 0xc0000000fe050000 (in kfence-#2):
   copy_from_kernel_nofault+0x9c/0x1a0
   0xc00000000665f950
   read_kcore_iter+0x57c/0xa04
   proc_reg_read_iter+0xe4/0x16c
   vfs_read+0x320/0x3ec
   ksys_read+0x90/0x154
   system_call_exception+0x120/0x310
   system_call_vectored_common+0x15c/0x2ec

Fixes: 90cbac0e99 ("powerpc: Enable KFENCE for PPC32")
Suggested-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Reported-by: Disha Goel <disgoel@linux.ibm.com>
Signed-off-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://patch.msgid.link/a411788081d50e3b136c6270471e35aba3dfafa3.1729271995.git.ritesh.list@gmail.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2024-12-05 14:02:05 +01:00
..
book3s32 powerpc/32s: Reduce default size of module/execmem area 2024-08-30 21:29:54 +10:00
book3s64 ALong with the usual shower of singleton patches, notable patch series in 2024-09-21 07:29:05 -07:00
kasan powerpc/8xx: rework support for 8M pages using contiguous PTE entries 2024-07-12 15:52:17 -07:00
nohash powerpc updates for 6.12 2024-09-19 08:03:00 +02:00
ptdump powerpc: Replace CONFIG_4xx with CONFIG_44x 2024-06-28 22:28:48 +10:00
cacheflush.c powerpc: Fix typos 2024-05-08 00:21:30 +10:00
copro_fault.c powerpc/mm: convert coprocessor fault to lock_mm_and_find_vma() 2023-06-24 14:12:58 -07:00
dma-noncoherent.c dma-mapping: merge <linux/dma-noncoherent.h> into <linux/dma-map-ops.h> 2020-10-06 07:07:06 +02:00
drmem.c powerpc/mm/drmem: Silence drmem_init() early return 2024-06-04 17:13:56 +10:00
fault.c powerpc/mm/fault: Fix kfence page fault reporting 2024-12-05 14:02:05 +01:00
hugetlbpage.c powerpc/mm: remove hugepd leftovers 2024-07-12 15:52:19 -07:00
init-common.c powerpc/mm: Fix size of allocated PGDIR 2024-08-12 21:49:53 +10:00
init_32.c powerpc: Untangle fixmap.h and pgtable.h and mmu.h 2023-10-19 17:12:44 +11:00
init_64.c powerpc updates for 6.6 2023-08-31 12:43:10 -07:00
ioremap.c powerpc/nohash: Replace pte_user() by pte_read() 2023-10-19 17:12:46 +11:00
ioremap_32.c powerpc: mm: convert to GENERIC_IOREMAP 2023-08-18 10:12:35 -07:00
ioremap_64.c powerpc: mm: convert to GENERIC_IOREMAP 2023-08-18 10:12:35 -07:00
maccess.c powerpc/inst: Optimise copy_inst_from_kernel_nofault() 2021-12-09 22:41:21 +11:00
Makefile powerpc/Makefile: Remove bits related to the previous use of -mcmodel=large 2024-05-07 23:48:45 +10:00
mem.c dma-mapping updates for linux 6.12 2024-09-19 11:12:49 +02:00
mmu_context.c powerpc/4xx: Remove CONFIG_BOOKE_OR_40x 2024-06-28 22:28:48 +10:00
mmu_decl.h powerpc: Remove core support for 40x 2024-06-28 22:28:47 +10:00
numa.c arch, mm: pull out allocation of NODE_DATA to generic code 2024-09-03 21:15:28 -07:00
pageattr.c powerpc: Don't ignore errors from set_memory_{n}p() in __kernel_map_pages() 2024-03-03 22:18:45 +11:00
pgtable-frag.c mm: remove PageActive 2024-09-03 21:15:43 -07:00
pgtable.c powerpc/8xx: document and enforce that split PT locks are not used 2024-09-01 20:25:52 -07:00
pgtable_32.c powerpc/8xx: rework support for 8M pages using contiguous PTE entries 2024-07-12 15:52:17 -07:00
pgtable_64.c mm/treewide: replace pXd_huge() with pXd_leaf() 2024-04-25 20:55:46 -07:00