CVE-2026-97603
Received Received - Intake

Race Condition in Linux Kernel idpf Driver Leading to Use-After-Free

Vulnerability report for CVE-2026-97603, including description, CVSS score, EPSS score, affected products, exploitability, helpful resources, and attack-flow context.

Publication date: 2026-09-25

Last updated on: 2026-09-25

Assigner: kernel.org

Description

In the Linux kernel, the following vulnerability has been resolved: idpf: disable DIM work before freeing q_vectors idpf never drains the Tx/Rx DIM works before freeing the memory they live in. tx_dim and rx_dim are embedded in struct idpf_q_vector, they are queued from the NAPI poll via net_dim(), and idpf_vport_intr_rel() ends with kfree(rsrc->q_vectors). Nothing in the driver cancels them. idpf_tx_dim_work() and idpf_rx_dim_work() then run on freed memory: idpf_vport_intr_write_itr() writes the ITR register through q_vector->intr_reg.tx_itr / rx_itr, void __iomem pointers loaded out of the freed q_vector. No configuration is needed to get there -- IDPF_ITR_IS_DYNAMIC() is defined as (itr_mode) and idpf_vport_alloc() initialises both modes to IDPF_ITR_DYNAMIC. Draining after idpf_vport_intr_napi_dis_all() is not enough on its own. idpf_net_dim() is called from inside the "if (napi_complete_done(napi, work_done))" branch of the poll, and napi_complete_done() has already cleared NAPIF_STATE_SCHED by then. napi_disable_locked() waits only while (val & (NAPIF_STATE_SCHED | NAPIF_STATE_NPSVC)), so napi_disable() can return while the poll tail is still queueing the work, and a plain cancel_work_sync() would be re-armed behind the drain. Use disable_work_sync(): schedule_work() on a work with a non-zero disable count is dropped by clear_pending_if_disabled() before __queue_work() is reached. Move idpf_init_dim() to idpf_vport_intr_alloc() so the works are initialised on every path that can reach the drain -- the three "goto intr_deinit" sites between idpf_vport_intr_init() and idpf_vport_intr_ena() get there without the enable side having run. Nothing re-enables them: rsrc->q_vectors is freed on every exit from idpf_vport_open() and on every idpf_vport_stop(), so the count dies with the object. It is a race, not a deterministic failure -- net_dim() only schedules once DIM_NEVENTS events have accumulated and the profile index changes. A KASAN ifup/ifdown loop under load is the way to see it.

CVSS Scores

EPSS Scores

Probability:
Percentile:

Meta Information

Published
2026-09-25
Last Modified
2026-09-25
Generated
2026-09-25
AI Q&A
2026-09-25
EPSS Evaluated
N/A
NVD
EUVD

Affected Vendors & Products

Showing 1 associated CPE
Vendor Product Version / Range
intel idpf *

Helpful Resources

Exploitability

CWE
CWE Icon
KEV
KEV Icon
CWE ID Description
CWE-UNKNOWN

Attack-Flow Graph

AI Quick Actions

Instant insights powered by AI
Executive Summary

This is a race condition in the Linux kernel's idpf driver where the Dynamic Interrupt Moderation (DIM) work items are not properly canceled before freeing the memory they reside in. The issue occurs because idpf never drains the Tx/Rx DIM works before freeing q_vectors, which contain these work items. When the driver frees the memory, the DIM work functions may still attempt to access it, leading to use-after-free scenarios.

Detection Guidance

This is a race condition in the Linux kernel's idpf driver. Detection requires kernel address sanitizer (KASAN) and stress testing. Run a loop of interface up/down under load: while true; do ifdown eth0; ifup eth0; done. Monitor for crashes or KASAN reports indicating use-after-free in idpf_tx_dim_work or idpf_rx_dim_work.

Impact Analysis

This vulnerability can lead to system instability or crashes due to memory corruption when the DIM work functions access freed memory. It may also allow for potential privilege escalation if an attacker can trigger the race condition under specific conditions. The impact is most likely to be seen in systems using the idpf driver under heavy network load.

Mitigation Strategies

Apply the kernel patch that moves idpf_init_dim() to idpf_vport_intr_alloc() and uses disable_work_sync(). Update to a fixed kernel version. If immediate patching is not possible, disable DIM features in the idpf driver or avoid high-load scenarios until patched.

Chat Assistant

Ask questions about this CVE
Hi! I’m here to help you understand CVE-2026-97603. Ask me anything about the vulnerability, its impact, or mitigation strategies.
0/70

EPSS Chart