Bug 1220701 (CVE-2021-46986) - VUL-0: CVE-2021-46986: kernel: usb: dwc3: gadget: free gadget structure only after freeing endpoints
Summary: VUL-0: CVE-2021-46986: kernel: usb: dwc3: gadget: free gadget structure only ...
Status: RESOLVED FIXED
Alias: CVE-2021-46986
Product: SUSE Security Incidents
Classification: Novell Products
Component: Incidents (show other bugs)
Version: unspecified
Hardware: Other Other
: P3 - Medium : Normal
Target Milestone: ---
Assignee: Security Team bot
QA Contact: Security Team bot
URL: https://smash.suse.de/issue/395435/
Whiteboard: CVSSv3.1:SUSE:CVE-2021-46986:5.3:(AV:...
Keywords:
Depends on:
Blocks:
 
Reported: 2024-02-29 15:34 UTC by SMASH SMASH
Modified: 2024-04-29 07:07 UTC (History)
2 users (show)

See Also:
Found By: Security Response Team
Services Priority:
Business Priority:
Blocker: ---
Marketing QA Status: ---
IT Deployment: ---


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description SMASH SMASH 2024-02-29 15:34:18 UTC
In the Linux kernel, the following vulnerability has been resolved:

usb: dwc3: gadget: Free gadget structure only after freeing endpoints

As part of commit e81a7018d93a ("usb: dwc3: allocate gadget structure
dynamically") the dwc3_gadget_release() was added which will free
the dwc->gadget structure upon the device's removal when
usb_del_gadget_udc() is called in dwc3_gadget_exit().

However, simply freeing the gadget results a dangling pointer
situation: the endpoints created in dwc3_gadget_init_endpoints()
have their dep->endpoint.ep_list members chained off the list_head
anchored at dwc->gadget->ep_list.  Thus when dwc->gadget is freed,
the first dwc3_ep in the list now has a dangling prev pointer and
likewise for the next pointer of the dwc3_ep at the tail of the list.
The dwc3_gadget_free_endpoints() that follows will result in a
use-after-free when it calls list_del().

This was caught by enabling KASAN and performing a driver unbind.
The recent commit 568262bf5492 ("usb: dwc3: core: Add shutdown
callback for dwc3") also exposes this as a panic during shutdown.

There are a few possibilities to fix this.  One could be to perform
a list_del() of the gadget->ep_list itself which removes it from
the rest of the dwc3_ep chain.

Another approach is what this patch does, by splitting up the
usb_del_gadget_udc() call into its separate "del" and "put"
components.  This allows dwc3_gadget_free_endpoints() to be
called before the gadget is finally freed with usb_put_gadget().

References:
http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2021-46986
https://www.cve.org/CVERecord?id=CVE-2021-46986
https://lore.kernel.org/linux-cve-announce/2024022824-CVE-2021-46986-1d6e@gregkh/T/#u

Patch:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=bb9c74a5bd14
Comment 1 Andrea Mattiazzo 2024-02-29 15:39:38 UTC
Closing since:
-codestreams below cve/linux-5.14 are not affected
-cve/linux-5.14,stable and SLE15-SP6 are already patched