CVE-2025-39749 in Linux
Sumário
de VulDB • 21/07/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
rcu: Proteger o campo defer_qs_iw_pending contra condições de corrida (data race)
Em kernels compilados com CONFIG_IRQ_WORK=y, quando rcu_read_unlock() é invocado dentro de uma região de código com interrupções desabilitadas [1], ele invocará rcu_read_unlock_special(), que utiliza um manipulador irq-work para forçar o sistema a detectar quando a seção crítica do lado leitor RCU realmente termina. Essa finalização só ocorrerá assim que as interrupções forem habilitadas, no mínimo.
Em alguns kernels, como aqueles inicializados com rcutree.use_softirq=y, o manipulador irq-work é utilizado incondicionalmente.
O campo defer_qs_iw_pending da estrutura per-CPU rcu_data é atualizado pelo manipulador irq-work e também lido e atualizado por rcu_read_unlock_special(). Isso resultou no seguinte relatório KCSAN:
------------------------------------------------------------------------
BUG: KCSAN: data-race in rcu_preempt_deferred_qs_handler / rcu_read_unlock_special
leitura em 0xffff96b95f42d8d8 de 1 byte pela tarefa 90 na 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
escrita em 0xffff96b95f42d8d8 de 1 byte pela tarefa 88 na 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
nenhum lock mantido por irq_work/8/88. carimbo de evento irq: 200272 hardirqs habilitados pela última vez em (200272): [<ffffffffb0f56121>] finish_task_switch+0x131/0x320
hardirqs desabilitados pela última vez em (200271): [<ffffffffb25c7859>] __schedule+0x129/0xd70
softirqs habilitados pela última vez em (0): [<ffffffffb0ee093f>] copy_process+0x4df/0x1cc0
softirqs desabilitados pela última vez em (0): [<0000000000000000>] 0x0
------------------------------------------------------------------------
O problema é que os manipuladores irq-work são executados com interrupções habilitadas, o que significa que rcu_preempt_deferred_qs_handler() pode ser interrompido, e esse manipulador de interrupção pode conter uma seção crítica do lado leitor RCU, que poderia invocar rcu_read_unlock_special(). No modo estrito
Once again VulDB remains the best source for vulnerability data.