UBUNTU-CVE-2026-97603: High severity ubuntu/linux-hwe-edge vulnerability
In the Linux kernel, the following vulnerability has been resolved: idpf: disable DIM work before freeing qvectors idpf never drains the Tx/Rx DIM works before freeing the memory they live in. txdim and rxdim are embedded in struct idpfqvector, they are queued from the NAPI poll via netdim(), and idpfvportintrrel() ends with kfree(rsrc->qvectors). Nothing in the driver cancels them. idpftxdimwork() and idpfrxdimwork() then run on freed memory: idpfvportintrwriteitr() writes the ITR register through qvector->intrreg.txitr / rxitr, void iomem pointers loaded out of the freed qvector. No configuration is needed to get there -- IDPFITRISDYNAMIC() is defined as (itrmode) and idpfvportalloc() initialises both modes to IDPFITRDYNAMIC. Draining after idpfvportintrnapidisall() is not enough on its own. idpfnetdim() is called from inside the "if (napicompletedone(napi, workdone))" branch of the poll, and napicompletedone() has already cleared NAPIFSTATESCHED by then. napidisablelocked() waits only while (val & (NAPIFSTATESCHED | NAPIFSTATENPSVC)), so napidisable() can return while the poll tail is still queueing the work, and a plain cancelworksync() would be re-armed behind the drain. Use disableworksync(): schedulework() on a work with a non-zero disable count is dropped by clearpendingifdisabled() before queuework() is reached. Move idpfinitdim() to idpfvportintralloc() so the works are initialised on every path that can reach the drain -- the three "goto intrdeinit" sites between idpfvportintrinit() and idpfvportintrena() get there without the enable side having run. Nothing re-enables them: rsrc->qvectors is freed on every exit from idpfvportopen() and on every idpfvportstop(), so the count dies with the object. It is a race, not a deterministic failure -- netdim() only schedules once DIMNEVENTS events have accumulated and the profile index changes. A KASAN ifup/ifdown loop under load is the way to see it.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
ubuntu/linux-hwe-7.0to a version that resolves this vulnerability.Fixed in 7.0.0-42.42~24.04.1 - Upgrade
Upgrade
ubuntu/linux-riscv-7.0to a version that resolves this vulnerability.Fixed in 7.0.0-42.42.1~24.04.1 - Upgrade
Upgrade
ubuntu/linuxto a version that resolves this vulnerability.Fixed in 7.0.0-42.42 - Upgrade
Upgrade
ubuntu/linux-awsto a version that resolves this vulnerability.Fixed in 7.0.0-1016.17 - Upgrade
Upgrade
ubuntu/linux-gcpto a version that resolves this vulnerability.Fixed in 7.0.0-1016.18 - Upgrade
Upgrade
ubuntu/linux-ibmto a version that resolves this vulnerability.Fixed in 7.0.0-1017.17 - Upgrade
Upgrade
ubuntu/linux-oem-7.0to a version that resolves this vulnerability.Fixed in 7.0.0-1017.17 - Upgrade
Upgrade
ubuntu/linux-oracleto a version that resolves this vulnerability.Fixed in 7.0.0-1015.16 - Upgrade
Upgrade
ubuntu/linux-riscvto a version that resolves this vulnerability.Fixed in 7.0.0-42.42.1 - Compensating control
Call disable_work_sync() for the Tx and Rx DIM work items in each q_vector before freeing rsrc->q_vectors; use it instead of plain cancel_work_sync() so work cannot be re-armed after the drain.
- Compensating control
Move idpf_init_dim() into idpf_vport_intr_alloc() so DIM work items are initialized on every path that can reach the drain, including paths that do not execute the enable side.
Event History
Frequently Asked Questions
Is the vulnerable behavior enabled by default?
Yes. Both interrupt moderation modes are initialized to dynamic mode, and the described condition does not require additional configuration.
What level of access does exploitation require?
The supplied CVSS vector indicates local access and high privileges are required. It also indicates no user interaction is required, with an additional attack requirement present.
Which Ubuntu kernel packages are identified as affected?
The listed packages are linux-gcp, linux-gke, linux-riscv, linux-realtime, linux-azure, linux-azure-fde, linux-hwe-edge, linux-gkeop.