arm64/entry: Mask DAIF in cpu_switch_to(), call_on_irq_stack()
Key facts
- Attack vector
- Local
- Privileges required
- Low
- User interaction
- None
- Attack complexity
- Low
- Impact type
- —
- Confidentiality · integrity · availability
- High · High · High
- Fix status
- Fixed
Attack profile from CVSS 3.1 · CNA. Fix status from CNA.
Summary
In the Linux kernel, the following vulnerability has been resolved: arm64/entry: Mask DAIF in cpu_switch_to(), call_on_irq_stack() `cpu_switch_to()` and `call_on_irq_stack()` manipulate SP to change to different stacks along with the Shadow Call Stack if it is enabled. Those two stack changes cannot be done atomically and both functions can be interrupted by SErrors or Debug Exceptions which, though unlikely, is very much broken : if interrupted, we can end up with mismatched stacks and Shadow Call Stack leading to clobbered stacks. In `cpu_switch_to()`, it can happen when SP_EL0 points to the new task, but x18 stills points to the old task's SCS. When the interrupt handler tries to save the task's SCS pointer, it will save the old task SCS pointer (x18) into the new task struct (pointed to by SP_EL0), clobbering it. In `call_on_irq_stack()`, it can happen when switching from the task stack to the IRQ stack and when switching back. In both cases, we can be interrupted when the SCS pointer points to the IRQ SCS, but SP points to the task stack. The nested interrupt handler pushes its return addresses on the IRQ SCS. It then detects that SP points to the task stack, calls `call_on_irq_stack()` and clobbers the task SCS pointer with the IRQ SCS pointer, which it will also use ! This leads to tasks returning to addresses on the wrong SCS, or even on the IRQ SCS, triggering kernel panics via CONFIG_VMAP_STACK or FPAC if enabled. This is possible on a default config, but unlikely. However, when enabling CONFIG_ARM64_PSEUDO_NMI, DAIF is unmasked and instead the GIC is responsible for filtering what interrupts the CPU should receive based on priority. Given the goal of emulating NMIs, pseudo-NMIs can be received by the CPU even in `cpu_switch_to()` and `call_on_irq_stack()`, possibly *very* frequently depending on the system configuration and workload, leading to unpredictable kernel panics. Completely mask DAIF in `cpu_switch_to()` and restore it when returning. Do the same in `call_on_irq_stack()`, but restore and mask around the branch. Mask DAIF even if CONFIG_SHADOW_CALL_STACK is not enabled for consistency of behaviour between all configurations. Introduce and use an assembly macro for saving and masking DAIF, as the existing one saves but only masks IF.
Why it matters now
SSVC decision points
Not available: CISA has not published SSVC decision points for this record.
Affected products
| Vendor | Product | Affected versions | Fixed in | Status | Source |
|---|---|---|---|---|---|
| Linux | Linux | 5.10.180 to before 5.10.210; 5.15.111 to before 5.15.190; 6.1.28 to before 6.1.149; 6.2.15 to before 6.3 | 5.10.210, 5.15.190, 6.1.149, 6.3 | Patch available | CNA |
| Linux | Linux | 6.3 and later | 5.10.210, 5.15.190, 6.1.149, 6.6.101, 6.12.41, 6.15.9, 6.16 | Patch available | CNA |
- Linux VendorLinux Affected 5.10.180 to before 5.10.210; 5.15.111 to before 5.15.190; 6.1.28 to before 6.1.149; 6.2.15 to before 6.3 Fixed in 5.10.210, 5.15.190, 6.1.149, 6.3 Patch available CNA
- Linux VendorLinux Affected 6.3 and later Fixed in 5.10.210, 5.15.190, 6.1.149, 6.6.101, 6.12.41, 6.15.9, 6.16 Patch available CNA
CPE configurations NVD · 9
| CPE | Versions | Role | Vendor |
|---|---|---|---|
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.10.180 to before 5.10.210; 5.15.111 to before 5.15.190; 6.1.28 to before 6.1.149; 6.2.15 to before 6.6.101; 6.7 to before 6.12.41; 6.13 to before 6.15.9 | Vulnerable | Linux |
| cpe:2.3:o:linux:linux_kernel:6.16:rc1:*:*:*:*:*:* | 6.16 rc1 | Vulnerable | Linux |
| cpe:2.3:o:linux:linux_kernel:6.16:rc2:*:*:*:*:*:* | 6.16 rc2 | Vulnerable | Linux |
| cpe:2.3:o:linux:linux_kernel:6.16:rc3:*:*:*:*:*:* | 6.16 rc3 | Vulnerable | Linux |
| cpe:2.3:o:linux:linux_kernel:6.16:rc4:*:*:*:*:*:* | 6.16 rc4 | Vulnerable | Linux |
| cpe:2.3:o:linux:linux_kernel:6.16:rc5:*:*:*:*:*:* | 6.16 rc5 | Vulnerable | Linux |
| cpe:2.3:o:linux:linux_kernel:6.16:rc6:*:*:*:*:*:* | 6.16 rc6 | Vulnerable | Linux |
| cpe:2.3:o:linux:linux_kernel:6.16:rc7:*:*:*:*:*:* | 6.16 rc7 | Vulnerable | Linux |
| cpe:2.3:o:debian:debian_linux:11.0:*:*:*:*:*:*:* | 11.0 | Vulnerable | Debian |
- cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* Versions 5.10.180 to before 5.10.210; 5.15.111 to before 5.15.190; 6.1.28 to before 6.1.149; 6.2.15 to before 6.6.101; 6.7 to before 6.12.41; 6.13 to before 6.15.9 Vulnerable ·Linux
- cpe:2.3:o:linux:linux_kernel:6.16:rc1:*:*:*:*:*:* Versions 6.16 rc1 Vulnerable ·Linux
- cpe:2.3:o:linux:linux_kernel:6.16:rc2:*:*:*:*:*:* Versions 6.16 rc2 Vulnerable ·Linux
- cpe:2.3:o:linux:linux_kernel:6.16:rc3:*:*:*:*:*:* Versions 6.16 rc3 Vulnerable ·Linux
- cpe:2.3:o:linux:linux_kernel:6.16:rc4:*:*:*:*:*:* Versions 6.16 rc4 Vulnerable ·Linux
- cpe:2.3:o:linux:linux_kernel:6.16:rc5:*:*:*:*:*:* Versions 6.16 rc5 Vulnerable ·Linux
- cpe:2.3:o:linux:linux_kernel:6.16:rc6:*:*:*:*:*:* Versions 6.16 rc6 Vulnerable ·Linux
- cpe:2.3:o:linux:linux_kernel:6.16:rc7:*:*:*:*:*:* Versions 6.16 rc7 Vulnerable ·Linux
- cpe:2.3:o:debian:debian_linux:11.0:*:*:*:*:*:*:* Versions 11.0 Vulnerable ·Debian
Remediation
- Fix · CNA Linux (Linux) Fixed in 5.10.210, 5.15.190, 6.1.149, 6.3
- Fix · CNA Linux (Linux) Fixed in 5.10.210, 5.15.190, 6.1.149, 6.6.101, 6.12.41, 6.15.9, 6.16
Vendor assessments
Red Hat
Red Hat rating: Low. Red Hat's page for this CVE →
Not affected: 5 products
- Red Hat Enterprise Linux 10
- Red Hat Enterprise Linux 6
- Red Hat Enterprise Linux 7
- Red Hat Enterprise Linux 8
- Red Hat Enterprise Linux 9
Timeline
- 2026-10-02 Threatist record created from CVE-2025-38670
- 2026-10-03 Alias added: GHSA-6v6p-g835-47x6
- 2026-11-07 Affected versions changed · Red Hat
References
Patch 7
- https://git.kernel.org/stable/c/f7e0231eeaa33245c649fac0303cf97209605446
- https://git.kernel.org/stable/c/407047893a64399f2d2390ff35cc6061107d805d
- https://git.kernel.org/stable/c/a6b0cb523eaa01efe8a3f76ced493ba60674c6e6
- https://git.kernel.org/stable/c/9433a5f437b0948d6a2d8a02ad7a42ab7ca27a61
- https://git.kernel.org/stable/c/708fd522b86d2a9544c34ec6a86fa3fc23336525
- https://git.kernel.org/stable/c/0f67015d72627bad72da3c2084352e0aa134416b
- https://git.kernel.org/stable/c/d42e6c20de6192f8e4ab4cf10be8c694ef27e8cb
More Linux Kernel vulnerabilities
- TI-2025-26358 tls: fix handling of zero-length records on the rx_list KEVCVSS 3.1CRITICAL 9.8
- TI-2026-38352 netfilter: bridge: make ebt_snat ARP rewrite writable KEVCVSS 3.1HIGH 8.8
- TI-2013-05264 The (1) get_user and (2) put_user API functions in the Linux kernel before 3.5.5 on the… KEVCVSS 3.1HIGH 8.8
- TI-2022-00125 Integer overflow in kernel KEVCVSS 3.1HIGH 8.4
- TI-2013-01864 The perf_swevent_init function in kernel/events/core.c in the Linux kernel before 3.8.9… KEVCVSS 3.1HIGH 8.4
- TI-2021-05514 Heap Out-Of-Bounds Write in Netfilter IP6T_SO_SET_REPLACE KEVCVSS 3.1HIGH 8.3
Sources
- CVE-2025-38670 · CVE Program
- CVE-2025-38670 · NVD
- FIRST EPSS
- GHSA-6v6p-g835-47x6 · GitHub Advisory Database · CC BY 4.0
- CVE-2025-38670 · Red Hat security data · CC BY 4.0
This product uses the NVD API but is not endorsed or certified by the NVD. Sources and licences