{ "dataType": "CVE_RECORD", "dataVersion": "5.2", "cveMetadata": { "cveId": "CVE-2025-21923", "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "state": "PUBLISHED", "assignerShortName": "Linux", "dateReserved": "2024-12-29T08:45:45.788Z", "datePublished": "2025-04-01T15:40:56.229Z", "dateUpdated": "2026-08-05T11:55:21.882Z" }, "containers": { "cna": { "providerMetadata": { "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "shortName": "Linux", "dateUpdated": "2026-08-05T11:55:21.882Z" }, "descriptions": [ { "lang": "en", "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nHID: hid-steam: Fix use-after-free when detaching device\n\nWhen a hid-steam device is removed it must clean up the client_hdev used for\nintercepting hidraw access. This can lead to scheduling deferred work to\nreattach the input device. Though the cleanup cancels the deferred work, this\nwas done before the client_hdev itself is cleaned up, so it gets rescheduled.\nThis patch fixes the ordering to make sure the deferred work is properly\ncanceled." } ], "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 - The whole sequence is local char-device work — `UHID_CREATE2` on `/dev/uhid` forging a `BUS_USB 28de:1102` device, `open()` of the resulting client `/dev/hidrawN`, then `UHID_DESTROY` — and hid-steam has no `hid_is_usb()`/`hid_to_usb_dev()` guard while `uhid_dev_create2()` copies `bus`/`vendor`/`product` and the report descriptor verbatim from userspace. Physically attaching and unplugging a real or emulated Steam Controller is an alternative, strictly lower-severity vector.\nAC:L - The attacker performs both required steps himself and in order — hold the client hidraw node open, then tear the device down — and the re-queue of `unregister_work` from `hidraw_disconnect()` → `hid_hw_close()` → `steam_client_ll_close()` happens unconditionally after the cancel, so there is no race window to win and no state outside his control. Heap grooming before the worker runs is likewise attacker-driven, and creating further uhid steam devices reclaims the identical devm allocation size.\nPR:L - No capability check exists anywhere on the path — neither `uhid_dev_create2()` nor `steam_probe()` tests any `CAP_*` — so access is governed purely by DAC on `/dev/uhid` and `/dev/hidraw*`, which systemd/udev `uaccess`-tag for the logged-in seat user on desktop and Android-class systems and which are routinely exposed inside privileged containers. On real hardware the unprivileged Steam client is precisely the process holding the client hidraw open when the controller is detached.\nUI:N - The attacker's own process creates the device, opens the client hidraw node, and triggers the removal, and the deferred work then runs automatically on the system workqueue. No action by any other user — no mount, login, or file open — is required.\nS:U - The freed `struct steam_device`, the freed parent `struct hid_device`, and every corrupted structure live in kernel memory under the kernel's own security authority. No hypervisor, IOMMU, or sandbox boundary is crossed.\nC:H - This is a slab use-after-free of an object whose contents are read back after free — `steam_work_unregister_cb()` reads `steam->client_opened`/`steam->connected`, and `steam_send_report()` reads `steam->hdev->report_enum[HID_FEATURE_REPORT].report_id_hash[0]` plus `hid_report_len()` from the freed hid_device. Reallocating the slab with controlled data turns that chain into an attacker-directed arbitrary kernel read, and per UAF guidance confidentiality impact is High.\nI:H - Two independent write/control primitives exist: the workqueue stores into `work->data` inside the freed object and then performs an indirect call to `work->func(work)` read from freed memory, and the callback additionally does `rcu_assign_pointer(steam->input/sensors, ...)` writes into the freed struct and dispatches `hid_hw_raw_request()` through the freed hdev's `ll_driver` function-pointer table. Heap-spray reallocation converts either into control-flow hijacking and arbitrary write.\nA:H - The defect is the slab-use-after-free reported by syzbot (syzbot+0154da2d403396b2bd59), which produces KASAN slab-use-after-free splats, workqueue corruption, and kernel oops/panic — a full panic under `panic_on_oops`. It is re-triggerable at will by repeating the create/open/destroy cycle." } ] } ], "affected": [ { "product": "Linux", "vendor": "Linux", "defaultStatus": "unaffected", "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "programFiles": [ "drivers/hid/hid-steam.c" ], "versions": [ { "version": "e1147961b2145fa61c3078a4a797d9576cde91ab", "lessThan": "026714ec7546de741826324a6a1914c91024d06c", "status": "affected", "versionType": "git" }, { "version": "3e38cbbfa0a128a9d64773240a9eb3bc7bae3b1a", "lessThan": "a899adf7063c6745aaff1ec869f3c7f6329ed0a1", "status": "affected", "versionType": "git" }, { "version": "053fa3888d2a957f4db26c05e503f4c6b9570a30", "lessThan": "ea3f18d2f02629653b7bfe42607737ccd1343e54", "status": "affected", "versionType": "git" }, { "version": "79504249d7e27cad4a3eeb9afc6386e418728ce0", "lessThan": "e53fc232a65f7488ab75d03a5b95f06aaada7262", "status": "affected", "versionType": "git" } ] }, { "product": "Linux", "vendor": "Linux", "defaultStatus": "unaffected", "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "programFiles": [ "drivers/hid/hid-steam.c" ], "versions": [ { "version": "6.6.79", "lessThan": "6.6.83", "status": "affected", "versionType": "semver" }, { "version": "6.12.16", "lessThan": "6.12.19", "status": "affected", "versionType": "semver" }, { "version": "6.13.4", "lessThan": "6.13.7", "status": "affected", "versionType": "semver" } ] } ], "cpeApplicability": [ { "nodes": [ { "operator": "OR", "negate": false, "cpeMatch": [ { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "6.6.79", "versionEndExcluding": "6.6.83" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "6.12.16", "versionEndExcluding": "6.12.19" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "6.13.4", "versionEndExcluding": "6.13.7" } ] } ] } ], "references": [ { "url": "https://git.kernel.org/stable/c/026714ec7546de741826324a6a1914c91024d06c" }, { "url": "https://git.kernel.org/stable/c/a899adf7063c6745aaff1ec869f3c7f6329ed0a1" }, { "url": "https://git.kernel.org/stable/c/ea3f18d2f02629653b7bfe42607737ccd1343e54" }, { "url": "https://git.kernel.org/stable/c/e53fc232a65f7488ab75d03a5b95f06aaada7262" } ], "title": "HID: hid-steam: Fix use-after-free when detaching device", "x_generator": { "engine": "bippy-1.2.0" } }, "adp": [ { "metrics": [ { "cvssV3_1": { "scope": "UNCHANGED", "version": "3.1", "baseScore": 7.8, "attackVector": "LOCAL", "baseSeverity": "HIGH", "vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H", "integrityImpact": "HIGH", "userInteraction": "NONE", "attackComplexity": "LOW", "availabilityImpact": "HIGH", "privilegesRequired": "LOW", "confidentialityImpact": "HIGH" } }, { "other": { "type": "ssvc", "content": { "id": "CVE-2025-21923", "role": "CISA Coordinator", "options": [ { "Exploitation": "none" }, { "Automatable": "no" }, { "Technical Impact": "total" } ], "version": "2.0.3", "timestamp": "2025-04-16T13:15:09.842820Z" } } } ], "problemTypes": [ { "descriptions": [ { "lang": "en", "type": "CWE", "cweId": "CWE-416", "description": "CWE-416 Use After Free" } ] } ], "title": "CISA ADP Vulnrichment", "providerMetadata": { "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0", "shortName": "CISA-ADP", "dateUpdated": "2025-04-16T13:19:53.000Z" } } ] } }