data built 2026-10-19T13:16:53Z

Look up another CVE · open CVE-2026-89646 in the interactive tracker

CVE-2026-89646

ceph: fix leaked inode reference on writeback abort at umount

7.8 EPSS 0.2% AV:L

Published 2026-09-11 (37 days ago) by the Linux kernel CNA. Subsystem fs/ceph. Debian urgency: unimportant.

What to do, per Debian release

Debian's own status for CVE-2026-89646 in every release this site tracks, and what each one means in practice. Every status below is the one the Debian Security Team publishes for this CVE. source

ReleaseStatus VersionWhat this means
Debian 12bookwormnot affected6.1.190-1Nothing to do. bookworm never shipped the vulnerable code.
Debian 13trixienot affected6.12.113-1Nothing to do. trixie never shipped the vulnerable code.
Debian 14forkyfixed7.2.6-1Update the kernel and reboot. Fixed in 7.2.6-1. A running kernel keeps the old code until the machine restarts.
Debian unstablesidfixed7.2.6-1Update the kernel and reboot. Fixed in 7.2.6-1. A running kernel keeps the old code until the machine restarts.

The vulnerability

What the bug is

ceph_dirty_folio() takes a wrbuffer claim on each newly dirtied folio: it bumps i_wrbuffer_ref (taking an ihold() on the 0->1 transition) and attaches the snap_context to folio->private. That claim is released only by ceph_put_wrbuffer_cap_refs(), which for a submitted write runs from writepages_finish(). In ceph_submit_write(), if ceph_inc_osd_stopping_blocker() fails -- which happens during umount -- the request is aborted before submission: the already-collected folios are only redirtied and unlocked, so writepages_finish() never runs and the claim is leaked. redirty_page_for_writepage() -> folio_redirty_for_writepage() -> filemap_dirty_folio() sets PG_dirty directly and does not go through ->dirty_folio, so ceph_dirty_folio() is not re-entered to rebalance it. Because every subsequent writeback also fails the osd_stopping_blocker, i_wrbuffer_ref never returns to 0, the ihold() is never dropped, and the inode cannot be evicted: VFS: Busy inodes after unmount of ceph kernel BUG at fs/super.c:650! Release the orphaned claim in the abort path before redirtying, via ceph_undo_wrbuffer_claim(): detach the snap_context, drop the wrbuffer reference (letting i_wrbuffer_ref reach 0 and iput() the inode), and drop the snap_context reference -- i.e. do what writepages_finish() would have done for these never-submitted folios. Only the locked_pages entries are undone; folios still in the fbatch were never dirty-cleared by this call (folio_clear_dirty_for_io() is the ownership-transfer point, and a successful move NULLs the fbatch slot), so they hold no claim this call owns.

Where it lives

The fix touches these files. If the subsystem is one you do not use, the practical exposure is lower, though the package is still the vulnerable one.

fs/ceph/addr.c

What this is
CEPH DISTRIBUTED FILE SYSTEM CLIENT (CEPH)MAINTAINERS section matched on fs/ceph/ · ceph-devel@vger.kernel.org · Supported
Kernel module
ceph

Check it on the machine

grep -w CONFIG_CEPH_FS /boot/config-$(uname -r)

Reads the booted kernel's own configuration, on the machine and nowhere else. =y is built in, =m is a module, and an is not set line means the code is not there.

lsmod | grep -w ceph

Prints a line if that module is loaded right now, and nothing if it is not. One that is not loaded can still be loaded later by anything that needs it.

Show whether Debian builds this, per release

Debian builds this as a loadable module. Every release below compiles it as a module on every flavour, so whether the code is in the running kernel depends on whether that module is loaded.

  • bookworm, trixie, forky, sidm
m
a loadable module on every flavour - check lsmod, can be blacklisted
Build switch
CONFIG_CEPH_FS

From the configuration Debian publishes for every kernel flavour it builds. It covers only the architectures Debian ships a linux-config package for, and nothing about a kernel you built yourself. Debian's own status above stays authoritative about the source package.MAINTAINERS kbuild Makefiles Debian linux-config packages

Signals

Published
2026-09-11 (37 days ago)source
CVSS
7.8 high
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:Hsource recompute it
Attack vector
local (AV:L)source
EPSS
0.17%, higher than 6.3% of all CVEssource
CISA KEV
not listedthe KEV catalogue
Debian urgency
unimportantsource
Subsystem
fs/ceph

Upstream fixes

The versions the CNA records as introducing and fixing this, and the commit for each. source

IntroducedFixed inCommit
6.156.18.50ec32015a955c
6.157.2.4ac7a5a538576
6.157.3c25aee9c630f

Why the CNA scored it this way

Quoted from the kernel CNA's own scoring file, word for word. A highlighted metric carries the most severe value CVSS v3.1 defines for it, which is what pushes the score up. source

AV:LAttack vector, local
The leak is in ceph_submit_write() from ceph_writepages_start() during local VFS writeback on umount (ceph_kill_sb → sync_filesystem → do_writepages), not MDS/OSD message handlers. fs/ceph is a kernel client with no network-facing server listener.
AC:LAttack complexity, low
Dirtying pages then unmounting drives both sides: ceph_kill_sb waits at most mount_timeout (default 60s) or a killable signal, then sets STOPPING_FLUSHING while writepages_start still holds a blocker and locked folios, so the abort is reached reliably without an uncontrolled race.
PR:LPrivileges required, low
An unprivileged user with write access to an already-mounted CephFS can dirty pages; container/pod teardown, autofs, or systemd performs the umount. CephFS lacks FS_USERNS_MOUNT, but the attacker does not need CAP_SYS_ADMIN themselves.
UI:NUser interaction, none
The attacker dirties files and can trigger or wait for unmount via pod exit, autofs idle unmount, or their own umount; no separate victim action such as opening a file or mounting the filesystem is required.
S:UScope, unchanged
The leaked inode references and subsequent superblock teardown affect only the host kernel's VFS/Ceph client state within the same security authority; this is not a VM escape, IOMMU bypass, or sandbox escape.
C:HConfidentiality impact, high
The leaked ihold pins inodes through generic_shutdown_super so the superblock and ceph_fs_client are destroyed while those inodes remain. Later writeback or iput on the leftover mapping is a use-after-free of the freed superblock, scored High per UAF guidance.
I:HIntegrity impact, high
Inodes that survive umount retain address_spaces and pointers into destroyed ceph_fs_client/mdsc state. Subsequent iput_final/writeback operate on freed objects and poisoned i_op/s_op, a UAF write and control-flow primitive scored High.
A:HAvailability impact, high
Unmount reports "VFS: Busy inodes after unmount of ceph" and hits CHECK_DATA_CORRUPTION in generic_shutdown_super (BUG() with CONFIG_BUG_ON_DATA_CORRUPTION), and VFS_PTR_POISON on surviving inodes guarantees a later oops or panic.