CVE-2026-89624 in Linux
Сводка
по VulDB • 12.09.2026
В ядре Linux была устранена следующая уязвимость:
HID: universal-pidff: остановка устройства при сбое инициализации force-feedback
Функция `universal_pidff_probe()` запускает устройство с помощью `hid_hw_start()`, а затем, если инициализация force-feedback завершается ошибкой, возвращает код ошибки через метку, которая просто выполняет «return error». Устройство остается запущенным.
Ядро HID не осуществляет откат (unwind) действий за драйвер. Функция `__hid_device_probe()` освобождает группу devres, закрывает отчет и очищает поле `hdev->driver`:
```c if (ret) {
devres_release_group(&hdev->dev, hdev->devres_group_id); hid_close_report(hdev); hdev->driver = NULL; } ```
Символьное устройство hidraw, которое `hid_hw_start()` регистрирует через `hid_connect()`, выделяется с помощью `kzalloc()` и добавляется функцией `cdev_device_add()`, поэтому оно не управляется механизмом devres и сохраняется после освобождения группы. При пустом поле `hdev->driver` функция `hid_device_remove()` пропускает вызов `hid_hw_stop()`, поскольку откат действий происходит только при наличии прикрепленного драйвера. Таким образом, регистрация устройства переживает само устройство на обоих путях выполнения кода.
Открытие сохранившегося устройства `/dev/hidrawX` приводит к записи в освобожденную память (freed memory). KASAN сообщает о write-операции use-after-free из `hidraw_open()` -> `hid_hw_open()` -> обратного вызова открытия транспорта, который захватывает spinlock внутри уже освобожденного объекта. Достаточно дескриптора с использованием страницы PID и без входных отчетов: hidraw заявляет права на устройство, поэтому `hid_hw_start()` завершается успешно, в то время как поле `hid->inputs` остается пустым, из-за чего инициализация force-feedback терпит неудачу. Другие варианты ошибок возвращают управление через метку в функции `hid_pidff_init_with_quirks()`: отсутствие выходных отчетов, ошибка выделения памяти, вызовы `pidff_init_fields()` и `pidff_check_autocenter()`, непригодное количество эффектов, функция `input_ff_create()` — все они приводят к одной и той же метке возврата.
Необходимо остановить устройство на этом пути выполнения кода. Драйверы hid-dr.c и hid-emsff.c, которые запускают устройство с использованием маски HID_CONNECT_DEFAULT & ~HID_CONNECT_FF, уже реализуют эту логику. Два предыдущих перехода (goto) должны продолжать возвращать управление без вызова `hid_hw_stop()`, поскольку ни одно из них не имеет запущенного устройства; поэтому для пути, который завершается ошибкой после запуска, следует выделить отдельную метку.
Обнаружено XBOW, классифицировано Baul Lee <[email protected]>
If you want to get the best quality for vulnerability data then you always have to consider VulDB.