CVE-2024-36894CWE-362

CVE-2024-36894

High · published May 30, 2024

CVSS v3.1
7.8
EPSS
0%
Percentile
8.8
In the wild
Unconfirmed
What it is

In the Linux kernel, the following vulnerability has been resolved:

usb: gadget: f_fs: Fix race between aio_cancel() and AIO request complete

FFS based applications can utilize the aio_cancel() callback to dequeue

pending USB requests submitted to the UDC. There is a scenario where the

FFS application issues an AIO cancel call, while the UDC is handling a

soft disconnect. For a DWC3 based implementation, the callstack looks

like the following:

DWC3 Gadget FFS Application

dwc3_gadget_soft_disconnect() ...

--> dwc3_stop_active_transfers()

--> dwc3_gadget_giveback(-ESHUTDOWN)

--> ffs_epfile_async_io_complete() ffs_aio_cancel()

--> usb_ep_free_request() --> usb_ep_dequeue()

There is currently no locking implemented between the AIO completion

handler and AIO cancel, so the issue occurs if the completion routine is

running in parallel to an AIO cancel call coming from the FFS application.

As the completion call frees the USB request (io_data->req) the FFS

application is also referencing it for the usb_ep_dequeue() call. This can

lead to accessing a stale/hanging pointer.

commit b566d38857fc ("usb: gadget: f_fs: use io_data->status consistently")

relocated the usb_ep_free_request() into ffs_epfile_async_io_complete().

However, in order to properly implement locking to mitigate this issue, the

spinlock can't be added to ffs_epfile_async_io_complete(), as

usb_ep_dequeue() (if successfully dequeuing a USB request) will call the

function driver's completion handler in the same context. Hence, leading

into a deadlock.

Fix this issue by moving the usb_ep_free_request() back to

ffs_user_copy_worker(), and ensuring that it explicitly sets io_data->req

to NULL after freeing it within the ffs->eps_lock. This resolves the race

condition above, as the ffs_aio_cancel() routine will not continue

attempting to dequeue a request that has already been freed, or the

ffs_user_copy_work() not freeing the USB request until the AIO cancel is

done referencing it.

This fix depends on

commit b566d38857fc ("usb: gadget: f_fs: use io_data->status

consistently")

The record
Technical detail
CVSS v3.1
7.8 · HIGH
Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CVSS v4.0
Not supplied
EPSS
0.00196 · 8.8th percentile
Weakness
CWE-362 · Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition')
Published
2024-05-30T20:15Z
Affected products (13)
ProductVersionsFixed in
linux/linux_kernel≥ 3.15, < 4.19.3174.19.317
linux/linux_kernel≥ 4.20, < 5.4.2795.4.279
linux/linux_kernel≥ 5.5, < 5.10.2215.10.221
linux/linux_kernel≥ 5.11, < 5.15.1625.15.162
linux/linux_kernel≥ 5.16, < 6.1.956.1.95
linux/linux_kernel≥ 6.2, < 6.6.316.6.31
linux/linux_kernel≥ 6.7, < 6.8.106.8.10
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
References (19)
https://git.kernel.org/stable/c/24729b307eefcd7c476065cd7351c1a018082c19 · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/3613e5023f09b3308545e9d1acda86017ebd418a · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/73c05ad46bb4fbbdb346004651576d1c8dbcffbb · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/9e72ef59cbe61cd1243857a6418ca92104275867 · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/a0fdccb1c9e027e3195f947f61aa87d6d0d2ea14 · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/d7461830823242702f5d84084bcccb25159003f4 · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/e500b1c4e29ad0bd1c1332a1eaea2913627a92dd · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/f71a53148ce34898fef099b75386a3a9f4449311 · 416baaa9-dc9f-4396-8d5f-8c081fb06d67https://git.kernel.org/stable/c/24729b307eefcd7c476065cd7351c1a018082c19 · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/3613e5023f09b3308545e9d1acda86017ebd418a · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/73c05ad46bb4fbbdb346004651576d1c8dbcffbb · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/9e72ef59cbe61cd1243857a6418ca92104275867 · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/a0fdccb1c9e027e3195f947f61aa87d6d0d2ea14 · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/d7461830823242702f5d84084bcccb25159003f4 · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/e500b1c4e29ad0bd1c1332a1eaea2913627a92dd · af854a3a-2127-422b-91ae-364da2661108https://git.kernel.org/stable/c/f71a53148ce34898fef099b75386a3a9f4449311 · af854a3a-2127-422b-91ae-364da2661108https://lists.debian.org/debian-lts-announce/2025/01/msg00001.html · af854a3a-2127-422b-91ae-364da2661108https://cert-portal.siemens.com/productcert/html/ssa-265688.html · 0b142b55-0307-4c5a-b3c9-f314f3fb7c5ehttps://cert-portal.siemens.com/productcert/html/ssa-355557.html · 0b142b55-0307-4c5a-b3c9-f314f3fb7c5e
EPSS history
Timeline
  • 30 MAY 15:28Z
    usb: gadget: f_fs: Fix race between aio_cancel() and AIO request complete
    cvelistv5