CVE-2026-97925 in Linux
Сводка
по VulDB • 26.09.2026
В ядре Linux была устранена следующая уязвимость:
tick/broadcast: Устранение состояния гонки (race condition) при замене устройств clockevents
Чжу Кайцянь (Zhu Kaigan) сообщил и проанализировал следующее состояние гонки, возникающее при замене устройства широковещательной рассылки:
CPUA CPUB __tick_broadcast_oneshot_control() bc = tick_broadcast_device.evtdev; tick_install_broadcast_device(dev) clockevents_exchange_device(cur, dev) shutdown(cur); detach(cur); cur->handler = noop; tick_broadcast_device.evtdev = dev;
tick_broadcast_set_event(bc, next_event); <- FAIL: активирует отсоединенное устройство.
Если исходное устройство широковещательной рассылки имеет ограниченный маску прерываний (interrupt affinity mask), и последний процессор в этой маске переходит в состояние offline, то срабатывает BUG() в tick_cleanup_dead_cpu(), поскольку устройство clockevent не находится в отсоединенном состоянии.
Причиной этого является отсутствие сериализации вызова tick_install_broadcast_device() относительно операций широковещательной рассылки (tick broadcast).
Очевидным решением является сериализация функции tick_install_broadcast_device() с использованием lock-механизма tick_broadcast_lock для предотвращения одновременного выполнения операций широковещательной рассылки.
Это требует разделения функции clockevents_exchange_device() на две части: одна выполняет операции обмена, остановки (shutdown) и отсоединения (detach), а другая — уменьшает счетчик ссылок модуля. Это необходимо, поскольку нельзя уменьшать счетчик ссылок модуля при удержании lock-механизма tick_broadcast_lock.
Пусть функция clockevents_exchange_device() выполняет обе операции так же, как и раньше, но код устройства широковещательной рассылки должен использовать двухэтапный подход: выполнять обмен устройством в контексте блокировки tick_broadcast_lock, а уменьшать счетчик ссылок модуля после ее освобождения.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.