Read the docs
TI-2021-22120 Aliases CVE-2021-47465GHSA-r7pj-34j8-6jgg

KVM: PPC: Book3S HV: Fix stack handling in idle_kvm_start_guest()

Priority LOW 31CWE-674Published · Updated

Key facts

Attack vector
Local
Privileges required
Low
User interaction
None
Attack complexity
Low
Impact type
Denial of service
Confidentiality · integrity · availability
None · High · High
Fix status
Partial Red Hat: 4 without a fix

Attack profile from CVSS 3.1 · CNA. Fix status from CNA and Red Hat. Impact type from CWE-674.

Summary

In the Linux kernel, the following vulnerability has been resolved: KVM: PPC: Book3S HV: Fix stack handling in idle_kvm_start_guest() In commit 10d91611f426 ("powerpc/64s: Reimplement book3s idle code in C") kvm_start_guest() became idle_kvm_start_guest(). The old code allocated a stack frame on the emergency stack, but didn't use the frame to store anything, and also didn't store anything in its caller's frame. idle_kvm_start_guest() on the other hand is written more like a normal C function, it creates a frame on entry, and also stores CR/LR into its callers frame (per the ABI). The problem is that there is no caller frame on the emergency stack. The emergency stack for a given CPU is allocated with: paca_ptrs[i]->emergency_sp = alloc_stack(limit, i) + THREAD_SIZE; So emergency_sp actually points to the first address above the emergency stack allocation for a given CPU, we must not store above it without first decrementing it to create a frame. This is different to the regular kernel stack, paca->kstack, which is initialised to point at an initial frame that is ready to use. idle_kvm_start_guest() stores the backchain, CR and LR all of which write outside the allocation for the emergency stack. It then creates a stack frame and saves the non-volatile registers. Unfortunately the frame it creates is not large enough to fit the non-volatiles, and so the saving of the non-volatile registers also writes outside the emergency stack allocation. The end result is that we corrupt whatever is at 0-24 bytes, and 112-248 bytes above the emergency stack allocation. In practice this has gone unnoticed because the memory immediately above the emergency stack happens to be used for other stack allocations, either another CPUs mc_emergency_sp or an IRQ stack. See the order of calls to irqstack_early_init() and emergency_stack_init(). The low addresses of another stack are the top of that stack, and so are only used if that stack is under extreme pressue, which essentially never happens in practice - and if it did there's a high likelyhood we'd crash due to that stack overflowing. Still, we shouldn't be corrupting someone else's stack, and it is purely luck that we aren't corrupting something else. To fix it we save CR/LR into the caller's frame using the existing r1 on entry, we then create a SWITCH_FRAME_SIZE frame (which has space for pt_regs) on the emergency stack with the backchain pointing to the existing stack, and then finally we switch to the new frame on the emergency stack.

Why it matters now

Exploitation None reported CISA SSVC · not in CISA KEV
EPSS 0.00224 13th percentileScored 2026-11-07
Fix Partial Linux (Linux): 5.4.156, 5.10.76, 5.14.15 +1Red Hat: 4 without a fix

SSVC decision points

CISA ADP · SSVC 2.0.3

Exploitation
None
Automatable
No
Technical impact
Partial

The decision (Track, Attend, Act) also depends on your mission and well-being impact; see CISA's SSVC guide.

Affected products

VendorProductAffected versionsFixed inStatusSource
LinuxLinux5.2 and later5.4.156, 5.10.76, 5.14.15, 5.15Patch availableCNA
  • Linux VendorLinux Affected 5.2 and later Fixed in 5.4.156, 5.10.76, 5.14.15, 5.15 Patch available CNA

CPE configurations NVD · 6

CPEVersionsRoleVendor
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*5.2 to before 5.4.156; 5.5 to before 5.10.76; 5.11 to before 5.14.15VulnerableLinux
cpe:2.3:o:linux:linux_kernel:5.15:rc1:*:*:*:*:*:*5.15 rc1VulnerableLinux
cpe:2.3:o:linux:linux_kernel:5.15:rc2:*:*:*:*:*:*5.15 rc2VulnerableLinux
cpe:2.3:o:linux:linux_kernel:5.15:rc3:*:*:*:*:*:*5.15 rc3VulnerableLinux
cpe:2.3:o:linux:linux_kernel:5.15:rc4:*:*:*:*:*:*5.15 rc4VulnerableLinux
cpe:2.3:o:linux:linux_kernel:5.15:rc5:*:*:*:*:*:*5.15 rc5VulnerableLinux
  • cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* Versions 5.2 to before 5.4.156; 5.5 to before 5.10.76; 5.11 to before 5.14.15 Vulnerable ·Linux
  • cpe:2.3:o:linux:linux_kernel:5.15:rc1:*:*:*:*:*:* Versions 5.15 rc1 Vulnerable ·Linux
  • cpe:2.3:o:linux:linux_kernel:5.15:rc2:*:*:*:*:*:* Versions 5.15 rc2 Vulnerable ·Linux
  • cpe:2.3:o:linux:linux_kernel:5.15:rc3:*:*:*:*:*:* Versions 5.15 rc3 Vulnerable ·Linux
  • cpe:2.3:o:linux:linux_kernel:5.15:rc4:*:*:*:*:*:* Versions 5.15 rc4 Vulnerable ·Linux
  • cpe:2.3:o:linux:linux_kernel:5.15:rc5:*:*:*:*:*:* Versions 5.15 rc5 Vulnerable ·Linux

Remediation

  • Fix · CNA Linux (Linux) Fixed in 5.4.156, 5.10.76, 5.14.15, 5.15

Vendor assessments

Red Hat

Red Hat rating: Moderate. Red Hat's page for this CVE →

ProductStatusPlan or fix
Red Hat Enterprise Linux 6AffectedNo fix planned: Out of support scope
Red Hat Enterprise Linux 7AffectedNo fix planned: Out of support scope
Red Hat Enterprise Linux 8AffectedNo fix planned: Will not fix
Red Hat Enterprise Linux 9AffectedNo fix planned: Will not fix
Not affected: 1 product
  • Red Hat Enterprise Linux 9

Timeline

  1. 2026-10-02 Threatist record created from CVE-2021-47465
  2. 2026-10-03 Alias added: GHSA-r7pj-34j8-6jgg

References

  • 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
See all 15278 →

Sources