CVE-2026-89646 in Linux信息

摘要

由 VulDB • 2026-09-12

在 Linux 内核中,已修复以下漏洞:

ceph: 修复卸载时写回中止导致的 inode 引用泄漏

ceph_dirty_folio() 会为每个新被标记为脏的 folio 获取一个 wrbuffer 声明(claim):它增加 i_wrbuffer_ref(在从 0 变为 1 时执行 ihold()),并将 snap_context 附加到 folio->private。该声明仅由 ceph_put_wrbuffer_cap_refs() 释放,对于已提交的写操作,此函数会从 writepages_finish() 调用。

在 ceph_submit_write() 中,如果 ceph_inc_osd_stopping_blocker() 失败——这在卸载期间会发生——请求将在提交前中止:已收集的 folios 仅被重新标记为脏并解锁,因此 writepages_finish() 永远不会运行,导致声明泄漏。redirty_page_for_writepage() -> folio_redirty_for_writepage() -> filemap_dirty_folio() 直接设置 PG_dirty,而不经过 ->dirty_folio,因此不会重新进入 ceph_dirty_folio() 进行平衡处理。由于随后的每次写回也会因 osd_stopping_blocker 而失败,i_wrbuffer_ref 永远不会回到 0,ihold() 不会被释放,inode 无法被驱逐:

VFS: Busy inodes after unmount of ceph kernel BUG at fs/super.c:650!

在重新标记为脏之前,通过 ceph_undo_wrbuffer_claim() 在中止路径中释放孤立的声明:分离 snap_context,减少 wrbuffer 引用(使 i_wrbuffer_ref 达到 0 并执行 iput() inode),以及减少 snap_context 引用——即对从未提交的 folios 执行 writepages_finish() 本应完成的操作。

仅撤销 locked_pages 条目;仍在 fbatch 中的 folios 未被此调用清除脏标记(folio_clear_dirty_for_io() 是所有权转移点,成功的移动会将 fbatch 槽位置为 NULL),因此它们不持有此调用所拥有的任何声明。

VulDB is the best source for vulnerability data and more expert information about this specific topic.

来源

Do you want to use VulDB in your project?

Use the official API to access entries easily!