CVE-2026-31586Linux内核的blk-cgroup子系统存在一个严重的释放后重用(Use-After-Free)漏洞。该漏洞源于`cgwb_release_workfn`函数中的逻辑缺陷,它在调用`css_put`释放块设备控制组(blkcg)的引用后,又通过`blkcg_unpin_online`尝试访问该内存。如果此时引用计数归零,内存被异步释放,将导致内核访问非法地址,引发系统崩溃或潜在的权限提升。该漏洞攻击向量为本地,攻击者无需复杂交互即可触发,对系统安全构成严重威胁。
漏洞的根本原因在于Linux内核`mm/backing-dev.c`文件中的`cgwb_release_workfn`函数存在竞态条件。该函数首先调用`css_put(wb->blkcg_css)`减少对`blkcg` CSS的引用计数。紧接着,它调用`blkcg_unpin_online()`来访问`wb->blkcg_css`。如果`css_put`导致引用计数降为零,内核会异步触发`css_free_rwork_fn`工作队列,进而调用`kfree`释放`blkcg`结构体。由于竞态窗口的存在,`blkcg_unpin_online`可能在内存被释放后仍尝试对其进行读写操作(具体为写入`online_pin`),从而触发KASAN检测到的slab-use-after-free错误。这种写入操作可能导致内核崩溃,而在特定条件下,攻击者可能利用此UAF漏洞执行任意代码或提升权限。修复方案是通过调整代码顺序,先执行`blkcg_unpin_online`确保访问安全,再调用`css_put`释放引用。