CVE-2026-45904
Medium · 5.5CVSS
5.5
EPSS
0.2%
Published
May 27, 2026
CISA due date
—
Cloudanix analysis
A Linux kernel bug on some PowerPC systems can make hardware devices stop recovering properly after errors, potentially interrupting important services.
- Exploitation
- Local Privilege
- Attacker needs
- Low Privilege
- Complexity
- Moderate
- Impact
- Denial Of Service
- Component
- OS kernel
- Class
- Denial of service
- Remediation
- Patch
- Effort
- Medium
- Patch risk
- Medium
What it actually does
This is a Linux kernel availability flaw in the PowerPC EEH PCI error-handling path. A locking change caused eeh_handle_normal_event() to acquire pci_rescan_remove_lock and then call code that attempts to acquire the same lock again, producing recursive mutex acquisition and potential deadlock in the EEH daemon path. When triggered, PCI error recovery, device removal/rescan handling, or EEH event processing can stall, potentially leaving affected PCI devices unusable and degrading or halting services that depend on them. The issue is architecture- and subsystem-specific: it primarily affects Linux kernel builds running on PowerPC systems using EEH/PCI error handling.
Why it matters to the business
Successful exploitation can cause denial of service on affected PowerPC Linux systems by disrupting PCI device error handling and recovery. The most likely operational consequence is loss or instability of hardware-backed services such as storage, networking, accelerators, or other PCI-attached devices, which can lead to workload interruption or system unavailability. The vulnerability is not known to be in CISA KEV, is not reported as ransomware-used, has very low EPSS, and has no known public exploit maturity in the supplied data, so urgency is lower than internet-facing remote-code-execution issues; however, critical PowerPC systems with untrusted local users, PCI passthrough, or exposed device-management capabilities should still prioritize kernel updates.
How an attack unfolds
An attacker needs local access or a way to influence PCI/EEH event generation on an affected PowerPC Linux system. They attempt to trigger a PCI error, hotplug, removal/rescan, or EEH recovery path that causes the kernel EEH event handler to process a normal EEH event. In the vulnerable code path, the handler acquires pci_rescan_remove_lock and then reaches eeh_pe_bus_get(), which attempts to acquire the same lock again. Because the same task already holds the mutex, the kernel can deadlock or emit lockdep recursive-locking warnings. The result is disrupted EEH processing and possible failure of PCI recovery/removal operations, causing device loss, degraded service, or host-level availability impact. There is no indication from the supplied data that this enables privilege escalation, data theft, or remote compromise.
How to fix it
Upgrade to a Linux kernel version from the relevant distribution or upstream stable branch that includes the fix for the PowerPC EEH recursive pci_lock_rescan_remove locking issue. The corrected implementation avoids nested acquisition by using a no-lock wrapper where the caller already holds pci_rescan_remove_lock and restores lock acquisition to the correct scope around affected PCI device iteration/removal. No exact fixed package versions were provided, so use vendor advisories for the deployed distribution and kernel branch. If immediate patching is not possible, reduce exposure by limiting local shell access, restricting access to device-management interfaces, avoiding untrusted PCI passthrough on affected PowerPC systems, and monitoring for EEH/PCI recovery failures. Mitigations do not fully remove the risk because the flaw is in kernel synchronization logic.
How to confirm the fix worked
Confirm that affected systems are PowerPC Linux hosts using EEH-capable PCI hardware and a kernel version containing the vulnerable change. Validate remediation by checking the installed kernel package against the distribution advisory or upstream commit that fixes the EEH locking behavior. After patching and rebooting into the fixed kernel, exercise PCI error recovery or controlled hotplug/rescan workflows where safe and verify that no recursive-locking warnings, eehd stalls, or pci_rescan_remove_lock deadlock messages appear in kernel logs. Also confirm that PCI devices recover normally after EEH events and that the running kernel, not only the installed package, is updated.
Typical attack path
- Obtain local low-privileged access to an affected PowerPC Linux system, or gain control over a PCI device or passthrough path capable of provoking EEH events.
- Identify that the host uses the vulnerable Linux kernel code path for PowerPC EEH PCI error handling.
- Trigger PCI error recovery, hotplug, remove/rescan, or another event that causes eeh_handle_normal_event() to execute.
- Cause the EEH handler to acquire pci_rescan_remove_lock and then re-enter code that attempts to acquire the same lock through eeh_pe_bus_get().
- Induce lock contention or deadlock in the eehd/kernel path, disrupting EEH event handling and PCI device recovery.
- Leverage the resulting device or subsystem unavailability to interrupt dependent workloads or services.
How to detect it
Look for evidence of kernel recursive-locking warnings, eehd stalls, PCI EEH recovery failures, or device remove/rescan hangs on affected PowerPC hosts. Primary log sources are the kernel ring buffer, system journal, /var/log/kern.log, /var/log/messages, console logs, crash dumps, and monitoring alerts for PCI device loss. Search for lockdep output indicating possible recursive locking involving pci_rescan_remove_lock, especially with the eehd process and stack frames containing pci_lock_rescan_remove(), eeh_pe_bus_get(), or eeh_handle_normal_event(). Also review timelines for unexplained PCI device disappearances, failed hotplug/removal operations, repeated EEH events, storage path loss, network adapter resets, or workloads becoming unavailable immediately after PCI/EEH errors. Because this is a denial-of-service synchronization bug, there may be no attacker-specific artifact; detection is based on kernel behavior, local user activity around device-management operations, and correlation with service impact.
- WARNING: possible recursive locking detected
- *** DEADLOCK ***
- pci_rescan_remove_lock
- pci_lock_rescan_remove
- eeh_pe_bus_get
- eeh_handle_normal_event
- eehd/
- Comm: eehd
- powerpc/eeh
- EEH event
- broken PCI error reporting
- recursive pci_lock_rescan_remove locking
- /var/log/kern.log
- /var/log/messages
What your security team should do
- Inventory PowerPC Linux systems, especially IBM Power/pSeries environments, and identify kernels that include the affected EEH locking change.
- Prioritize patching systems that host critical workloads, use PCI passthrough, rely on storage/network PCI devices, or allow untrusted local users.
- Apply vendor-provided kernel updates and reboot into the fixed kernel; live patching may not be sufficient unless the vendor explicitly covers this synchronization fix.
- Until patched, restrict local access and device-control capabilities that could trigger PCI rescan, hotplug, or EEH recovery paths.
- Add monitoring for kernel lockdep warnings and EEH/PCI recovery failures on PowerPC hosts.
- Review recent outages or PCI device resets on affected systems for signs of recursive locking or eehd deadlock behavior.
- If recurring EEH failures are observed, collect kernel logs, dmesg output, kernel version, platform model, and PCI topology before remediation for incident review and vendor support.
The record
In the Linux kernel, the following vulnerability has been resolved: powerpc/eeh: fix recursive pci_lock_rescan_remove locking in EEH event handling The recent commit 1010b4c012b0 ("powerpc/eeh: Make EEH driver device hotplug safe") restructured the EEH driver to improve synchronization with the PCI hotplug layer. However, it inadvertently moved pci_lock_rescan_remove() outside its intended scope in eeh_handle_normal_event(), leading to broken PCI error reporting and improper EEH event triggering. Specifically, eeh_handle_normal_event() acquired pci_lock_rescan_remove() before calling eeh_pe_bus_get(), but eeh_pe_bus_get() itself attempts to acquire the same lock internally, causing nested locking and disrupting normal EEH event handling paths. This patch adds a boolean parameter do_lock to _eeh_pe_bus_get(), with two public wrappers: eeh_pe_bus_get() with locking enabled. eeh_pe_bus_get_nolock() that skips locking. Callers that already hold pci_lock_rescan_remove() now use eeh_pe_bus_get_nolock() to avoid recursive lock acquisition. Additionally, pci_lock_rescan_remove() calls are restored to the correct position—after eeh_pe_bus_get() and immediately before iterating affected PEs and devices. This ensures EEH-triggered PCI removes occur under proper bus rescan locking without recursive lock contention. The eeh_pe_loc_get() function has been split into two functions: eeh_pe_loc_get(struct eeh_pe *pe) which retrieves the loc for given PE. eeh_pe_loc_get_bus(struct pci_bus *bus) which retrieves the location code for given bus. This resolves lockdep warnings such as: <snip> [ 84.964298] [ T928] ============================================ [ 84.964304] [ T928] WARNING: possible recursive locking detected [ 84.964311] [ T928] 6.18.0-rc3 #51 Not tainted [ 84.964315] [ T928] -------------------------------------------- [ 84.964320] [ T928] eehd/928 is trying to acquire lock: [ 84.964324] [ T928] c000000003b29d58 (pci_rescan_remove_lock){+.+.}-{3:3}, at: pci_lock_rescan_remove+0x28/0x40 [ 84.964342] [ T928] but task is already holding lock: [ 84.964347] [ T928] c000000003b29d58 (pci_rescan_remove_lock){+.+.}-{3:3}, at: pci_lock_rescan_remove+0x28/0x40 [ 84.964357] [ T928] other info that might help us debug this: [ 84.964363] [ T928] Possible unsafe locking scenario: [ 84.964367] [ T928] CPU0 [ 84.964370] [ T928] ---- [ 84.964373] [ T928] lock(pci_rescan_remove_lock); [ 84.964378] [ T928] lock(pci_rescan_remove_lock); [ 84.964383] [ T928] *** DEADLOCK *** [ 84.964388] [ T928] May be due to missing lock nesting notation [ 84.964393] [ T928] 1 lock held by eehd/928: [ 84.964397] [ T928] #0: c000000003b29d58 (pci_rescan_remove_lock){+.+.}-{3:3}, at: pci_lock_rescan_remove+0x28/0x40 [ 84.964408] [ T928] stack backtrace: [ 84.964414] [ T928] CPU: 2 UID: 0 PID: 928 Comm: eehd Not tainted 6.18.0-rc3 #51 VOLUNTARY [ 84.964417] [ T928] Hardware name: IBM,9080-HEX POWER10 (architected) 0x800200 0xf000006 of:IBM,FW1060.00 (NH1060_022) hv:phyp pSeries [ 84.964419] [ T928] Call Trace: [ 84.964420] [ T928] [c0000011a7157990] [c000000001705de4] dump_stack_lvl+0xc8/0x130 (unreliable) [ 84.964424] [ T928] [c0000011a71579d0] [c0000000002f66e0] print_deadlock_bug+0x430/0x440 [ 84.964428] [ T928] [c0000011a7157a70] [c0000000002fd0c0] __lock_acquire+0x1530/0x2d80 [ 84.964431] [ T928] [c0000011a7157ba0] [c0000000002fea54] lock_acquire+0x144/0x410 [ 84.964433] [ T928] [c0000011a7157cb0] [c0000011a7157cb0] __mutex_lock+0xf4/0x1050 [ 84.964436] [ T928] [c0000011a7157e00] [c000000000de21d8] pci_lock_rescan_remove+0x28/0x40 [ 84.964439] [ T928] [c0000011a7157e20] [c00000000004ed98] eeh_pe_bus_get+0x48/0xc0 [ 84.964442] [ T928] [c0000011a7157e50] [c00000 ---truncated---
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|
Related vulnerabilities
- CVE-2026-62303 Pistache is a high-performance REST toolkit written in C++. CWE-674
- CVE-2026-61847 Crass is a Ruby CSS parser that's fully compliant with the CSS Syntax Level 3… CWE-674
- CVE-2026-61846 Crass is a Ruby CSS parser that's fully compliant with the CSS Syntax Level 3… CWE-674
- CVE-2026-119762 Axigen Mail Server before 10.5.69, 10.6.x before 10.6.40, and 10.7.x before 10.7.2… CWE-674
- CVE-2026-119542 A flaw was found in the Ickle query parser in Infinispan. CWE-674
- CVE-2026-119591 SQLite before 3.54.0 contains a stack exhaustion vulnerability in… CWE-674
- CVE-2026-119376 SQLite before 3.54.0 contains a stack exhaustion vulnerability that allows attackers to… CWE-674
- CVE-2026-119371 SQLite before 3.54.0 contains a stack exhaustion vulnerability that allows attackers to… CWE-674