CVE-2026-90429
High · 7.8CVSS
7.8
EPSS
0.2%
Published
Sep 17, 2026
CISA due date
—
Cloudanix analysis
A timing flaw in how the Linux kernel manages certain hardware interfaces can let a local user crash the machine or gain higher access rights.
- Exploitation
- Local Privilege
- Attacker needs
- Low Privilege
- Complexity
- Moderate
- Impact
- Full Compromise
- Component
- OS kernel
- Class
- Race Condition
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
Race condition in tegra241_cmdqv allows concurrent VINTF deinit and error ISR execution, resulting in NULL pointer dereference, use-after-free, or access to partially initialized VINTF structures due to missing memory barriers and slot synchronization.
Why it matters to the business
Local attackers on affected systems can trigger kernel crashes or escalate privileges, leading to denial of service, data exposure, or full host compromise on Linux systems using the Tegra241 IOMMU driver; urgency is low given absent exploitation in the wild.
How an attack unfolds
An attacker with local access triggers repeated VINTF allocation, deallocation, and error interrupt conditions to race the deinit path against the ISR, causing the handler to dereference freed or uninitialized memory slots.
How to fix it
Update the Linux kernel to a version containing the fix that replaces plain stores with smp_store_release, adds smp_load_acquire plus NULL checks in the ISR, clears slots before returning IDs to the IDA, and calls synchronize_irq before teardown.
How to confirm the fix worked
Inspect kernel source for smp_load_acquire on vintfs[] reads inside the ISR under NULL checks, confirm synchronize_irq before IDA return in deinit, and verify VINTF0 slot initialization ordering.
Typical attack path
- Obtain local unprivileged access to a vulnerable Linux kernel
- Exercise IOMMU VINTF create/destroy operations while inducing error interrupts
- Trigger the race window in tegra241_cmdqv_deinit_vintf versus tegra241_cmdqv_isr
- Achieve NULL dereference, use-after-free, or stale VINTF access for privilege escalation or DoS
How to detect it
Search kernel logs and crash dumps for NULL pointer dereferences or use-after-free reports originating from tegra241_cmdqv_isr or tegra241_cmdqv_deinit_vintf; correlate with IOMMU VINTF allocation activity.
What your security team should do
- Prioritize kernel updates on systems exposing the tegra241_cmdqv driver
- Monitor vendor or distribution advisories for backported fixes
- Restrict unprivileged local access where possible until patched
- Review IOMMU-related crash reports for signs of this race
The record
In the Linux kernel, the following vulnerability has been resolved: iommu/tegra241-cmdqv: Synchronize the error ISR against VINTF (de)init A user VINTF is torn down by tegra241_cmdqv_deinit_vintf(), which runs from the destroy callback and from the init-failure unwind in the alloc handler. It clears the cmdqv->vintfs[] slot and lets the iommufd core free it, but nothing serializes that against the error interrupt: tegra241_cmdqv_isr() reads cmdqv->vintfs[idx] and dereferences the vintf. A concurrent error can make the ISR read a slot mid-clear (a NULL deref) or use a vintf which is about to be freed (a use-after-free). deinit_vintf() also returns idx to the IDA before clearing the slot, so a concurrent create that reuses idx can publish its new vintf into the slot, only for this teardown to erase it again with the stale NULL store. On the other end, tegra241_cmdqv_init_vintf() publishes a new vintf with a plain store to the cmdqv->vintfs[] slot, and the ISR dereferences fields of a published vintf such as vintf->base. A plain store gives no ordering on a weakly-ordered CPU, and a stale VINTF_ERR_MAP bit on a reused idx can make the ISR pick a vintf the moment it is published, before its fields are set or tegra241_vintf_hw_init() runs. The cmdqv->vintfs[0] slot stays NULL until tegra241_cmdqv_init_structures() first creates VINTF0, so the slot 0 read needs the same NULL check. Publish every slot with an smp_store_release(), and read each slot in the ISR with an smp_load_acquire() under a NULL check, so the ISR always sees a fully built vintf or NULL. Also make deinit_vintf() clear the slot, and synchronize_irq() prior to returning idx to the IDA, so no vintf is freed under a running handler and no reused idx is clobbered.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|