KernelScan.io

HIGH

hid PidffInit UAF

CVE-2026-89624

CVSS 7.8 / 10.0 NVD

CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

KernelScan AI6.6MEDIUM

01

In the Linux kernel, the following vulnerability has been resolved: HID: universal-pidff: stop the device when force-feedback init fails universal_pidff_probe() starts the device with hid_hw_start() and then, if force-feedback initialisation fails, returns the error through a label that only does "return error". The device is left started. The HID core does not unwind on the driver's behalf. __hid_device_probe() releases the devres group, closes the report and clears hdev->driver: if (ret) { devres_release_group(&hdev->dev, hdev->devres_group_id); hid_close_report(hdev); hdev->driver = NULL; } The hidraw character device that hid_hw_start() registered through hid_connect() is allocated with kzalloc() and added with cdev_device_add(), so it is not devres-managed and survives that. With hdev->driver NULL, hid_device_remove() skips hid_hw_stop() as well, because it only unwinds while a driver is still attached. The registration therefore outlives the device on both paths. Opening the surviving /dev/hidrawX writes into freed memory. KASAN reports a use-after-free write from hidraw_open() -> hid_hw_open() -> the transport's open callback, which takes a spinlock inside the freed object. A descriptor that carries a PID usage page and no input reports is enough: hidraw claims the device so hid_hw_start() succeeds, while hid->inputs stays empty so force-feedback init fails. The other failure returns in hid_pidff_init_with_quirks() - no output reports, an allocation failure, pidff_init_fields(), pidff_check_autocenter(), an unusable effect count, input_ff_create() - all reach the same label. Stop the device on that path. hid-dr.c and hid-emsff.c, which start the device with the same HID_CONNECT_DEFAULT & ~HID_CONNECT_FF mask, already do this. The two earlier gotos must keep returning without hid_hw_stop(), since neither has a started device, so give the path that fails after the start its own label. Discovered by XBOW, triaged by Baul Lee <baul.lee@xbow.com>

02

Engine v0.6.0

Risk summary

A crafted USB HID device advertising a force-feedback usage page but lacking input reports causes the universal-pidff driver to leave a hidraw character device registered after the underlying HID device is torn down. Opening the stale device node triggers a use-after-free write into freed kernel memory. Exploitation requires physical access to plug in the malicious device and then open the resulting character device.

Affecteddrivers/hid/hid-universal-pidff.c (HID universal-pidff driver)

Vulnerability analysis

When a USB HID device advertising a force-feedback usage page but lacking input reports is connected, the universal-pidff driver starts the device and registers a hidraw character device, then fails force-feedback initialization. The error path returns without stopping the device, so the HID core tears down the underlying device structures while the hidraw character device remains registered. Opening the surviving character device node triggers a use-after-free write into the freed device memory. The fix adds a call to stop the device on the failure path, ensuring the hidraw registration is unwound before the error is returned. Exploitation requires physical access to plug in a crafted USB HID device, followed by opening the stale device node.

03

BranchIntroducedFixed inPatch commit
6.126.12.246.12.111519fa26695b0
6.136.13.126.1401d9874e84d3
6.146.14.36.15c457bb516b61
6.18—6.18.50ce08c5555cab
6.66.6.886.6.16066358f5789c9
7.2—7.2.4—
mainline—7.3—
cip/6.12—6.12.111-cip32519fa26695b0

04

State of the newest release of each Civil Infrastructure Platform SLTS tree, from CIP's own fix records.

CIP treeState
cip/6.12Fixed in 6.12.111-cip32