Goal Reached Thanks to every supporter — we hit 100%!

Goal: 1000 CNY · Raised: 1020 CNY

100%

CVE-2024-56687— usb: musb: Fix hardware lockup on first Rx endpoint request

EPSS 0.02% · P6

Affected Version Matrix 12

VendorProductVersion RangeStatus
LinuxLinuxbaebdf48c360080710f80699eea3affbb13d6c65< c749500b28cae67410792096133ee7f282439c51affected
baebdf48c360080710f80699eea3affbb13d6c65< 5906ee3693674d734177df13a519a21bb03f730daffected
baebdf48c360080710f80699eea3affbb13d6c65< f05ad9755bb294328c3d0f429164ac6d4d08c548affected
baebdf48c360080710f80699eea3affbb13d6c65< 0c89445e6d475b78d37b64ae520831cd43af7db4affected
baebdf48c360080710f80699eea3affbb13d6c65< 3fc137386c4620305bbc2a216868c53f9245670aaffected
5.18affected
< 5.18unaffected
6.1.120≤ 6.1.*unaffected
… +4 more rows
Get alerts for future matching vulnerabilitiesLog in to subscribe

I. Basic Information for CVE-2024-56687

Vulnerability Information

Have questions about the vulnerability? See if Shenlong's analysis helps!
View Shenlong Deep Dive ↗

Although we use advanced large model technology, its output may still contain inaccurate or outdated information.Shenlong tries to ensure data accuracy, but please verify and judge based on the actual situation.

Vulnerability Title
usb: musb: Fix hardware lockup on first Rx endpoint request
Source: NVD (National Vulnerability Database)
Vulnerability Description
In the Linux kernel, the following vulnerability has been resolved: usb: musb: Fix hardware lockup on first Rx endpoint request There is a possibility that a request's callback could be invoked from usb_ep_queue() (call trace below, supplemented with missing calls): req->complete from usb_gadget_giveback_request (drivers/usb/gadget/udc/core.c:999) usb_gadget_giveback_request from musb_g_giveback (drivers/usb/musb/musb_gadget.c:147) musb_g_giveback from rxstate (drivers/usb/musb/musb_gadget.c:784) rxstate from musb_ep_restart (drivers/usb/musb/musb_gadget.c:1169) musb_ep_restart from musb_ep_restart_resume_work (drivers/usb/musb/musb_gadget.c:1176) musb_ep_restart_resume_work from musb_queue_resume_work (drivers/usb/musb/musb_core.c:2279) musb_queue_resume_work from musb_gadget_queue (drivers/usb/musb/musb_gadget.c:1241) musb_gadget_queue from usb_ep_queue (drivers/usb/gadget/udc/core.c:300) According to the docstring of usb_ep_queue(), this should not happen: "Note that @req's ->complete() callback must never be called from within usb_ep_queue() as that can create deadlock situations." In fact, a hardware lockup might occur in the following sequence: 1. The gadget is initialized using musb_gadget_enable(). 2. Meanwhile, a packet arrives, and the RXPKTRDY flag is set, raising an interrupt. 3. If IRQs are enabled, the interrupt is handled, but musb_g_rx() finds an empty queue (next_request() returns NULL). The interrupt flag has already been cleared by the glue layer handler, but the RXPKTRDY flag remains set. 4. The first request is enqueued using usb_ep_queue(), leading to the call of req->complete(), as shown in the call trace above. 5. If the callback enables IRQs and another packet is waiting, step (3) repeats. The request queue is empty because usb_g_giveback() removes the request before invoking the callback. 6. The endpoint remains locked up, as the interrupt triggered by hardware setting the RXPKTRDY flag has been handled, but the flag itself remains set. For this scenario to occur, it is only necessary for IRQs to be enabled at some point during the complete callback. This happens with the USB Ethernet gadget, whose rx_complete() callback calls netif_rx(). If called in the task context, netif_rx() disables the bottom halves (BHs). When the BHs are re-enabled, IRQs are also enabled to allow soft IRQs to be processed. The gadget itself is initialized at module load (or at boot if built-in), but the first request is enqueued when the network interface is brought up, triggering rx_complete() in the task context via ioctl(). If a packet arrives while the interface is down, it can prevent the interface from receiving any further packets from the USB host. The situation is quite complicated with many parties involved. This particular issue can be resolved in several possible ways: 1. Ensure that callbacks never enable IRQs. This would be difficult to enforce, as discovering how netif_rx() interacts with interrupts was already quite challenging and u_ether is not the only function driver. Similar "bugs" could be hidden in other drivers as well. 2. Disable MUSB interrupts in musb_g_giveback() before calling the callback and re-enable them afterwars (by calling musb_{dis,en}able_interrupts(), for example). This would ensure that MUSB interrupts are not handled during the callback, even if IRQs are enabled. In fact, it would allow IRQs to be enabled when releasing the lock. However, this feels like an inelegant hack. 3. Modify the interrupt handler to clear the RXPKTRDY flag if the request queue is empty. While this approach also feels like a hack, it wastes CPU time by attempting to handle incoming packets when the software is not ready to process them. 4. Flush the Rx FIFO instead of calling rxstate() in musb_ep_restart(). This ensures that the hardware can receive packets when there is at least one request in the queue. Once I ---truncated---
Source: NVD (National Vulnerability Database)
CVSS Information
N/A
Source: NVD (National Vulnerability Database)
Vulnerability Type
N/A
Source: NVD (National Vulnerability Database)
Vulnerability Title
Linux kernel 安全漏洞
Source: CNNVD (China National Vulnerability Database)
Vulnerability Description
Linux kernel是美国Linux基金会的开源操作系统Linux所使用的内核。 Linux kernel存在安全漏洞,该漏洞源于usb:musb模块中第一个Rx端点请求时的硬件锁死。
Source: CNNVD (China National Vulnerability Database)
CVSS Information
N/A
Source: CNNVD (China National Vulnerability Database)
Vulnerability Type
N/A
Source: CNNVD (China National Vulnerability Database)

Affected Products

VendorProductAffected VersionsCPESubscribe
LinuxLinux baebdf48c360080710f80699eea3affbb13d6c65 ~ c749500b28cae67410792096133ee7f282439c51 -
LinuxLinux 5.18 -

II. Public POCs for CVE-2024-56687

#POC DescriptionSource LinkShenlong Link
AI-Generated POCPremium

No public POC found.

Login to generate AI POC

III. Intelligence Information for CVE-2024-56687

登录查看更多情报信息。
Patch · 5

Same Patch Batch · Linux · 2024-12-28 · 32 CVEs total

CVE-2024-56692f2fs: fix to do sanity check on node blkaddr in truncate_node()
CVE-2024-56708EDAC/igen6: Avoid segmentation fault on module unload
CVE-2024-56707octeontx2-pf: handle otx2_mbox_get_rsp errors in otx2_dmac_flt.c
CVE-2024-56705media: atomisp: Add check for rgby_data memory allocation failure
CVE-2024-56706s390/cpum_sf: Fix and protect memory allocation of SDBs with mutex
CVE-2024-567049p/xen: fix release of IRQ
CVE-2024-56703ipv6: Fix soft lockups in fib6_select_path under high next hop churn
CVE-2024-56701powerpc/pseries: Fix dtl_access_lock to be a rw_semaphore
CVE-2024-56702bpf: Mark raw_tp arguments with PTR_MAYBE_NULL
CVE-2024-56700media: wl128x: Fix atomicity violation in fmc_send_cmd()
CVE-2024-56699s390/pci: Fix potential double remove of hotplug slot
CVE-2024-56698usb: dwc3: gadget: Fix looping of queued SG entries
CVE-2024-56697drm/amdgpu: Fix the memory allocation issue in amdgpu_discovery_get_nps_info()
CVE-2024-56696ALSA: core: Fix possible NULL dereference caused by kunit_kzalloc()
CVE-2024-56694bpf: fix recursive lock when verdict program return SK_PASS
CVE-2024-56695drm/amdkfd: Use dynamic allocation for CU occupancy array in 'kfd_get_cu_occupancy()'
CVE-2024-56676thermal: testing: Initialize some variables annoteded with _free()
CVE-2024-56693brd: defer automatic disk creation until module initialization succeeds
CVE-2024-56691mfd: intel_soc_pmic_bxtwc: Use IRQ domain for USB Type-C device
CVE-2024-56689PCI: endpoint: epf-mhi: Avoid NULL dereference if DT lacks 'mmio'

Showing top 20 of 32 CVEs. View all on vendor page &rarr; →

IV. Related Vulnerabilities

V. Comments for CVE-2024-56687

No comments yet


Leave a comment