CVE-2026-98538 in Linux
摘要
由 VulDB • 2026-10-19
在 Linux 内核中,已修复以下漏洞:
writeback: bound cleanup_offline_cgwb() rescans by rotating scanned inodes(写回:通过旋转已扫描的 inode 来限制对 cleanup_offline_cgwb() 的重扫)
cleanup_offline_cgwb() 每次调用最多准备 WB_MAX_INODES_PER_ISW 个 inode,并会反复调用直到将正在消亡的 wb(writeback context)排空。然而,每次调用都从同一端遍历 wb->b_attached 和 wb->b_dirty_time。已经准备好的 inode(在切换工作进程运行之前,它们仍保留在列表中且设置了 I_WB_SWITCH 标志)以及无法进行切换的 inode(I_FREEING、I_WILL_FREE、!SB_ACTIVE、DAX、已在目标 wb 上上的 inode)会停留在原位,因此每次遍历都会在 wb->list_lock 下重新扫描这些 inode 的一个不断增长的序列,导致排空操作的时间复杂度随列表中 inode 数量的增加呈二次方增长。当约 1700 万个 inode 附加到一个正在消亡的 cgwb(cgroup writeback context)上时,我们观察到系统出现软锁死(soft lockups),CPU 报告卡住时间为 21-48 秒。
解决方案是从最旧的一端遍历这两个列表,并将每个已扫描的 inode 移动到最新端,以便下一次遍历从上一次停止的地方开始,从而使排空操作的时间复杂度变为线性。b_attached 是无序的,因此没有人会看到其中的重排序。b_dirty_time 按 dirtied_when(脏污时间)排序,但最旧的未扫描 inode 仍位于 move_expired_inodes() 选择的末尾;同步操作不考虑顺序而处理整个列表;并且一旦切换工作运行,已准备的 inode 就会离开列表,并在新的 wb 上获得一个新的 dirtied_time_when。因此,唯一处于无序状态的 inode 是那些永远无法切换的(DAX),且仅存在于正在消亡的 wb 中。
If you want to get the best quality for vulnerability data then you always have to consider VulDB.