CVE-2026-14367: I3C IBI work-node free-list data race between ISR and workqueue thread
The I3C IBI subsystem in drivers/i3c/i3cibiworkq.c hands out statically-allocated work nodes through a free-list i3cibiworknodesfree implemented as a plain sysslistt, which provides no synchronization. The allocation helpers (i3cibiworkenqueue, i3cibiworkenqueuetargetirq, i3cibiworkenqueuehotjoin, i3cibiworkenqueuecontrollerrequest, i3cibiworkenqueuecb) called sysslistget() directly from ISR context, while the workqueue handler i3cibiworkhandler() returned nodes with sysslistappend() from the workqueue thread, with no lock on either side.
Because sysslistget() and sysslistappend() are neither atomic nor interrupt-safe, an IBI interrupt that fires while the workqueue thread is mid-append (or a truly parallel access under CONFIGSMP) races on the shared list. This corrupts the list linkage: a node may be handed to two consumers, a node may be lost, or the head/tail pointers may be left inconsistent so sysslistget() returns a stale or garbage pointer. In the double-hand-out case the subsequent memcpy(ibinode, ibiwork, sizeof(ibinode)) overwrites a node still in flight; a garbage pointer turns the same memcpy into an out-of-bounds write.
The race is driven by I3C bus traffic — IBIs, hot-joins, and controller-role requests originate from target devices on the bus, and I3C supports hot-joining devices. An attacker controlling an I3C peripheral on the board's chip-to-chip bus can generate high-frequency interrupts timed to collide with the free operation. Exploitation requires physical access to the bus and winning a narrow timing window; the most realistic impact is a crash or hang (denial of service), with memory corruption possible but hard to control.
The fix wraps all free-list sysslistget()/sysslistappend() operations in the new ibiworkalloc()/ibiworkfree() helpers, each guarded by a kspinlock (ibiworklock), closing the race across ISR and thread contexts.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Configuration
Ensure the i3c IBI free-list operations (sys_slist_get() and sys_slist_append()) are performed only through ibi_work_alloc()/ibi_work_free() protected by the k_spinlock (ibi_work_lock), so ISR and workqueue contexts cannot race.
i3c IBI workqueue free-list synchronization = spinlock-guarded via ibi_work_lock
Event History
Frequently Asked Questions
Is an SMP configuration required for this issue to occur?
No. The race can occur when an IBI interrupt fires while the workqueue thread is appending a node, even without truly parallel execution. CONFIG_SMP provides an additional parallel-access scenario.
What access does an attacker need to exploit this issue?
The supplied severity vector indicates physical attack access, no privileges, and no user interaction. Exploitation is rated as having high attack complexity.
What are the practical consequences of triggering the race?
The free-list can become corrupted, causing work nodes to be reused while still in flight, lost, or returned as stale or garbage pointers. A reused node can be overwritten, while a garbage pointer can cause an out-of-bounds write through a subsequent memcpy.