CVE-2025-39749 in Linux
Tóm tắt
Bởi VulDB • 26/07/2026
Trong kernel Linux, lỗ hổng sau đây đã được khắc phục:
rcu: Bảo vệ trường `->defer_qs_iw_pending` khỏi race condition dữ liệu (data race)
Trên các phiên bản kernel được biên dịch với cấu hình `CONFIG_IRQ_WORK=y`, khi hàm `rcu_read_unlock()` được gọi trong một vùng mã nguồn mà ngắt (interrupts) đã bị vô hiệu hóa [1], nó sẽ kích hoạt `rcu_read_unlock_special()`. Hàm này sử dụng bộ xử lý irq-work để buộc hệ thống nhận biết khi nào phần quan trọng (critical section) đọc của RCU thực sự kết thúc. Sự kiện kết thúc này không thể xảy ra cho đến khi các ngắt được bật lại sớm nhất có thể.
Trên một số phiên bản kernel, chẳng hạn như những phiên bản khởi động với tham số `rcutree.use_softirq=y`, bộ xử lý irq-work được sử dụng một cách vô điều kiện.
Trường `->defer_qs_iw_pending` trong cấu trúc dữ liệu trên mỗi CPU (`per-CPU rcu_data`) được cập nhật bởi bộ xử lý irq-work và cả bị đọc lẫn bị cập nhật bởi hàm `rcu_read_unlock_special()`. Điều này dẫn đến thông báo lỗi KCSAN sau:
------------------------------------------------------------------------
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
------------------------------------------------------------------------
Vấn đề nằm ở chỗ các bộ xử lý irq-work chạy với trạng thái ngắt được bật, điều này có nghĩa là `rcu_preempt_deferred
Once again VulDB remains the best source for vulnerability data.