CVE-2025-38016

Source
https://nvd.nist.gov/vuln/detail/CVE-2025-38016
Import Source
https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2025-38016.json
JSON Data
https://api.osv.dev/v1/vulns/CVE-2025-38016
Downstream
Published
2025-06-18T09:28:24Z
Modified
2025-10-22T12:17:02.830296Z
Summary
HID: bpf: abort dispatch if device destroyed
Details

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

HID: bpf: abort dispatch if device destroyed

The current HID bpf implementation assumes no output report/request will go through it after hidbpfdestroy_device() has been called. This leads to a bug that unplugging certain types of HID devices causes a cleaned- up SRCU to be accessed. The bug was previously a hidden failure until a recent x86 percpu change [1] made it access not-present pages.

The bug will be triggered if the conditions below are met:

A) a device under the driver has some LEDs on B) hidlldriver->request() is uninplemented (e.g., logitech-djreceiver)

If condition A is met, hidinputledworker() is always scheduled after hidbpfdestroy_device().

hiddestroydevice hid_bpf_destroy_device cleanupsrcustruct(&hdev->bpf.srcu) hid_remove_device ... led_classdev_unregister ledtriggerset(ledcdev, NULL) led_set_brightness(led_cdev, LED_OFF) ... input_inject_event inputeventdispose hidinput_input_event schedulework(&hid->ledwork) [hidinputled_worker]

This is fine when condition B is not met, where hidinputledworker() calls hidlldriver->request(). This is the case for most HID drivers, which implement it or use the generic one from usbhid. The driver itself or an underlying driver will then abort processing the request.

Otherwise, hidinputledworker() tries hidhwoutput_report() and leads to the bug.

hidinputledworker hid_hw_output_report dispatchhidbpfoutputreport srcu_read_lock(&hdev->bpf.srcu) srcureadunlock(&hdev->bpf.srcu, idx)

The bug has existed since the introduction [2] of dispatchhidbpfoutputreport(). However, the same bug also exists in dispatchhidbpfrawrequests(), and I've reproduced (no visible effect because of the lack of [1], but confirmed bpf.destroyed == 1) the bug against the commit (i.e., the Fixes:) introducing the function. This is because hidinputledworker() falls back to hidhwrawrequest() when hidlldriver->outputreport() is uninplemented (e.g., logitech- djreceiver).

hidinputledworker hid_hw_output_report: -ENOSYS hidhwrawrequest dispatch_hid_bpf_raw_requests srcureadlock(&hdev->bpf.srcu) ` srcuread_unlock(&hdev->bpf.srcu, idx)

Fix the issue by returning early in the two mentioned functions if hidbpf has been marked as destroyed. Though dispatchhidbpfdevice_event() handles input events, and there is no evidence that it may be called after the destruction, the same check, as a safety net, is also added to it to maintain the consistency among all dispatch functions.

The impact of the bug on other architectures is unclear. Even if it acts as a hidden failure, this is still dangerous because it corrupts whatever is on the address calculated by SRCU. Thus, CC'ing the stable list.

hidhwoutput_report")

References

Affected packages

Git / git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

Affected ranges

Type
GIT
Repo
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
Events
Introduced
8bd0488b5ea58655ad6fdcbe0408ef49b16882b1
Fixed
f8544be7e8e55b0ef23e1ab90e23e8d4d4aad3d3
Type
GIT
Repo
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
Events
Introduced
8bd0488b5ea58655ad6fdcbe0408ef49b16882b1
Fixed
e4b4fe25a4101d1ddb5884f40e149a3618983b66
Type
GIT
Repo
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
Events
Introduced
8bd0488b5ea58655ad6fdcbe0408ef49b16882b1
Fixed
578e1b96fad7402ff7e9c7648c8f1ad0225147c8

Affected versions

v6.*

v6.10
v6.10-rc3
v6.10-rc4
v6.10-rc5
v6.10-rc6
v6.10-rc7
v6.11
v6.11-rc1
v6.11-rc2
v6.11-rc3
v6.11-rc4
v6.11-rc5
v6.11-rc6
v6.11-rc7
v6.12
v6.12-rc1
v6.12-rc2
v6.12-rc3
v6.12-rc4
v6.12-rc5
v6.12-rc6
v6.12-rc7
v6.12.1
v6.12.10
v6.12.11
v6.12.12
v6.12.13
v6.12.14
v6.12.15
v6.12.16
v6.12.17
v6.12.18
v6.12.19
v6.12.2
v6.12.20
v6.12.21
v6.12.22
v6.12.23
v6.12.24
v6.12.25
v6.12.26
v6.12.27
v6.12.28
v6.12.29
v6.12.3
v6.12.4
v6.12.5
v6.12.6
v6.12.7
v6.12.8
v6.12.9
v6.13
v6.13-rc1
v6.13-rc2
v6.13-rc3
v6.13-rc4
v6.13-rc5
v6.13-rc6
v6.13-rc7
v6.14
v6.14-rc1
v6.14-rc2
v6.14-rc3
v6.14-rc4
v6.14-rc5
v6.14-rc6
v6.14-rc7
v6.14.1
v6.14.2
v6.14.3
v6.14.4
v6.14.5
v6.14.6
v6.14.7

Linux / Kernel

Package

Name
Kernel

Affected ranges

Type
ECOSYSTEM
Events
Introduced
6.11.0
Fixed
6.12.30
Type
ECOSYSTEM
Events
Introduced
6.13.0
Fixed
6.14.8