Vulnerability Details CVE-2022-49888
In the Linux kernel, the following vulnerability has been resolved:
arm64: entry: avoid kprobe recursion
The cortex_a76_erratum_1463225_debug_handler() function is called when
handling debug exceptions (and synchronous exceptions from BRK
instructions), and so is called when a probed function executes. If the
compiler does not inline cortex_a76_erratum_1463225_debug_handler(), it
can be probed.
If cortex_a76_erratum_1463225_debug_handler() is probed, any debug
exception or software breakpoint exception will result in recursive
exceptions leading to a stack overflow. This can be triggered with the
ftrace multiple_probes selftest, and as per the example splat below.
This is a regression caused by commit:
6459b8469753e9fe ("arm64: entry: consolidate Cortex-A76 erratum 1463225 workaround")
... which removed the NOKPROBE_SYMBOL() annotation associated with the
function.
My intent was that cortex_a76_erratum_1463225_debug_handler() would be
inlined into its caller, el1_dbg(), which is marked noinstr and cannot
be probed. Mark cortex_a76_erratum_1463225_debug_handler() as
__always_inline to ensure this.
Example splat prior to this patch (with recursive entries elided):
| # echo p cortex_a76_erratum_1463225_debug_handler > /sys/kernel/debug/tracing/kprobe_events
| # echo p do_el0_svc >> /sys/kernel/debug/tracing/kprobe_events
| # echo 1 > /sys/kernel/debug/tracing/events/kprobes/enable
| Insufficient stack space to handle exception!
| ESR: 0x0000000096000047 -- DABT (current EL)
| FAR: 0xffff800009cefff0
| Task stack: [0xffff800009cf0000..0xffff800009cf4000]
| IRQ stack: [0xffff800008000000..0xffff800008004000]
| Overflow stack: [0xffff00007fbc00f0..0xffff00007fbc10f0]
| CPU: 0 PID: 145 Comm: sh Not tainted 6.0.0 #2
| Hardware name: linux,dummy-virt (DT)
| pstate: 604003c5 (nZCv DAIF +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
| pc : arm64_enter_el1_dbg+0x4/0x20
| lr : el1_dbg+0x24/0x5c
| sp : ffff800009cf0000
| x29: ffff800009cf0000 x28: ffff000002c74740 x27: 0000000000000000
| x26: 0000000000000000 x25: 0000000000000000 x24: 0000000000000000
| x23: 00000000604003c5 x22: ffff80000801745c x21: 0000aaaac95ac068
| x20: 00000000f2000004 x19: ffff800009cf0040 x18: 0000000000000000
| x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000000
| x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000
| x11: 0000000000000010 x10: ffff800008c87190 x9 : ffff800008ca00d0
| x8 : 000000000000003c x7 : 0000000000000000 x6 : 0000000000000000
| x5 : 0000000000000000 x4 : 0000000000000000 x3 : 00000000000043a4
| x2 : 00000000f2000004 x1 : 00000000f2000004 x0 : ffff800009cf0040
| Kernel panic - not syncing: kernel stack overflow
| CPU: 0 PID: 145 Comm: sh Not tainted 6.0.0 #2
| Hardware name: linux,dummy-virt (DT)
| Call trace:
| dump_backtrace+0xe4/0x104
| show_stack+0x18/0x4c
| dump_stack_lvl+0x64/0x7c
| dump_stack+0x18/0x38
| panic+0x14c/0x338
| test_taint+0x0/0x2c
| panic_bad_stack+0x104/0x118
| handle_bad_stack+0x34/0x48
| __bad_stack+0x78/0x7c
| arm64_enter_el1_dbg+0x4/0x20
| el1h_64_sync_handler+0x40/0x98
| el1h_64_sync+0x64/0x68
| cortex_a76_erratum_1463225_debug_handler+0x0/0x34
...
| el1h_64_sync_handler+0x40/0x98
| el1h_64_sync+0x64/0x68
| cortex_a76_erratum_1463225_debug_handler+0x0/0x34
...
| el1h_64_sync_handler+0x40/0x98
| el1h_64_sync+0x64/0x68
| cortex_a76_erratum_1463225_debug_handler+0x0/0x34
| el1h_64_sync_handler+0x40/0x98
| el1h_64_sync+0x64/0x68
| do_el0_svc+0x0/0x28
| el0t_64_sync_handler+0x84/0xf0
| el0t_64_sync+0x18c/0x190
| Kernel Offset: disabled
| CPU features: 0x0080,00005021,19001080
| Memory Limit: none
| ---[ end Kernel panic - not syncing: kernel stack overflow ]---
With this patch, cortex_a76_erratum_1463225_debug_handler() is inlined
into el1_dbg(), and el1_dbg() cannot be probed:
| # echo p cortex_a76_erratum_1463225_debug_handler > /sys/kernel/debug/tracing/kprobe_events
| sh: write error: No such file or directory
| # grep -w cortex_a76_errat
---truncated---
Exploit prediction scoring system (EPSS) score
EPSS Score 0.0
EPSS Ranking 1.4%
CVSS Severity
CVSS v3 Score 7.8
Products affected by CVE-2022-49888
-
cpe:2.3:o:linux:linux_kernel:5.12
-
cpe:2.3:o:linux:linux_kernel:5.12.1
-
cpe:2.3:o:linux:linux_kernel:5.12.10
-
cpe:2.3:o:linux:linux_kernel:5.12.11
-
cpe:2.3:o:linux:linux_kernel:5.12.12
-
cpe:2.3:o:linux:linux_kernel:5.12.13
-
cpe:2.3:o:linux:linux_kernel:5.12.14
-
cpe:2.3:o:linux:linux_kernel:5.12.15
-
cpe:2.3:o:linux:linux_kernel:5.12.16
-
cpe:2.3:o:linux:linux_kernel:5.12.17
-
cpe:2.3:o:linux:linux_kernel:5.12.18
-
cpe:2.3:o:linux:linux_kernel:5.12.19
-
cpe:2.3:o:linux:linux_kernel:5.12.2
-
cpe:2.3:o:linux:linux_kernel:5.12.25
-
cpe:2.3:o:linux:linux_kernel:5.12.3
-
cpe:2.3:o:linux:linux_kernel:5.12.4
-
cpe:2.3:o:linux:linux_kernel:5.12.5
-
cpe:2.3:o:linux:linux_kernel:5.12.6
-
cpe:2.3:o:linux:linux_kernel:5.12.7
-
cpe:2.3:o:linux:linux_kernel:5.12.8
-
cpe:2.3:o:linux:linux_kernel:5.12.9
-
cpe:2.3:o:linux:linux_kernel:5.13
-
cpe:2.3:o:linux:linux_kernel:5.13.0-52
-
cpe:2.3:o:linux:linux_kernel:5.13.1
-
cpe:2.3:o:linux:linux_kernel:5.13.10
-
cpe:2.3:o:linux:linux_kernel:5.13.11
-
cpe:2.3:o:linux:linux_kernel:5.13.12
-
cpe:2.3:o:linux:linux_kernel:5.13.13
-
cpe:2.3:o:linux:linux_kernel:5.13.14
-
cpe:2.3:o:linux:linux_kernel:5.13.15
-
cpe:2.3:o:linux:linux_kernel:5.13.16
-
cpe:2.3:o:linux:linux_kernel:5.13.17
-
cpe:2.3:o:linux:linux_kernel:5.13.18
-
cpe:2.3:o:linux:linux_kernel:5.13.19
-
cpe:2.3:o:linux:linux_kernel:5.13.2
-
cpe:2.3:o:linux:linux_kernel:5.13.3
-
cpe:2.3:o:linux:linux_kernel:5.13.4
-
cpe:2.3:o:linux:linux_kernel:5.13.5
-
cpe:2.3:o:linux:linux_kernel:5.13.6
-
cpe:2.3:o:linux:linux_kernel:5.13.7
-
cpe:2.3:o:linux:linux_kernel:5.13.8
-
cpe:2.3:o:linux:linux_kernel:5.13.9
-
cpe:2.3:o:linux:linux_kernel:5.14
-
cpe:2.3:o:linux:linux_kernel:5.14.1
-
cpe:2.3:o:linux:linux_kernel:5.14.10
-
cpe:2.3:o:linux:linux_kernel:5.14.11
-
cpe:2.3:o:linux:linux_kernel:5.14.12
-
cpe:2.3:o:linux:linux_kernel:5.14.13
-
cpe:2.3:o:linux:linux_kernel:5.14.14
-
cpe:2.3:o:linux:linux_kernel:5.14.15
-
cpe:2.3:o:linux:linux_kernel:5.14.16
-
cpe:2.3:o:linux:linux_kernel:5.14.17
-
cpe:2.3:o:linux:linux_kernel:5.14.18
-
cpe:2.3:o:linux:linux_kernel:5.14.19
-
cpe:2.3:o:linux:linux_kernel:5.14.2
-
cpe:2.3:o:linux:linux_kernel:5.14.20
-
cpe:2.3:o:linux:linux_kernel:5.14.21
-
cpe:2.3:o:linux:linux_kernel:5.14.3
-
cpe:2.3:o:linux:linux_kernel:5.14.4
-
cpe:2.3:o:linux:linux_kernel:5.14.5
-
cpe:2.3:o:linux:linux_kernel:5.14.6
-
cpe:2.3:o:linux:linux_kernel:5.14.7
-
cpe:2.3:o:linux:linux_kernel:5.14.8
-
cpe:2.3:o:linux:linux_kernel:5.14.9
-
cpe:2.3:o:linux:linux_kernel:5.15
-
cpe:2.3:o:linux:linux_kernel:5.15.0
-
cpe:2.3:o:linux:linux_kernel:5.15.0-58
-
cpe:2.3:o:linux:linux_kernel:5.15.1
-
cpe:2.3:o:linux:linux_kernel:5.15.10
-
cpe:2.3:o:linux:linux_kernel:5.15.11
-
cpe:2.3:o:linux:linux_kernel:5.15.12
-
cpe:2.3:o:linux:linux_kernel:5.15.13
-
cpe:2.3:o:linux:linux_kernel:5.15.14
-
cpe:2.3:o:linux:linux_kernel:5.15.15
-
cpe:2.3:o:linux:linux_kernel:5.15.16
-
cpe:2.3:o:linux:linux_kernel:5.15.17
-
cpe:2.3:o:linux:linux_kernel:5.15.18
-
cpe:2.3:o:linux:linux_kernel:5.15.19
-
cpe:2.3:o:linux:linux_kernel:5.15.2
-
cpe:2.3:o:linux:linux_kernel:5.15.20
-
cpe:2.3:o:linux:linux_kernel:5.15.21
-
cpe:2.3:o:linux:linux_kernel:5.15.22
-
cpe:2.3:o:linux:linux_kernel:5.15.23
-
cpe:2.3:o:linux:linux_kernel:5.15.24
-
cpe:2.3:o:linux:linux_kernel:5.15.25
-
cpe:2.3:o:linux:linux_kernel:5.15.26
-
cpe:2.3:o:linux:linux_kernel:5.15.27
-
cpe:2.3:o:linux:linux_kernel:5.15.28
-
cpe:2.3:o:linux:linux_kernel:5.15.29
-
cpe:2.3:o:linux:linux_kernel:5.15.3
-
cpe:2.3:o:linux:linux_kernel:5.15.30
-
cpe:2.3:o:linux:linux_kernel:5.15.31
-
cpe:2.3:o:linux:linux_kernel:5.15.32
-
cpe:2.3:o:linux:linux_kernel:5.15.33
-
cpe:2.3:o:linux:linux_kernel:5.15.34
-
cpe:2.3:o:linux:linux_kernel:5.15.35
-
cpe:2.3:o:linux:linux_kernel:5.15.36
-
cpe:2.3:o:linux:linux_kernel:5.15.37
-
cpe:2.3:o:linux:linux_kernel:5.15.38
-
cpe:2.3:o:linux:linux_kernel:5.15.39
-
cpe:2.3:o:linux:linux_kernel:5.15.4
-
cpe:2.3:o:linux:linux_kernel:5.15.40
-
cpe:2.3:o:linux:linux_kernel:5.15.41
-
cpe:2.3:o:linux:linux_kernel:5.15.42
-
cpe:2.3:o:linux:linux_kernel:5.15.43
-
cpe:2.3:o:linux:linux_kernel:5.15.44
-
cpe:2.3:o:linux:linux_kernel:5.15.45
-
cpe:2.3:o:linux:linux_kernel:5.15.46
-
cpe:2.3:o:linux:linux_kernel:5.15.47
-
cpe:2.3:o:linux:linux_kernel:5.15.48
-
cpe:2.3:o:linux:linux_kernel:5.15.49
-
cpe:2.3:o:linux:linux_kernel:5.15.5
-
cpe:2.3:o:linux:linux_kernel:5.15.50
-
cpe:2.3:o:linux:linux_kernel:5.15.51
-
cpe:2.3:o:linux:linux_kernel:5.15.52
-
cpe:2.3:o:linux:linux_kernel:5.15.53
-
cpe:2.3:o:linux:linux_kernel:5.15.54
-
cpe:2.3:o:linux:linux_kernel:5.15.55
-
cpe:2.3:o:linux:linux_kernel:5.15.56
-
cpe:2.3:o:linux:linux_kernel:5.15.57
-
cpe:2.3:o:linux:linux_kernel:5.15.58
-
cpe:2.3:o:linux:linux_kernel:5.15.59
-
cpe:2.3:o:linux:linux_kernel:5.15.6
-
cpe:2.3:o:linux:linux_kernel:5.15.60
-
cpe:2.3:o:linux:linux_kernel:5.15.61
-
cpe:2.3:o:linux:linux_kernel:5.15.62
-
cpe:2.3:o:linux:linux_kernel:5.15.63
-
cpe:2.3:o:linux:linux_kernel:5.15.64
-
cpe:2.3:o:linux:linux_kernel:5.15.65
-
cpe:2.3:o:linux:linux_kernel:5.15.66
-
cpe:2.3:o:linux:linux_kernel:5.15.67
-
cpe:2.3:o:linux:linux_kernel:5.15.68
-
cpe:2.3:o:linux:linux_kernel:5.15.69
-
cpe:2.3:o:linux:linux_kernel:5.15.7
-
cpe:2.3:o:linux:linux_kernel:5.15.70
-
cpe:2.3:o:linux:linux_kernel:5.15.71
-
cpe:2.3:o:linux:linux_kernel:5.15.72
-
cpe:2.3:o:linux:linux_kernel:5.15.73
-
cpe:2.3:o:linux:linux_kernel:5.15.74
-
cpe:2.3:o:linux:linux_kernel:5.15.75
-
cpe:2.3:o:linux:linux_kernel:5.15.76
-
cpe:2.3:o:linux:linux_kernel:5.15.77
-
cpe:2.3:o:linux:linux_kernel:5.15.8
-
cpe:2.3:o:linux:linux_kernel:5.15.9
-
cpe:2.3:o:linux:linux_kernel:5.16
-
cpe:2.3:o:linux:linux_kernel:5.16.0
-
cpe:2.3:o:linux:linux_kernel:5.16.1
-
cpe:2.3:o:linux:linux_kernel:5.16.10
-
cpe:2.3:o:linux:linux_kernel:5.16.11
-
cpe:2.3:o:linux:linux_kernel:5.16.12
-
cpe:2.3:o:linux:linux_kernel:5.16.13
-
cpe:2.3:o:linux:linux_kernel:5.16.14
-
cpe:2.3:o:linux:linux_kernel:5.16.15
-
cpe:2.3:o:linux:linux_kernel:5.16.16
-
cpe:2.3:o:linux:linux_kernel:5.16.17
-
cpe:2.3:o:linux:linux_kernel:5.16.18
-
cpe:2.3:o:linux:linux_kernel:5.16.19
-
cpe:2.3:o:linux:linux_kernel:5.16.2
-
cpe:2.3:o:linux:linux_kernel:5.16.20
-
cpe:2.3:o:linux:linux_kernel:5.16.3
-
cpe:2.3:o:linux:linux_kernel:5.16.4
-
cpe:2.3:o:linux:linux_kernel:5.16.5
-
cpe:2.3:o:linux:linux_kernel:5.16.6
-
cpe:2.3:o:linux:linux_kernel:5.16.62
-
cpe:2.3:o:linux:linux_kernel:5.16.7
-
cpe:2.3:o:linux:linux_kernel:5.16.8
-
cpe:2.3:o:linux:linux_kernel:5.16.9
-
cpe:2.3:o:linux:linux_kernel:5.17
-
cpe:2.3:o:linux:linux_kernel:5.17.1
-
cpe:2.3:o:linux:linux_kernel:5.17.10
-
cpe:2.3:o:linux:linux_kernel:5.17.11
-
cpe:2.3:o:linux:linux_kernel:5.17.12
-
cpe:2.3:o:linux:linux_kernel:5.17.13
-
cpe:2.3:o:linux:linux_kernel:5.17.14
-
cpe:2.3:o:linux:linux_kernel:5.17.15
-
cpe:2.3:o:linux:linux_kernel:5.17.2
-
cpe:2.3:o:linux:linux_kernel:5.17.3
-
cpe:2.3:o:linux:linux_kernel:5.17.4
-
cpe:2.3:o:linux:linux_kernel:5.17.5
-
cpe:2.3:o:linux:linux_kernel:5.17.6
-
cpe:2.3:o:linux:linux_kernel:5.17.7
-
cpe:2.3:o:linux:linux_kernel:5.17.8
-
cpe:2.3:o:linux:linux_kernel:5.17.9
-
cpe:2.3:o:linux:linux_kernel:5.18
-
cpe:2.3:o:linux:linux_kernel:5.18.1
-
cpe:2.3:o:linux:linux_kernel:5.18.10
-
cpe:2.3:o:linux:linux_kernel:5.18.11
-
cpe:2.3:o:linux:linux_kernel:5.18.12
-
cpe:2.3:o:linux:linux_kernel:5.18.13
-
cpe:2.3:o:linux:linux_kernel:5.18.14
-
cpe:2.3:o:linux:linux_kernel:5.18.15
-
cpe:2.3:o:linux:linux_kernel:5.18.16
-
cpe:2.3:o:linux:linux_kernel:5.18.17
-
cpe:2.3:o:linux:linux_kernel:5.18.18
-
cpe:2.3:o:linux:linux_kernel:5.18.19
-
cpe:2.3:o:linux:linux_kernel:5.18.2
-
cpe:2.3:o:linux:linux_kernel:5.18.3
-
cpe:2.3:o:linux:linux_kernel:5.18.4
-
cpe:2.3:o:linux:linux_kernel:5.18.5
-
cpe:2.3:o:linux:linux_kernel:5.18.6
-
cpe:2.3:o:linux:linux_kernel:5.18.7
-
cpe:2.3:o:linux:linux_kernel:5.18.8
-
cpe:2.3:o:linux:linux_kernel:5.18.9
-
cpe:2.3:o:linux:linux_kernel:5.19
-
cpe:2.3:o:linux:linux_kernel:5.19.1
-
cpe:2.3:o:linux:linux_kernel:5.19.10
-
cpe:2.3:o:linux:linux_kernel:5.19.11
-
cpe:2.3:o:linux:linux_kernel:5.19.12
-
cpe:2.3:o:linux:linux_kernel:5.19.13
-
cpe:2.3:o:linux:linux_kernel:5.19.14
-
cpe:2.3:o:linux:linux_kernel:5.19.15
-
cpe:2.3:o:linux:linux_kernel:5.19.16
-
cpe:2.3:o:linux:linux_kernel:5.19.17
-
cpe:2.3:o:linux:linux_kernel:5.19.2
-
cpe:2.3:o:linux:linux_kernel:5.19.3
-
cpe:2.3:o:linux:linux_kernel:5.19.4
-
cpe:2.3:o:linux:linux_kernel:5.19.5
-
cpe:2.3:o:linux:linux_kernel:5.19.6
-
cpe:2.3:o:linux:linux_kernel:5.19.7
-
cpe:2.3:o:linux:linux_kernel:5.19.8
-
cpe:2.3:o:linux:linux_kernel:5.19.9
-
cpe:2.3:o:linux:linux_kernel:6.0
-
cpe:2.3:o:linux:linux_kernel:6.0.1
-
cpe:2.3:o:linux:linux_kernel:6.0.2
-
cpe:2.3:o:linux:linux_kernel:6.0.3
-
cpe:2.3:o:linux:linux_kernel:6.0.4
-
cpe:2.3:o:linux:linux_kernel:6.0.5
-
cpe:2.3:o:linux:linux_kernel:6.0.6
-
cpe:2.3:o:linux:linux_kernel:6.0.7
-
cpe:2.3:o:linux:linux_kernel:6.1