CVE-2026-43448
Medium · 4.7CVSS
4.7
EPSS
0.1%
Published
May 8, 2026
CISA due date
—
Cloudanix analysis
A flaw in Linux systems using NVMe storage can cause storage or system instability when a rare timing bug is triggered by local activity.
- Exploitation
- Local Privilege
- Attacker needs
- Low Privilege
- Complexity
- High
- Impact
- Denial Of Service
- Component
- OS kernel
- Class
- Race Condition
- Remediation
- Patch
- Effort
- Medium
- Patch risk
- Low
What it actually does
This is a race condition in the Linux kernel NVMe PCI driver, specifically in nvme_poll_irqdisable(). The vulnerable code can call disable_irq() using one IRQ vector and later call enable_irq() using a different IRQ vector if a concurrent NVMe reset disables MSI-X in between those operations. That imbalance can trigger kernel IRQ management warnings and may destabilize NVMe I/O handling. The practical security impact is availability loss: under the right timing conditions, a local low-privileged attacker or workload capable of repeatedly stressing NVMe I/O and reset/timeout paths may cause kernel warnings, device instability, I/O disruption, or potentially a system crash. The flaw does not provide a direct confidentiality or integrity impact based on the available details.
Why it matters to the business
Systems using affected Linux kernels with NVMe PCI storage may experience storage instability or host availability issues if the race is triggered. For business operations, this can mean application outages, degraded service performance, failed jobs, filesystem or storage interruptions, and possible node reboots or crashes in environments that rely on local NVMe-backed workloads. The risk is lower than remotely exploitable vulnerabilities because exploitation requires local access and precise timing, EPSS is very low, and it is not listed in CISA KEV; however, production systems with untrusted local users, shared compute, CI runners, containers with access to storage stress paths, or high NVMe I/O churn should still prioritize kernel updates.
How an attack unfolds
An attacker first obtains local code execution with low privileges on a Linux system using an affected kernel and NVMe PCI storage. They then generate conditions that increase the likelihood of NVMe request timeouts, reset work, and polling activity occurring concurrently. The vulnerable path occurs when nvme_poll_irqdisable() disables an IRQ derived from pci_irq_vector(), while another kernel worker concurrently executes NVMe reset/disable logic and clears MSI-X state. When nvme_poll_irqdisable() later re-queries pci_irq_vector(), it may receive a different IRQ number and call enable_irq() on an IRQ that was not previously disabled by that path. This can produce an "Unbalanced enable for IRQ" kernel warning and may destabilize IRQ accounting for the device. Repeated triggering can result in NVMe I/O disruption or broader host availability impact. There is no indication that this vulnerability enables privilege escalation, data theft, or remote compromise by itself.
How to fix it
Apply a Linux kernel update from the operating system or kernel vendor that includes the nvme-pci fix for the race in nvme_poll_irqdisable(). The corrected implementation stores the IRQ number in a local variable so disable_irq() and enable_irq() operate on the same IRQ value even if NVMe reset logic changes MSI-X state concurrently. No exact fixed package versions were provided in the input, so use the latest vendor-supported kernel for the affected distribution or kernel branch and verify that the relevant NVMe PCI driver patch is included. If immediate patching is not possible, reduce exposure by limiting local shell access to trusted users, restricting untrusted workloads on systems with NVMe devices, avoiding unnecessary direct hardware access from containers or guests, and monitoring for NVMe timeout/reset instability. For high-availability services, schedule rolling kernel updates and reboots to avoid extended downtime.
How to confirm the fix worked
Confirm exposure by checking whether systems run an affected Linux kernel build and use the NVMe PCI driver. Validate remediation by confirming the installed kernel package or running kernel includes the vendor fix for the nvme_poll_irqdisable() IRQ race, then reboot into the patched kernel. After remediation, review kernel logs during NVMe stress or normal production load and confirm that warnings such as "Unbalanced enable for IRQ" no longer occur in the NVMe timeout/reset path. Useful validation commands include checking the running kernel with uname -a, checking loaded NVMe modules with lsmod or modinfo nvme and modinfo nvme_core, reviewing package changelogs for the NVMe PCI patch, and searching dmesg/journal logs for NVMe timeout, reset, and IRQ warning messages.
Typical attack path
- Gain local access to a Linux system running an affected kernel with NVMe PCI storage.
- Run workloads that heavily stress NVMe I/O queues and increase request timeout activity.
- Attempt to induce or coincide with NVMe reset/disable behavior while polling IRQ disable logic is active.
- Trigger the race where disable_irq() and enable_irq() operate on different IRQ numbers because MSI-X state changes concurrently.
- Cause kernel IRQ warnings, NVMe device instability, I/O disruption, or potential system availability degradation.
How to detect it
To determine whether this issue may have already been triggered, review kernel logs from dmesg, journald, syslog, kern.log, crash dumps, and monitoring telemetry for IRQ imbalance warnings associated with NVMe timeout or reset activity. Key artifacts include "Unbalanced enable for IRQ" warnings, stack traces involving __enable_irq(), enable_irq(), nvme_poll_irqdisable(), nvme_timeout(), nvme_reset_work(), nvme_dev_disable(), blk_mq_timeout_work(), and repeated NVMe controller resets or I/O timeouts. Because this vulnerability is a race condition and not known to drop files, open network connections, create users, or leave conventional malware indicators, detection is primarily behavioral and log-based. Investigate any correlated local workload activity around the same time, especially storage stress tools, high-rate NVMe I/O, repeated device resets, or containers/jobs that triggered abnormal block-layer timeout activity. Absence of these log messages does not prove the system was never exposed, but their presence on an affected kernel is a strong signal that the vulnerable condition or a closely related NVMe IRQ handling fault occurred.
- Unbalanced enable for IRQ
- WARNING: kernel/irq/manage.c:753
- __enable_irq+
- enable_irq+
- nvme_poll_irqdisable
- nvme_timeout
- nvme_reset_work
- nvme_dev_disable
- blk_mq_timeout_work
- blk_mq_rq_timed_out
- blk_mq_handle_expired
- Workqueue: kblockd blk_mq_timeout_work
- drivers/nvme/host/pci.c
- pdev->msix_enabled = 0
- nvme-pci
- I/O timeout
- reset controller
- Abort status
What your security team should do
- Prioritize kernel updates on systems that combine affected Linux kernels, NVMe PCI storage, and untrusted or semi-trusted local workloads.
- Inventory Linux hosts using NVMe PCI devices and correlate them with running kernel versions and vendor patch status.
- Monitor kernel logs for IRQ imbalance warnings and NVMe timeout/reset activity, especially on systems reporting unexplained I/O stalls or reboots.
- Restrict local access and untrusted workload execution on vulnerable systems until patched, particularly in shared compute, CI/CD, hosting, and multi-user environments.
- Do not treat this as a likely remote compromise vector; focus response on availability risk, kernel stability, and operational resilience.
- After patching, reboot systems into the fixed kernel and verify that older vulnerable kernels are not still selected by the bootloader.
- For critical services, use rolling updates, workload evacuation, and storage redundancy to reduce outage risk during remediation.
The record
In the Linux kernel, the following vulnerability has been resolved: nvme-pci: Fix race bug in nvme_poll_irqdisable() In the following scenario, pdev can be disabled between (1) and (3) by (2). This sets pdev->msix_enabled = 0. Then, pci_irq_vector() will return MSI-X IRQ(>15) for (1) whereas return INTx IRQ(<=15) for (2). This causes IRQ warning because it tries to enable INTx IRQ that has never been disabled before. To fix this, save IRQ number into a local variable and ensure disable_irq() and enable_irq() operate on the same IRQ number. Even if pci_free_irq_vectors() frees the IRQ concurrently, disable_irq() and enable_irq() on a stale IRQ number is still valid and safe, and the depth accounting reamins balanced. task 1: nvme_poll_irqdisable() disable_irq(pci_irq_vector(pdev, nvmeq->cq_vector)) ...(1) enable_irq(pci_irq_vector(pdev, nvmeq->cq_vector)) ...(3) task 2: nvme_reset_work() nvme_dev_disable() pdev->msix_enable = 0; ...(2) crash log: ------------[ cut here ]------------ Unbalanced enable for IRQ 10 WARNING: kernel/irq/manage.c:753 at __enable_irq+0x102/0x190 kernel/irq/manage.c:753, CPU#1: kworker/1:0H/26 Modules linked in: CPU: 1 UID: 0 PID: 26 Comm: kworker/1:0H Not tainted 6.19.0-dirty #9 PREEMPT(voluntary) Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org 04/01/2014 Workqueue: kblockd blk_mq_timeout_work RIP: 0010:__enable_irq+0x107/0x190 kernel/irq/manage.c:753 Code: ff df 48 89 fa 48 c1 ea 03 0f b6 14 02 48 89 f8 83 e0 07 83 c0 03 38 d0 7c 04 84 d2 75 79 48 8d 3d 2e 7a 3f 05 41 8b 74 24 2c <67> 48 0f b9 3a e8 ef b9 21 00 5b 41 5c 5d e9 46 54 66 03 e8 e1 b9 RSP: 0018:ffffc900001bf550 EFLAGS: 00010046 RAX: 0000000000000007 RBX: 0000000000000000 RCX: ffffffffb20c0e90 RDX: 0000000000000000 RSI: 000000000000000a RDI: ffffffffb74b88f0 RBP: ffffc900001bf560 R08: ffff88800197cf00 R09: 0000000000000001 R10: 0000000000000003 R11: 0000000000000003 R12: ffff8880012a6000 R13: 1ffff92000037eae R14: 000000000000000a R15: 0000000000000293 FS: 0000000000000000(0000) GS:ffff8880b49f7000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000555da4a25fa8 CR3: 00000000208e8000 CR4: 00000000000006f0 Call Trace: <TASK> enable_irq+0x121/0x1e0 kernel/irq/manage.c:797 nvme_poll_irqdisable+0x162/0x1c0 drivers/nvme/host/pci.c:1494 nvme_timeout+0x965/0x14b0 drivers/nvme/host/pci.c:1744 blk_mq_rq_timed_out block/blk-mq.c:1653 [inline] blk_mq_handle_expired+0x227/0x2d0 block/blk-mq.c:1721 bt_iter+0x2fc/0x3a0 block/blk-mq-tag.c:292 __sbitmap_for_each_set include/linux/sbitmap.h:269 [inline] sbitmap_for_each_set include/linux/sbitmap.h:290 [inline] bt_for_each block/blk-mq-tag.c:324 [inline] blk_mq_queue_tag_busy_iter+0x969/0x1e80 block/blk-mq-tag.c:536 blk_mq_timeout_work+0x627/0x870 block/blk-mq.c:1763 process_one_work+0x956/0x1aa0 kernel/workqueue.c:3257 process_scheduled_works kernel/workqueue.c:3340 [inline] worker_thread+0x65c/0xe60 kernel/workqueue.c:3421 kthread+0x41a/0x930 kernel/kthread.c:463 ret_from_fork+0x6f8/0x8c0 arch/x86/kernel/process.c:158 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:246 </TASK> irq event stamp: 74478 hardirqs last enabled at (74477): [<ffffffffb5720a9c>] __raw_spin_unlock_irq include/linux/spinlock_api_smp.h:159 [inline] hardirqs last enabled at (74477): [<ffffffffb5720a9c>] _raw_spin_unlock_irq+0x2c/0x60 kernel/locking/spinlock.c:202 hardirqs last disabled at (74478): [<ffffffffb57207b5>] __raw_spin_lock_irqsave include/linux/spinlock_api_smp.h:108 [inline] hardirqs last disabled at (74478): [<ffffffffb57207b5>] _raw_spin_lock_irqsave+0x85/0xa0 kernel/locking/spinlock.c:162 softirqs last enabled at (74304): [<ffffffffb1e9466c>] __do_softirq kernel/softirq.c:656 [inline] softirqs last enabled at (74304): [<ffffffffb1e9466c>] invoke_softirq kernel/softirq.c:496 [inline] softirqs last enabled at (74304): [<ffffffffb1e9466c>] __irq_exit_rcu+0xdc/0x120 ---truncated---
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|
Related vulnerabilities
- CVE-2026-114641 Traefik 2.11.x before 2.11.58 and 3.x before 3.7.14 contains a race condition in NTLM and… CWE-362
- CVE-2026-109279 ImageMagick before 6.9.13-57 and 7.x before 7.1.2-32 lacks proper synchronization when… CWE-362
- CVE-2026-97032 HTTP/2 servers could end up crashing due to inadvertently modifying its HPACK encoder… CWE-362
- CVE-2026-98163 In the Linux kernel, the following vulnerability has been resolved: cgroup: Avoid… CWE-362
- CVE-2026-98146 In the Linux kernel, the following vulnerability has been resolved: accel/amdxdna: Remove… CWE-362
- CVE-2026-98153 In the Linux kernel, the following vulnerability has been resolved: nvme: fix racy access… CWE-362
- CVE-2026-98130 In the Linux kernel, the following vulnerability has been resolved: sctp: fix a TOCTOU… CWE-362
- CVE-2026-98115 In the Linux kernel, the following vulnerability has been resolved: ksmbd: safely drain… CWE-362