kernel_samsung_a53x/arch/x86/mm
Hou Tao 2c45b240ff x86/mm: Disallow vsyscall page read for copy_from_kernel_nofault()
[ Upstream commit 32019c659ecfe1d92e3bf9fcdfbb11a7c70acd58 ]

When trying to use copy_from_kernel_nofault() to read vsyscall page
through a bpf program, the following oops was reported:

  BUG: unable to handle page fault for address: ffffffffff600000
  #PF: supervisor read access in kernel mode
  #PF: error_code(0x0000) - not-present page
  PGD 3231067 P4D 3231067 PUD 3233067 PMD 3235067 PTE 0
  Oops: 0000 [#1] PREEMPT SMP PTI
  CPU: 1 PID: 20390 Comm: test_progs ...... 6.7.0+ #58
  Hardware name: QEMU Standard PC (i440FX + PIIX, 1996) ......
  RIP: 0010:copy_from_kernel_nofault+0x6f/0x110
  ......
  Call Trace:
   <TASK>
   ? copy_from_kernel_nofault+0x6f/0x110
   bpf_probe_read_kernel+0x1d/0x50
   bpf_prog_2061065e56845f08_do_probe_read+0x51/0x8d
   trace_call_bpf+0xc5/0x1c0
   perf_call_bpf_enter.isra.0+0x69/0xb0
   perf_syscall_enter+0x13e/0x200
   syscall_trace_enter+0x188/0x1c0
   do_syscall_64+0xb5/0xe0
   entry_SYSCALL_64_after_hwframe+0x6e/0x76
   </TASK>
  ......
  ---[ end trace 0000000000000000 ]---

The oops is triggered when:

1) A bpf program uses bpf_probe_read_kernel() to read from the vsyscall
page and invokes copy_from_kernel_nofault() which in turn calls
__get_user_asm().

2) Because the vsyscall page address is not readable from kernel space,
a page fault exception is triggered accordingly.

3) handle_page_fault() considers the vsyscall page address as a user
space address instead of a kernel space address. This results in the
fix-up setup by bpf not being applied and a page_fault_oops() is invoked
due to SMAP.

Considering handle_page_fault() has already considered the vsyscall page
address as a userspace address, fix the problem by disallowing vsyscall
page read for copy_from_kernel_nofault().

Originally-by: Thomas Gleixner <tglx@linutronix.de>
Reported-by: syzbot+72aa0161922eba61b50e@syzkaller.appspotmail.com
Closes: https://lore.kernel.org/bpf/CAG48ez06TZft=ATH1qh2c5mpS5BT8UakwNkzi6nvK5_djC-4Nw@mail.gmail.com
Reported-by: xingwei lee <xrivendell7@gmail.com>
Closes: https://lore.kernel.org/bpf/CABOYnLynjBoFZOf3Z4BhaZkc5hx_kHfsjiW+UWLoB=w33LvScw@mail.gmail.com
Signed-off-by: Hou Tao <houtao1@huawei.com>
Reviewed-by: Sohil Mehta <sohil.mehta@intel.com>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20240202103935.3154011-3-houtao@huaweicloud.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2024-11-19 08:44:36 +01:00
..
pat Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
amdtopology.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cpu_entry_area.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
debug_pagetables.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
dump_pagetables.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
extable.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
fault.c x86/mm: Move is_vsyscall_vaddr() into asm/vsyscall.h 2024-11-19 08:44:36 +01:00
highmem_32.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
hugetlbpage.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ident_map.c x86/mm/ident_map: Use gbpages only where full GB page should be mapped. 2024-11-18 12:13:31 +01:00
init.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
init_32.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
init_64.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
iomap_32.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ioremap.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
kasan_init_64.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
kaslr.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
kmmio.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
maccess.c x86/mm: Disallow vsyscall page read for copy_from_kernel_nofault() 2024-11-19 08:44:36 +01:00
Makefile Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mem_encrypt.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mem_encrypt_boot.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mem_encrypt_identity.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mm_internal.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mmap.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mmio-mod.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
numa.c x86/mm: Drop the 4 MB restriction on minimal NUMA node memory size 2024-11-18 11:43:12 +01:00
numa_32.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
numa_64.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
numa_emulation.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
numa_internal.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pf_in.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pf_in.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pgtable.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pgtable_32.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
physaddr.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
physaddr.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pkeys.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pti.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
setup_nx.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
srat.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
testmmiotrace.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
tlb.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00