linux/arch/arm
sparkhuang 1515e72aae ARM: 9170/1: fix panic when kasan and kprobe are enabled
commit 8b59b0a53c upstream.

arm32 uses software to simulate the instruction replaced
by kprobe. some instructions may be simulated by constructing
assembly functions. therefore, before executing instruction
simulation, it is necessary to construct assembly function
execution environment in C language through binding registers.
after kasan is enabled, the register binding relationship will
be destroyed, resulting in instruction simulation errors and
causing kernel panic.

the kprobe emulate instruction function is distributed in three
files: actions-common.c actions-arm.c actions-thumb.c, so disable
KASAN when compiling these files.

for example, use kprobe insert on cap_capable+20 after kasan
enabled, the cap_capable assembly code is as follows:
<cap_capable>:
e92d47f0	push	{r4, r5, r6, r7, r8, r9, sl, lr}
e1a05000	mov	r5, r0
e280006c	add	r0, r0, #108    ; 0x6c
e1a04001	mov	r4, r1
e1a06002	mov	r6, r2
e59fa090	ldr	sl, [pc, #144]  ;
ebfc7bf8	bl	c03aa4b4 <__asan_load4>
e595706c	ldr	r7, [r5, #108]  ; 0x6c
e2859014	add	r9, r5, #20
......
The emulate_ldr assembly code after enabling kasan is as follows:
c06f1384 <emulate_ldr>:
e92d47f0	push	{r4, r5, r6, r7, r8, r9, sl, lr}
e282803c	add	r8, r2, #60     ; 0x3c
e1a05000	mov	r5, r0
e7e37855	ubfx	r7, r5, #16, #4
e1a00008	mov	r0, r8
e1a09001	mov	r9, r1
e1a04002	mov	r4, r2
ebf35462	bl	c03c6530 <__asan_load4>
e357000f	cmp	r7, #15
e7e36655	ubfx	r6, r5, #12, #4
e205a00f	and	sl, r5, #15
0a000001	beq	c06f13bc <emulate_ldr+0x38>
e0840107	add	r0, r4, r7, lsl #2
ebf3545c	bl	c03c6530 <__asan_load4>
e084010a	add	r0, r4, sl, lsl #2
ebf3545a	bl	c03c6530 <__asan_load4>
e2890010	add	r0, r9, #16
ebf35458	bl	c03c6530 <__asan_load4>
e5990010	ldr	r0, [r9, #16]
e12fff30	blx	r0
e356000f	cm	r6, #15
1a000014	bne	c06f1430 <emulate_ldr+0xac>
e1a06000	mov	r6, r0
e2840040	add	r0, r4, #64     ; 0x40
......

when running in emulate_ldr to simulate the ldr instruction, panic
occurred, and the log is as follows:
Unable to handle kernel NULL pointer dereference at virtual address
00000090
pgd = ecb46400
[00000090] *pgd=2e0fa003, *pmd=00000000
Internal error: Oops: 206 [#1] SMP ARM
PC is at cap_capable+0x14/0xb0
LR is at emulate_ldr+0x50/0xc0
psr: 600d0293 sp : ecd63af8  ip : 00000004  fp : c0a7c30c
r10: 00000000  r9 : c30897f4  r8 : ecd63cd4
r7 : 0000000f  r6 : 0000000a  r5 : e59fa090  r4 : ecd63c98
r3 : c06ae294  r2 : 00000000  r1 : b7611300  r0 : bf4ec008
Flags: nZCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment user
Control: 32c5387d  Table: 2d546400  DAC: 55555555
Process bash (pid: 1643, stack limit = 0xecd60190)
(cap_capable) from (kprobe_handler+0x218/0x340)
(kprobe_handler) from (kprobe_trap_handler+0x24/0x48)
(kprobe_trap_handler) from (do_undefinstr+0x13c/0x364)
(do_undefinstr) from (__und_svc_finish+0x0/0x30)
(__und_svc_finish) from (cap_capable+0x18/0xb0)
(cap_capable) from (cap_vm_enough_memory+0x38/0x48)
(cap_vm_enough_memory) from
(security_vm_enough_memory_mm+0x48/0x6c)
(security_vm_enough_memory_mm) from
(copy_process.constprop.5+0x16b4/0x25c8)
(copy_process.constprop.5) from (_do_fork+0xe8/0x55c)
(_do_fork) from (SyS_clone+0x1c/0x24)
(SyS_clone) from (__sys_trace_return+0x0/0x10)
Code: 0050a0e1 6c0080e2 0140a0e1 0260a0e1 (f801f0e7)

Fixes: 35aa1df432 ("ARM kprobes: instruction single-stepping support")
Fixes: 421015713b ("ARM: 9017/2: Enable KASan for ARM")
Signed-off-by: huangshaobo <huangshaobo6@huawei.com>
Acked-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2022-02-01 17:27:07 +01:00
..
boot ARM: dts: qcom: sdx55: fix IPA interconnect definitions 2022-01-27 11:04:39 +01:00
common ARM: sharpsl_param: work around -Wstringop-overread warning 2021-10-05 15:44:56 +02:00
configs Documentation, arch: Remove leftovers from CIFS_WEAK_PW_HASH 2022-01-27 11:05:21 +01:00
crypto ARM: 9099/1: crypto: rename 'mod_init' & 'mod_exit' functions to be module-specific 2021-08-10 12:15:27 +01:00
include ARM: 9180/1: Thumb2: align ALT_UP() sections in modules sufficiently 2022-02-01 17:26:59 +01:00
kernel perf: Protect perf_guest_cbs with RCU 2022-01-20 09:13:14 +01:00
lib ARM development updates for 5.15: 2021-09-09 13:25:49 -07:00
mach-actions
mach-alpine
mach-artpec
mach-asm9260
mach-aspeed
mach-at91 ARM: at91: pm: preload base address of controllers in tlb 2021-10-04 12:08:34 +02:00
mach-axxia
mach-bcm isystem: trim/fixup stdarg.h and other headers 2021-08-19 09:02:55 +09:00
mach-berlin
mach-clps711x
mach-cns3xxx
mach-davinci arch: Kconfig: clean up obsolete use of HAVE_IDE 2021-07-30 08:19:09 -06:00
mach-digicolor
mach-dove ARM: dove: mark 'putc' as inline 2021-10-05 15:40:38 +02:00
mach-ep93xx ARM: ep93xx: remove MaverickCrunch support 2021-08-04 13:30:04 +02:00
mach-exynos
mach-footbridge
mach-gemini
mach-highbank
mach-hisi
mach-imx ARM: imx: register reset controller from a platform driver 2021-10-15 09:38:06 +08:00
mach-integrator
mach-iop32x
mach-ixp4xx ARM: SoC updates for 5.15 2021-09-01 15:19:43 -07:00
mach-keystone
mach-lpc18xx
mach-lpc32xx
mach-mediatek
mach-meson
mach-milbeaut
mach-mmp
mach-moxart
mach-mstar
mach-mv78xx0
mach-mvebu
mach-mxs
mach-nomadik
mach-npcm
mach-nspire
mach-omap1 ARM: omap1: move omap15xx local bus handling to usb.c 2021-10-05 15:39:50 +02:00
mach-omap2 Driver core fixes for 5.15-rc6 2021-10-17 17:17:28 -10:00
mach-orion5x
mach-oxnas
mach-pxa ARM: Bulk conversion to generic_handle_domain_irq() 2021-08-12 11:39:39 +01:00
mach-qcom
mach-rda
mach-realtek
mach-realview
mach-rockchip
mach-rpc printk changes for 5.15 2021-09-01 18:41:13 -07:00
mach-s3c ARM: s3c: irq-s3c24xx: Fix return value check for s3c24xx_init_intc() 2021-11-18 19:16:46 +01:00
mach-s5pv210
mach-sa1100
mach-shmobile ARM: shmobile: rcar-gen2: Add missing of_node_put() 2022-01-27 11:04:25 +01:00
mach-socfpga ARM: socfpga: Fix crash with CONFIG_FORTIRY_SOURCE 2021-12-01 09:04:47 +01:00
mach-spear
mach-sti
mach-stm32
mach-sunxi
mach-tegra ARM: SoC drivers for 5.15 2021-09-01 15:25:28 -07:00
mach-uniphier
mach-ux500
mach-versatile
mach-vexpress
mach-vt8500
mach-zynq
mm ARM: 9155/1: fix early early_iounmap() 2021-11-18 19:17:13 +01:00
net bpf, arm: Fix register clobbering in div/mod implementation 2021-09-29 16:04:50 +02:00
nwfpe
plat-omap
plat-orion
plat-pxa
plat-versatile
probes ARM: 9170/1: fix panic when kasan and kprobe are enabled 2022-02-01 17:27:07 +01:00
tools ARM development updates for 5.15: 2021-09-09 13:25:49 -07:00
vdso
vfp
xen
Kbuild
Kconfig kmap_local: don't assume kmap PTEs are linear arrays in memory 2021-11-25 09:48:43 +01:00
Kconfig-nommu
Kconfig.assembler
Kconfig.debug ARM: imx: rename DEBUG_IMX21_IMX27_UART to DEBUG_IMX27_UART 2022-01-27 11:04:29 +01:00
Makefile ARM: 9156/1: drop cc-option fallbacks for architecture selection 2021-11-18 19:17:13 +01:00