CVE-2026-72071: tracing/user_events: Fix use-after-free in user_event_mm_dup()
In the Linux kernel, the following vulnerability has been resolved:
tracing/userevents: Fix use-after-free in usereventmmdup()
usereventmmdup() walks the parent mm's enabler list locklessly under rcureadlock() during fork() (from copyprocess()); it does not take eventmutex:
rcureadlock(); listforeachentryrcu(enabler, &oldmm->enablers, mmenablerslink) enabler->event = usereventget(orig->event);
usereventenablerdestroy() removes an enabler from that list with listdelrcu() and then, without waiting for a grace period, drops the enabler's userevent reference with usereventput() and frees the enabler with kfree(). A reader that loaded the enabler before the listdelrcu() can still be walking it, which leads to two use-after-frees:
- kfree(enabler) frees the enabler while that reader dereferences enabler->event.
- usereventput() may drop the last reference to the userevent, which is then freed (via delayeddestroyuserevent() on a work queue), while the same reader does usereventget(orig->event) on it.
Both are reachable by an unprivileged task that can open usereventsdata: one multithreaded process that registers an enabler and then concurrently unregisters it and calls fork() triggers the race. KASAN reports a slab-use-after-free in usereventmmdup() during clone(), with a "refcountt: addition on 0" warning when the userevent is freed.
The enabler use-after-free was found first; the userevent one was reported by XIAO WU, and the earlier enabler-only fix did not address it.
Defer both the usereventput() and the kfree(enabler) to a work item queued with queuercuwork(), so they run only after an RCU grace period, once all readers walking the enabler list have finished. The put must run in process context because usereventput() takes eventmutex on the last reference, so a work queue is used rather than callrcu(). The now-unlocked put lets the locked argument of usereventenablerdestroy() be removed; all callers are updated.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Configuration
Modify the code path that frees the enabler so that both user_event_put() and kfree(enabler) are deferred to a work item (e.g., queued work), rather than running while readers may still dereference the enabler.
Linux kernel (user_events / tracing/user_events) RCU grace period handling for enabler destruction = Defer user_event_put() and kfree(enabler) to a work item - Configuration
Update user_event_enabler_destroy() / destruction flow so the enabler is removed from the RCU-protected list and the final put/free occurs only after the relevant RCU grace period, using queued work rather than immediate free, to prevent slab-use-after-free in user_event_mm_dup().
Linux kernel (user_event_mm_dup / tracing/user_events) enabler destruction synchronization = Remove with list_del_rcu() and defer final free via work queue after grace period - Compensating control
Restrict unprivileged access to the interface that allows opening/using user_events_data, since both reachable conditions require an unprivileged task to open user_events_data.
Event History
Frequently Asked Questions
What is the severity of CVE-2026-72071?
CVE-2026-72071 has a risk score of 65, indicating a medium severity vulnerability.
How do I fix CVE-2026-72071?
To address CVE-2026-72071, you should update your Linux kernel to the latest version that includes the fix for the use-after-free issue.
What systems are affected by CVE-2026-72071?
CVE-2026-72071 affects various versions of the Linux kernel that utilize the tracing/user_events functionality.
What type of vulnerability is CVE-2026-72071?
CVE-2026-72071 is classified as a Use After Free vulnerability, which can lead to potential memory corruption.
When was CVE-2026-72071 published?
CVE-2026-72071 was published on August 15, 2026.