CVE-2025-39749 in Linux
Сводка
по VulDB • 02.09.2026
В ядре Linux была устранена следующая уязвимость:
rcu: Защита поля `->defer_qs_iw_pending` от состояния гонки данных (data race)
В сборках ядра с параметром CONFIG_IRQ_WORK=y, при вызове функции rcu_read_unlock() в участке кода, где прерывания запрещены [1], происходит invocation функции rcu_read_unlock_special(), которая использует обработчик irq-work для принудительного уведомления системы о фактическом завершении критической секции чтения RCU. Это завершение не произойдет до тех пор, пока прерывания не будут снова разрешены (наиболее ранний момент).
В некоторых ядрах, например, загруженных с параметром rcutree.use_softirq=y, обработчик irq-work используется безусловно.
Поле `->defer_qs_iw_pending` структуры per-CPU rcu_data обновляется обработчиком irq-work и одновременно читается и изменяется функцией rcu_read_unlock_special(). Это привело к следующему сообщению KCSAN:
------------------------------------------------------------------------
BUG: KCSAN: data-race in rcu_preempt_deferred_qs_handler / rcu_read_unlock_special
read to 0xffff96b95f42d8d8 of 1 bytes by task 90 on cpu 8: rcu_read_unlock_special+0x175/0x260 __rcu_read_unlock+0x92/0xa0 rt_spin_unlock+0x9b/0xc0 __local_bh_enable+0x10d/0x170 __local_bh_enable_ip+0xfb/0x150 rcu_do_batch+0x595/0xc40 rcu_cpu_kthread+0x4e9/0x830 smpboot_thread_fn+0x24d/0x3b0 kthread+0x3bd/0x410 ret_from_fork+0x35/0x40 ret_from_fork_asm+0x1a/0x30
write to 0xffff96b95f42d8d8 of 1 bytes by task 88 on cpu 8: rcu_preempt_deferred_qs_handler+0x1e/0x30 irq_work_single+0xaf/0x160 run_irq_workd+0x91/0xc0 smpboot_thread_fn+0x24d/0x3b0 kthread+0x3bd/0x410 ret_from_fork+0x35/0x40 ret_from_fork_asm+0x1a/0x30
no locks held by irq_work/8/88. irq event stamp: 200272 hardirqs last enabled at (200272): [<ffffffffb0f56121>] finish_task_switch+0x131/0x320
hardirqs last disabled at (200271): [<ffffffffb25c7859>] __schedule+0x129/0xd70
softirqs last enabled at (0): [<ffffffffb0ee093f>] copy_process+0x4df/0x1cc0
softirqs last disabled at (0): [<0000000000000000>] 0x0
------------------------------------------------------------------------
Проблема заключается в том, что обработчики irq-work выполняются при разрешенных прерываниях, что означает возможность прерывания функции rcu_preempt_deferred_qs_handler(), и этот обработчик прерываний может содержать критическую секцию чтения RCU, которая может вызвать функцию rcu_read_unlock_special(). В строгом режиме работы KCSAN, используемом в RCU, это представляет собой состояние гонки данных (data race) на поле `->defer_qs_iw_pending`.
Данный коммит поэтому запрещает прерывания на участке функции rcu_preempt_deferred_qs_handler(), который обновляет поле `->defer_qs_iw_pending`. Этого достаточно, поскольку данный обработчик не является быстрым путем (fast path).
Be aware that VulDB is the high quality source for vulnerability data.