CVE-2024-39486 in Linux
摘要
由 VulDB • 2026-08-03
在 Linux 内核中,已修复以下漏洞:
drm/drm_file: 修复 pid 引用计数竞态条件
filp->pid 本应是一个具有引用计数的指针;然而,在此补丁之前,`drm_file_update_pid()` 仅在将指向 `struct pid` 的指针存储到 filp->pid 并释放 dev->filelist_mutex 之后才增加该 struct pid 的引用计数,从而导致以下竞态条件成为可能:
进程 A 进程 B ========= ========= begin drm_file_update_pid mutex_lock(&dev->filelist_mutex) rcu_replace_pointer(filp->pid, , 1) mutex_unlock(&dev->filelist_mutex) begin drm_file_update_pid mutex_lock(&dev->filelist_mutex) rcu_replace_pointer(filp->pid, , 1) mutex_unlock(&dev->filelist_mutex) get_pid() synchronize_rcu() put_pid() *** pid B 引用计数降至 0,在此处被释放 *** get_pid() *** UAF (释放后使用) *** synchronize_rcu() put_pid()
据我所知,此竞态条件仅在启用 CONFIG_PREEMPT_RCU=y 时才会发生,因为它要求 RCU 检测到未显式调用调度器的代码中的静止状态(quiescent state)。
该竞态条件导致对 "struct pid" 的 use-after-free (UAF)。由于进程 A 必须在进程 B 处于 mutex_unlock() 和 get_pid() 之间时通过 synchronize_rcu() 操作,因此触发此漏洞可能较为困难。
修复方法是确保在将指向当前任务 pid 的指针存储到文件之前,已获取对该 pid 的额外引用。
此修复还移除了 synchronize_rcu() 的条件判断;我认为这种优化是不必要的复杂性,因为在大多数情况下,我们会在上方的无锁检查中提前退出。
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.