In the Linux kernel, the following vulnerability has been resolved:
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 ARCHSHSTKSHSTK 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 XFEATURECETUSER in its init state, which would cause getxsaveaddr() to return NULL and trigger a WARNON(). The sspset() handler luckily has an sspactive() check to avoid surprising the kernel with shadow stack behavior when the kernel is not ready for it (ARCHSHSTK_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 sspget+0x89/0xa0 [...] Call Trace: <TASK> ? showregs+0x6e/0x80 ? sspget+0x89/0xa0 ? _warn+0x91/0x150 ? sspget+0x89/0xa0 ? reportbug+0x19d/0x1b0 ? handlebug+0x46/0x80 ? excinvalidop+0x1d/0x80 ? asmexcinvalidop+0x1f/0x30 ? _pfxsspget+0x10/0x10 ? sspget+0x89/0xa0 ? sspget+0x52/0xa0 _regsetget+0xad/0xf0 copyregsettouser+0x52/0xc0 ptraceregset+0x119/0x140 ptracerequest+0x13c/0x850 ? waittaskinactive+0x142/0x1d0 ? dosyscall64+0x6d/0x90 arch_ptrace+0x102/0x300 [...]
Ensure that shadow stacks are active in a thread before looking them up in the XSAVE buffer. Since ARCHSHSTKSHSTK and userssp[SHSTKEN] 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 ]
[
{
"id": "CVE-2025-21632-19840108",
"target": {
"file": "arch/x86/kernel/fpu/regset.c",
"function": "ssp_get"
},
"digest": {
"function_hash": "302972958155755453825277817645818344017",
"length": 430.0
},
"deprecated": false,
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@a9d9c33132d49329ada647e4514d210d15e31d81",
"signature_version": "v1"
},
{
"id": "CVE-2025-21632-26368384",
"target": {
"file": "arch/x86/kernel/fpu/regset.c"
},
"digest": {
"threshold": 0.9,
"line_hashes": [
"184922604012426578308671093684855959670",
"168526683334396223864683975812039022666",
"236008950810207651832399886364214805304",
"84623589980785053384425426954609489243"
]
},
"deprecated": false,
"signature_type": "Line",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@0a3a872214188e4268d31581ed0cd44508e038cf",
"signature_version": "v1"
},
{
"id": "CVE-2025-21632-43c079d6",
"target": {
"file": "arch/x86/kernel/fpu/regset.c",
"function": "ssp_get"
},
"digest": {
"function_hash": "302972958155755453825277817645818344017",
"length": 430.0
},
"deprecated": false,
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@0a3a872214188e4268d31581ed0cd44508e038cf",
"signature_version": "v1"
},
{
"id": "CVE-2025-21632-8e9ba6eb",
"target": {
"file": "arch/x86/kernel/fpu/regset.c"
},
"digest": {
"threshold": 0.9,
"line_hashes": [
"184922604012426578308671093684855959670",
"168526683334396223864683975812039022666",
"236008950810207651832399886364214805304",
"84623589980785053384425426954609489243"
]
},
"deprecated": false,
"signature_type": "Line",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@6bfe1fc22f462bec87422cdcbec4d7a2f43ff01d",
"signature_version": "v1"
},
{
"id": "CVE-2025-21632-95a2479d",
"target": {
"file": "arch/x86/kernel/fpu/regset.c",
"function": "ssp_get"
},
"digest": {
"function_hash": "302972958155755453825277817645818344017",
"length": 430.0
},
"deprecated": false,
"signature_type": "Function",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@6bfe1fc22f462bec87422cdcbec4d7a2f43ff01d",
"signature_version": "v1"
},
{
"id": "CVE-2025-21632-b9758c9c",
"target": {
"file": "arch/x86/kernel/fpu/regset.c"
},
"digest": {
"threshold": 0.9,
"line_hashes": [
"184922604012426578308671093684855959670",
"168526683334396223864683975812039022666",
"236008950810207651832399886364214805304",
"84623589980785053384425426954609489243"
]
},
"deprecated": false,
"signature_type": "Line",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@a9d9c33132d49329ada647e4514d210d15e31d81",
"signature_version": "v1"
}
]