linux-kernelorg-stable/arch/x86
Rick Edgecombe a9d9c33132 x86/fpu: Ensure shadow stack is active before "getting" registers
The x86 shadow stack support has its own set of registers. Those registers
are XSAVE-managed, but they are "supervisor state components" which means
that userspace can not touch them with XSAVE/XRSTOR.  It also means that
they are not accessible from the existing ptrace ABI for XSAVE state.
Thus, there is a new ptrace get/set interface for it.

The regset code that ptrace uses provides an ->active() handler in
addition to the get/set ones. For shadow stack this ->active() handler
verifies that shadow stack is enabled via the ARCH_SHSTK_SHSTK bit in the
thread struct. The ->active() handler is checked from some call sites of
the regset get/set handlers, but not the ptrace ones. This was not
understood when shadow stack support was put in place.

As a result, both the set/get handlers can be called with
XFEATURE_CET_USER in its init state, which would cause get_xsave_addr() to
return NULL and trigger a WARN_ON(). The ssp_set() handler luckily has an
ssp_active() check to avoid surprising the kernel with shadow stack
behavior when the kernel is not ready for it (ARCH_SHSTK_SHSTK==0). That
check just happened to avoid the warning.

But the ->get() side wasn't so lucky. It can be called with shadow stacks
disabled, triggering the warning in practice, as reported by Christina
Schimpe:

WARNING: CPU: 5 PID: 1773 at arch/x86/kernel/fpu/regset.c:198 ssp_get+0x89/0xa0
[...]
Call Trace:
<TASK>
? show_regs+0x6e/0x80
? ssp_get+0x89/0xa0
? __warn+0x91/0x150
? ssp_get+0x89/0xa0
? report_bug+0x19d/0x1b0
? handle_bug+0x46/0x80
? exc_invalid_op+0x1d/0x80
? asm_exc_invalid_op+0x1f/0x30
? __pfx_ssp_get+0x10/0x10
? ssp_get+0x89/0xa0
? ssp_get+0x52/0xa0
__regset_get+0xad/0xf0
copy_regset_to_user+0x52/0xc0
ptrace_regset+0x119/0x140
ptrace_request+0x13c/0x850
? wait_task_inactive+0x142/0x1d0
? do_syscall_64+0x6d/0x90
arch_ptrace+0x102/0x300
[...]

Ensure that shadow stacks are active in a thread before looking them up
in the XSAVE buffer. Since ARCH_SHSTK_SHSTK and user_ssp[SHSTK_EN] are
set at the same time, the active check ensures that there will be
something to find in the XSAVE buffer.

[ dhansen: changelog/subject tweaks ]

Fixes: 2fab02b25a ("x86: Add PTRACE interface for shadow stack")
Reported-by: Christina Schimpe <christina.schimpe@intel.com>
Signed-off-by: Rick Edgecombe <rick.p.edgecombe@intel.com>
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Tested-by: Christina Schimpe <christina.schimpe@intel.com>
Cc:stable@vger.kernel.org
Link: https://lore.kernel.org/all/20250107233056.235536-1-rick.p.edgecombe%40intel.com
2025-01-07 15:55:51 -08:00
..
boot x86 cleanups for v6.13: 2024-11-19 14:46:39 -08:00
coco - Add new infrastructure for reading TDX metadata 2024-11-22 13:07:19 -08:00
configs
crypto This update includes the following changes: 2024-11-19 10:28:41 -08:00
entry - The series "zram: optimal post-processing target selection" from 2024-11-23 09:58:07 -08:00
events perf/x86/intel: Fix bitmask of OCR and FRONTEND events for LNC 2024-12-20 15:31:14 +01:00
hyperv
ia32
include KVM x86 fixes for 6.13: 2024-12-22 12:16:41 -08:00
kernel x86/fpu: Ensure shadow stack is active before "getting" registers 2025-01-07 15:55:51 -08:00
kvm KVM x86 fixes for 6.13: 2024-12-22 12:07:16 -05:00
lib
math-emu
mm - Have the Automatic IBRS setting check on AMD does not falsely fire in 2024-12-08 11:38:56 -08:00
net bpf, x86: Propagate tailcall info only for subprogs 2024-11-12 17:24:03 -08:00
pci Merge branch 'pci/thunderbolt' 2024-11-25 13:40:55 -06:00
platform EFI updates for v6.13 2024-11-20 14:13:28 -08:00
power
purgatory
ras
realmode
tools First step of consolidating the VDSO data page handling: 2024-11-19 16:09:13 -08:00
um um: fix sparse warnings in signal code 2024-11-07 17:34:50 +01:00
video
virt - Do the proper memory conversion of guest memory in order to be able to kexec 2024-11-19 12:21:35 -08:00
xen x86/xen: remove hypercall page 2024-12-17 08:23:42 +01:00
.gitignore
Kbuild
Kconfig Kbuild updates for v6.13 2024-11-30 13:41:50 -08:00
Kconfig.assembler
Kconfig.cpu
Kconfig.debug
Makefile x86/stackprotector: Work around strict Clang TLS symbol requirements 2024-11-08 13:16:00 +01:00
Makefile.postlink
Makefile.um
Makefile_32.cpu