CVE-2025-38170
arm64/fpsimd: Discard stale CPU state when handling SME traps
In the Linux kernel, the following vulnerability has been resolved: arm64/fpsimd: Discard stale CPU state when handling SME traps The logic for handling SME traps manipulates saved FPSIMD/SVE/SME state incorrectly, and a race with preemption can result in a task having TIF_SME set and TIF_FOREIGN_FPSTATE clear even though the live CPU state is stale (e.g. with SME traps enabled). This can result in warnings from do_sme_acc() where SME traps are not expected while TIF_SME is set: | /* With TIF_SME userspace shouldn't generate any traps */ | if (test_and_set_thread_flag(TIF_SME)) | WARN_ON(1); This is very similar to the SVE issue we fixed in commit: 751ecf6afd6568ad ("arm64/sve: Discard stale CPU state when handling SVE traps") The race can occur when the SME trap handler is preempted before and after manipulating the saved FPSIMD/SVE/SME state, starting and ending on the same CPU, e.g. | void do_sme_acc(unsigned long esr, struct pt_regs *regs) | { | // Trap on CPU 0 with TIF_SME clear, SME traps enabled | // task->fpsimd_cpu is 0. | // per_cpu_ptr(&fpsimd_last_state, 0) is task. | | ... | | // Preempted; migrated from CPU 0 to CPU 1. | // TIF_FOREIGN_FPSTATE is set. | | get_cpu_fpsimd_context(); | | /* With TIF_SME userspace shouldn't generate any traps */ | if (test_and_set_thread_flag(TIF_SME)) | WARN_ON(1); | | if (!test_thread_flag(TIF_FOREIGN_FPSTATE)) { | unsigned long vq_minus_one = | sve_vq_from_vl(task_get_sme_vl(current)) - 1; | sme_set_vq(vq_minus_one); | | fpsimd_bind_task_to_cpu(); | } | | put_cpu_fpsimd_context(); | | // Preempted; migrated from CPU 1 to CPU 0. | // task->fpsimd_cpu is still 0 | // If per_cpu_ptr(&fpsimd_last_state, 0) is still task then: | // - Stale HW state is reused (with SME traps enabled) | // - TIF_FOREIGN_FPSTATE is cleared | // - A return to userspace skips HW state restore | } Fix the case where the state is not live and TIF_FOREIGN_FPSTATE is set by calling fpsimd_flush_task_state() to detach from the saved CPU state. This ensures that a subsequent context switch will not reuse the stale CPU state, and will instead set TIF_FOREIGN_FPSTATE, forcing the new state to be reloaded from memory prior to a return to userspace. Note: this was originallly posted as [1]. [ Rutland: rewrite commit message ]
Fixes and workarounds
No remediation reported in collected sources.
Missing remediation information is not evidence that no patch exists.
Affected products and versions
| Product | Versions | Authority |
|---|---|---|
| Linux Linux |
≥ 8bd7f91c03d886f41d35f6108078d20be5a4a1bd; < de89368de3894a8db27caeb8fd902ba1c49f696a (affected, git) ≥ 8bd7f91c03d886f41d35f6108078d20be5a4a1bd; < 43be952e885476dafb74aa832c0847b2f4f650c6 (affected, git) ≥ 8bd7f91c03d886f41d35f6108078d20be5a4a1bd; < 6103f9ba51a59afb5a0f32299c837377c5a5a693 (affected, git) ≥ 8bd7f91c03d886f41d35f6108078d20be5a4a1bd; < c4a4786d93e99517d6f10ed56b9ffba4ce88d3b3 (affected, git) ≥ 8bd7f91c03d886f41d35f6108078d20be5a4a1bd; < d3eaab3c70905c5467e5c4ea403053d67505adeb (affected, git) Other versions: unaffected |
CNA: Linux |
| Linux Linux |
5.19 (affected) ≥ 0; < 5.19 (unaffected, semver) ≥ 6.1.142; ≤ 6.1.* (unaffected, semver) ≥ 6.6.94; ≤ 6.6.* (unaffected, semver) ≥ 6.12.34; ≤ 6.12.* (unaffected, semver) ≥ 6.15.3; ≤ 6.15.* (unaffected, semver) ≥ 6.16; ≤ * (unaffected, original_commit_for_fix) Other versions: affected |
CNA: Linux |
Version ranges are source assertions. Check the vendor advisory and your installed configuration before determining exposure.
CVSS assessments
No CVSS assessment reported. An unscored record is not a low-severity determination.
Exploit evidence
No exploit evidence in collected sources. This is not proof of no exploitation.
References
- https://git.kernel.org/stable/c/de89368de3894a8db27caeb8fd902ba1c49f696aCNA: Linux
- https://git.kernel.org/stable/c/43be952e885476dafb74aa832c0847b2f4f650c6CNA: Linux
- https://git.kernel.org/stable/c/6103f9ba51a59afb5a0f32299c837377c5a5a693CNA: Linux
- https://git.kernel.org/stable/c/c4a4786d93e99517d6f10ed56b9ffba4ce88d3b3CNA: Linux
- https://git.kernel.org/stable/c/d3eaab3c70905c5467e5c4ea403053d67505adebCNA: Linux
- https://lists.debian.org/debian-lts-announce/2025/10/msg00008.htmlADP: CVE
For agents and automation
Read public disclosures for free as Markdown or JSON. Compatible browsers also expose native WebMCP tools to search disclosures, read this page, and discover API access.
Use the ontology-linked Cyber API with x402 pay per request, or a Y2 Pro or Elite API key with the intel:cyber scope.
Endpoints and access details
https://api.y2.dev/api/v2/cyber/cveshttps://api.y2.dev/api/v2/cyber/cves/{cveId}
A workspace owner or admin can create a Pro or Elite API key. Send Authorization: Bearer <Y2_API_KEY> from your trusted agent runtime.
For x402, omit Authorization and read the HTTP 402 payment challenge before signing a retry. Public browser tools do not make payments.