CVE Catalog

CVE-2026-89739

Low risk· EPSS 10%
Published: Translated: NVD NIST

Exploitation Probability (EPSS)

Low risk
0.20%

10th percentile - higher than 10% of all known CVEs

Summary

A use-after-free vulnerability exists in the Linux kernel USB dwc3 gadget driver. The dwc3_gadget_free_endpoints function frees the dep structure while a queued nostream_work delayed work may still be pending or running and accessing the freed memory. The issue is fixed by canceling the delayed work before freeing the memory.

Risk Assessment

This vulnerability can lead to kernel memory corruption, system crash (panic), or potential arbitrary code execution with kernel privileges. The risk occurs when disconnecting a USB device in gadget mode, especially in environments with dynamically attached devices.

Recommendation

Update the Linux kernel to a version containing the fix that cancels the delayed work before freeing memory in dwc3_gadget_free_endpoints. If updating is not possible, restrict the ability of unprivileged users to disconnect USB gadget devices.

Other vulnerabilities in Linux kernel

See all
Original NVD description (English source)

In the Linux kernel, the following vulnerability has been resolved: usb: dwc3: gadget: Fix use-after-free in dwc3_gadget_free_endpoints due to race condition In dwc3_gadget_init_endpoint, &dep->nostream_work is bound with dwc3_nostream_work, and dwc3_gadget_endpoint_stream_event can queue this delayed work on system_percpu_wq when a DEPEVT_STREAM_NOSTREAM event is received. If we remove the gadget, dwc3_gadget_free_endpoints makes cleanup and the memory allocated for dep with kzalloc() is released by kfree(dep), while the delayed work mentioned above may still be pending or running. The sequence of operations that may lead to a UAF bug is as follows: CPU0 CPU1 | dwc3_thread_interrupt | dwc3_endpoint_interrupt | dwc3_gadget_endpoint_stream_event | queue_delayed_work(system_percpu_wq, | &dep->nostream_work) dwc3_gadget_free_endpoints | dwc3_free_trb_pool(dep) | list_del(&dep->endpoint.ep_list) | dwc3_debugfs_remove_endpoint_dir(dep) | kfree(dep) | // dep is freed | | dwc3_nostream_work | // use dep (use-after-free) Fix it by canceling the delayed work before kfree(dep) in dwc3_gadget_free_endpoints.

Vulnerability data from NVD (NIST) · CISA KEV · EPSS