{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2024-36894","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","state":"PUBLISHED","assignerShortName":"Linux","dateReserved":"2024-05-30T15:25:07.066Z","datePublished":"2024-05-30T15:28:59.689Z","dateUpdated":"2026-08-05T11:31:53.288Z"},"containers":{"cna":{"providerMetadata":{"orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","shortName":"Linux","dateUpdated":"2026-08-05T11:31:53.288Z"},"descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nusb: gadget: f_fs: Fix race between aio_cancel() and AIO request complete\n\nFFS based applications can utilize the aio_cancel() callback to dequeue\npending USB requests submitted to the UDC.  There is a scenario where the\nFFS application issues an AIO cancel call, while the UDC is handling a\nsoft disconnect.  For a DWC3 based implementation, the callstack looks\nlike the following:\n\n    DWC3 Gadget                               FFS Application\ndwc3_gadget_soft_disconnect()              ...\n  --> dwc3_stop_active_transfers()\n    --> dwc3_gadget_giveback(-ESHUTDOWN)\n      --> ffs_epfile_async_io_complete()   ffs_aio_cancel()\n        --> usb_ep_free_request()            --> usb_ep_dequeue()\n\nThere is currently no locking implemented between the AIO completion\nhandler and AIO cancel, so the issue occurs if the completion routine is\nrunning in parallel to an AIO cancel call coming from the FFS application.\nAs the completion call frees the USB request (io_data->req) the FFS\napplication is also referencing it for the usb_ep_dequeue() call.  This can\nlead to accessing a stale/hanging pointer.\n\ncommit b566d38857fc (\"usb: gadget: f_fs: use io_data->status consistently\")\nrelocated the usb_ep_free_request() into ffs_epfile_async_io_complete().\nHowever, in order to properly implement locking to mitigate this issue, the\nspinlock can't be added to ffs_epfile_async_io_complete(), as\nusb_ep_dequeue() (if successfully dequeuing a USB request) will call the\nfunction driver's completion handler in the same context.  Hence, leading\ninto a deadlock.\n\nFix this issue by moving the usb_ep_free_request() back to\nffs_user_copy_worker(), and ensuring that it explicitly sets io_data->req\nto NULL after freeing it within the ffs->eps_lock.  This resolves the race\ncondition above, as the ffs_aio_cancel() routine will not continue\nattempting to dequeue a request that has already been freed, or the\nffs_user_copy_work() not freeing the USB request until the AIO cancel is\ndone referencing it.\n\nThis fix depends on\n  commit b566d38857fc (\"usb: gadget: f_fs: use io_data->status\n  consistently\")"}],"metrics":[{"cvssV3_1":{"version":"3.1","vectorString":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","baseScore":7.8,"baseSeverity":"HIGH"},"scenarios":[{"lang":"en","value":"AV:L - Both sides of the race are driven by local syscalls — `io_submit`/`io_cancel`/`io_destroy` on an AIO context plus `close()` of ep0 to force the mass `-ESHUTDOWN` giveback — with no USB host, cable, or physical access required. This is the gadget's userspace-facing API (f_fs), not a host-side driver parsing attacker-supplied descriptors, matching the AV:L precedent set for other gadget-side UAF races such as CVE-2024-38628.\nAC:L - The attacker controls both sides: it submits the AIO requests, triggers the bulk giveback that frees them, and then invokes `ffs_aio_cancel()` on every stale pointer at once via `free_ioctx_users()`. The ordered (max_active=1) `io_completion_wq` and the sleeping `kthread_use_mm`/`copy_to_iter` in the worker leave a huge window, and the whole sequence is freely repeatable.\nPR:L - The attacker needs an open descriptor on a functionfs endpoint file and an AIO context — available to any local unprivileged user in standard deployments, since ffs is mounted with `uid=`/`gid=`/`mode=` specifically to hand the endpoints to unprivileged daemons (adbd as `shell`, MTP as `media_rw`, embedded gadget daemons). No CAP_SYS_ADMIN is needed for the attack itself.\nUI:N - The attacking process performs every step itself — submit AIO, close ep0 to trigger the disconnect/giveback, then cancel/destroy the AIO context. No victim action is involved.\nS:U - The corruption is confined to kernel heap objects within the same security authority; there is no VM, IOMMU, or sandbox boundary crossed. This is standard local kernel privilege escalation.\nC:H - The use-after-free lets the attacker reclaim the freed `dwc3_request` slot with fully controlled data via the same fd (`ffs_alloc_buffer()` → `kmalloc` + `copy_from_iter_full`), after which `dwc3_gadget_ep_dequeue()`/`trace_dwc3_ep_dequeue()` dereference attacker-controlled pointers (`req->dep->name`, `req->td_data->status` on snps_udc), yielding an arbitrary kernel read primitive and leakage of adjacent heap contents.\nI:H - The stale request is passed to UDC dequeue routines that write into it and unlink it — `dwc3_gadget_giveback()` sets `req->request.status` and `list_del()`s the entry (arbitrary write via controlled list pointers), while `snps_udc_core::udc_dequeue()` performs no membership check and calls `complete_req()`, invoking `req->req.complete` — an indirect call through a function pointer read from freed, attacker-reclaimable memory, i.e. control-flow hijack.\nA:H - Even unweaponized, dereferencing the freed `usb_request` and the resulting double giveback/double free of `io_data` and its buffer reliably produce KASAN splats, slab corruption, and kernel panics. On a mass-disconnect the attacker triggers many of these at once with a single `io_destroy()`."}]}],"affected":[{"product":"Linux","vendor":"Linux","defaultStatus":"unaffected","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["drivers/usb/gadget/function/f_fs.c"],"versions":[{"version":"2e4c7553cd6f9c68bb741582dcb614edcbeca70f","lessThan":"f71a53148ce34898fef099b75386a3a9f4449311","status":"affected","versionType":"git"},{"version":"2e4c7553cd6f9c68bb741582dcb614edcbeca70f","lessThan":"9e72ef59cbe61cd1243857a6418ca92104275867","status":"affected","versionType":"git"},{"version":"2e4c7553cd6f9c68bb741582dcb614edcbeca70f","lessThan":"e500b1c4e29ad0bd1c1332a1eaea2913627a92dd","status":"affected","versionType":"git"},{"version":"2e4c7553cd6f9c68bb741582dcb614edcbeca70f","lessThan":"3613e5023f09b3308545e9d1acda86017ebd418a","status":"affected","versionType":"git"},{"version":"2e4c7553cd6f9c68bb741582dcb614edcbeca70f","lessThan":"a0fdccb1c9e027e3195f947f61aa87d6d0d2ea14","status":"affected","versionType":"git"},{"version":"2e4c7553cd6f9c68bb741582dcb614edcbeca70f","lessThan":"73c05ad46bb4fbbdb346004651576d1c8dbcffbb","status":"affected","versionType":"git"},{"version":"2e4c7553cd6f9c68bb741582dcb614edcbeca70f","lessThan":"d7461830823242702f5d84084bcccb25159003f4","status":"affected","versionType":"git"},{"version":"2e4c7553cd6f9c68bb741582dcb614edcbeca70f","lessThan":"24729b307eefcd7c476065cd7351c1a018082c19","status":"affected","versionType":"git"}]},{"product":"Linux","vendor":"Linux","defaultStatus":"affected","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["drivers/usb/gadget/function/f_fs.c"],"versions":[{"version":"3.15","status":"affected"},{"version":"0","lessThan":"3.15","status":"unaffected","versionType":"semver"},{"version":"4.19.317","lessThanOrEqual":"4.19.*","status":"unaffected","versionType":"semver"},{"version":"5.4.279","lessThanOrEqual":"5.4.*","status":"unaffected","versionType":"semver"},{"version":"5.10.221","lessThanOrEqual":"5.10.*","status":"unaffected","versionType":"semver"},{"version":"5.15.162","lessThanOrEqual":"5.15.*","status":"unaffected","versionType":"semver"},{"version":"6.1.95","lessThanOrEqual":"6.1.*","status":"unaffected","versionType":"semver"},{"version":"6.6.31","lessThanOrEqual":"6.6.*","status":"unaffected","versionType":"semver"},{"version":"6.8.10","lessThanOrEqual":"6.8.*","status":"unaffected","versionType":"semver"},{"version":"6.9","lessThanOrEqual":"*","status":"unaffected","versionType":"original_commit_for_fix"}]}],"cpeApplicability":[{"nodes":[{"operator":"OR","negate":false,"cpeMatch":[{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"3.15","versionEndExcluding":"4.19.317"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"3.15","versionEndExcluding":"5.4.279"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"3.15","versionEndExcluding":"5.10.221"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"3.15","versionEndExcluding":"5.15.162"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"3.15","versionEndExcluding":"6.1.95"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"3.15","versionEndExcluding":"6.6.31"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"3.15","versionEndExcluding":"6.8.10"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"3.15","versionEndExcluding":"6.9"}]}]}],"references":[{"url":"https://git.kernel.org/stable/c/f71a53148ce34898fef099b75386a3a9f4449311"},{"url":"https://git.kernel.org/stable/c/9e72ef59cbe61cd1243857a6418ca92104275867"},{"url":"https://git.kernel.org/stable/c/e500b1c4e29ad0bd1c1332a1eaea2913627a92dd"},{"url":"https://git.kernel.org/stable/c/3613e5023f09b3308545e9d1acda86017ebd418a"},{"url":"https://git.kernel.org/stable/c/a0fdccb1c9e027e3195f947f61aa87d6d0d2ea14"},{"url":"https://git.kernel.org/stable/c/73c05ad46bb4fbbdb346004651576d1c8dbcffbb"},{"url":"https://git.kernel.org/stable/c/d7461830823242702f5d84084bcccb25159003f4"},{"url":"https://git.kernel.org/stable/c/24729b307eefcd7c476065cd7351c1a018082c19"}],"title":"usb: gadget: f_fs: Fix race between aio_cancel() and AIO request complete","x_generator":{"engine":"bippy-1.2.0"}},"adp":[{"problemTypes":[{"descriptions":[{"type":"CWE","cweId":"CWE-362","lang":"en","description":"CWE-362 Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition')"}]}],"affected":[{"vendor":"linux","product":"linux_kernel","cpes":["cpe:2.3:o:linux:linux_kernel:-:*:*:*:*:*:*:*"],"defaultStatus":"unknown","versions":[{"version":"2e4c7553cd6f","status":"affected","lessThan":"73c05ad46bb4","versionType":"custom"}]},{"vendor":"linux","product":"linux_kernel","cpes":["cpe:2.3:o:linux:linux_kernel:-:*:*:*:*:*:*:*"],"defaultStatus":"unknown","versions":[{"version":"2e4c7553cd6f","status":"affected","lessThan":"d74618308232","versionType":"custom"}]},{"vendor":"linux","product":"linux_kernel","cpes":["cpe:2.3:o:linux:linux_kernel:-:*:*:*:*:*:*:*"],"defaultStatus":"unknown","versions":[{"version":"2e4c7553cd6f","status":"affected","lessThan":"24729b307eef","versionType":"custom"},{"version":"2e4c7553cd6f","status":"affected","lessThan":"f71a53148ce3","versionType":"custom"},{"version":"2e4c7553cd6f","status":"affected","lessThan":"9e72ef59cbe6","versionType":"custom"},{"version":"2e4c7553cd6f","status":"affected","lessThan":"e500b1c4e29a","versionType":"custom"},{"version":"2e4c7553cd6f","status":"affected","lessThan":"3613e5023f09","versionType":"custom"},{"version":"2e4c7553cd6f","status":"affected","lessThan":"a0fdccb1c9e0","versionType":"custom"},{"version":"3.15","status":"affected"},{"version":"0","status":"unaffected","lessThan":"3.15","versionType":"custom"},{"version":"4.19.317","status":"unaffected","lessThanOrEqual":"4.20","versionType":"custom"},{"version":"5.4.279","status":"unaffected","lessThanOrEqual":"5.5","versionType":"custom"},{"version":"5.10.221","status":"unaffected","lessThanOrEqual":"5.11","versionType":"custom"},{"version":"5.15.162","status":"unaffected","lessThanOrEqual":"5.16","versionType":"custom"},{"version":"6.1.95","status":"unaffected","lessThanOrEqual":"6.2","versionType":"custom"},{"version":"6.6.31","status":"unaffected","lessThanOrEqual":"6.7","versionType":"custom"},{"version":"6.8.10","status":"unaffected","lessThanOrEqual":"6.9","versionType":"custom"},{"version":"6.9","status":"unaffected","lessThanOrEqual":"*","versionType":"custom"}]}],"metrics":[{"cvssV3_1":{"scope":"UNCHANGED","version":"3.1","baseScore":5.6,"attackVector":"PHYSICAL","baseSeverity":"MEDIUM","vectorString":"CVSS:3.1/AV:P/AC:H/PR:L/UI:N/S:U/C:H/I:N/A:H","integrityImpact":"NONE","userInteraction":"NONE","attackComplexity":"HIGH","availabilityImpact":"HIGH","privilegesRequired":"LOW","confidentialityImpact":"HIGH"}},{"other":{"type":"ssvc","content":{"timestamp":"2024-06-03T15:53:00.949597Z","id":"CVE-2024-36894","options":[{"Exploitation":"none"},{"Automatable":"no"},{"Technical Impact":"partial"}],"role":"CISA Coordinator","version":"2.0.3"}}}],"title":"CISA ADP Vulnrichment","providerMetadata":{"orgId":"134c704f-9b21-4f2e-91b3-4a467353bcc0","shortName":"CISA-ADP","dateUpdated":"2024-08-21T16:17:27.715Z"}},{"title":"CVE Program Container","references":[{"url":"https://git.kernel.org/stable/c/f71a53148ce34898fef099b75386a3a9f4449311","tags":["x_transferred"]},{"url":"https://git.kernel.org/stable/c/9e72ef59cbe61cd1243857a6418ca92104275867","tags":["x_transferred"]},{"url":"https://git.kernel.org/stable/c/e500b1c4e29ad0bd1c1332a1eaea2913627a92dd","tags":["x_transferred"]},{"url":"https://git.kernel.org/stable/c/3613e5023f09b3308545e9d1acda86017ebd418a","tags":["x_transferred"]},{"url":"https://git.kernel.org/stable/c/a0fdccb1c9e027e3195f947f61aa87d6d0d2ea14","tags":["x_transferred"]},{"url":"https://git.kernel.org/stable/c/73c05ad46bb4fbbdb346004651576d1c8dbcffbb","tags":["x_transferred"]},{"url":"https://git.kernel.org/stable/c/d7461830823242702f5d84084bcccb25159003f4","tags":["x_transferred"]},{"url":"https://git.kernel.org/stable/c/24729b307eefcd7c476065cd7351c1a018082c19","tags":["x_transferred"]},{"url":"https://lists.debian.org/debian-lts-announce/2025/01/msg00001.html"}],"providerMetadata":{"orgId":"af854a3a-2127-422b-91ae-364da2661108","shortName":"CVE","dateUpdated":"2025-11-03T21:55:22.274Z"}},{"x_adpType":"supplier","providerMetadata":{"orgId":"0b142b55-0307-4c5a-b3c9-f314f3fb7c5e","shortName":"siemens-SADP","dateUpdated":"2026-05-12T11:53:58.433Z"},"affected":[{"vendor":"Siemens","product":"RUGGEDCOM RST2428P","versions":[{"status":"unaffected","version":"0","lessThan":"*","versionType":"custom"}],"defaultStatus":"unknown"},{"vendor":"Siemens","product":"SCALANCE XC-300/XR-300/XC-400/XR-500WG/XR-500 family","versions":[{"status":"unaffected","version":"0","lessThan":"*","versionType":"custom"}],"defaultStatus":"unknown"},{"vendor":"Siemens","product":"SCALANCE XCM-/XRM-/XCH-/XRH-300 family","versions":[{"status":"unaffected","version":"0","lessThan":"*","versionType":"custom"}],"defaultStatus":"unknown"},{"vendor":"Siemens","product":"SIMATIC S7-1500 TM MFP - GNU/Linux subsystem","versions":[{"status":"affected","version":"0","lessThan":"*","versionType":"custom"}],"defaultStatus":"unknown"}],"references":[{"url":"https://cert-portal.siemens.com/productcert/html/ssa-265688.html"},{"url":"https://cert-portal.siemens.com/productcert/html/ssa-355557.html"}]}]}}