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

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

CVE-2026-89648

ceph: cap delegated inode count in ceph_parse_deleg_inos()

7.5 EPSS 0.6% AV:N

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

What to do, per Debian release

Debian's own status for CVE-2026-89648 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 12bookwormvulnerable6.1.190-1No fix published anywhere yet, neither in Debian nor upstream for the series bookworm tracks. Watch the Debian tracker page for this CVE. Advisories for bookworm have historically landed a median of 23 days after publication.
Debian 13trixievulnerable6.12.113-1No fix published anywhere yet, neither in Debian nor upstream for the series trixie tracks. Watch the Debian tracker page for this CVE. Advisories for trixie have historically landed a median of 11 days after publication.
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_parse_deleg_inos() decodes interval sets of delegated inode numbers from an MDS create-with-delegation reply. For each set it reads a 64-bit start and a 64-bit len with ceph_decode_64_safe(), which only validates that the eight bytes are present in the message, not the value, and then loops over len while inserting entries into s_delegated_inos. len is fully attacker controlled. A malicious or compromised MDS can send one huge interval, many intervals in one reply, duplicate intervals, or repeated replies that accumulate delegated inodes on the same session. The original code bounded none of these and could spin the insert loop or grow the xarray without limit. Bound both dimensions with a single enforcement point. Track the number of delegated inodes held by each MDS session in an atomic counter and grow it only in ceph_insert_deleg_ino(), which uses atomic_add_unless() to refuse to push the count past CEPH_MAX_DELEG_INOS. Because that helper is the only place the counter grows, the per-session population can never exceed the cap, so no separate per-session pre-check is needed. The counter is decremented when async create consumes a delegated inode or when an insert fails, incremented when a delegated inode is restored, initialized with the session xarray, and reset when reconnect destroys the xarray. A per-session cap alone still lets one reply spin the insert loop on duplicate ranges without growing the counter, so also cap the aggregate interval length accepted from a single reply. Together these bound both the loop trip count per reply and the xarray population across replies. The cap is a fixed, client-chosen constant rather than a value derived from the MDS. mds_client_prealloc_inos is a userspace MDS configuration option; it is never sent to the kernel client on the wire, and a server-supplied bound could not be trusted for a defensive limit in any case. The constant is set well above that option's documented default of 1000 (a generous multiple), so legitimate refill behavior is unaffected while the CPU and xarray memory a malformed delegation stream can consume stays bounded. Impact: a malicious or compromised Ceph MDS can no longer make a client spin through an unbounded delegated-inode interval or grow one session's delegated-inode xarray without limit.

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/mds_client.c
fs/ceph/mds_client.h
fs/ceph/super.h

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.5 high
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:Hsource recompute it
Attack vector
network (AV:N)source
EPSS
0.61%, higher than 48.1% of all CVEssource
CISA KEV
not listedthe KEV catalogue
Debian urgency
not yet assignedsource
Subsystem
fs/ceph

Upstream fixes

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

IntroducedFixed inCommit
5.76.18.51c040e139f1a6
5.77.2.4f341270ac5f5
5.77.34bd3158bd624

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:NAttack vector, network
ceph_parse_deleg_inos() runs in the ceph-msgr kworker via mds_dispatch()->handle_reply()->parse_reply_info() while decoding CEPH_MSG_CLIENT_REPLY extra data over TCP; on Ceph/Rook/Kubernetes nodes with CephFS mounted, a malicious or compromised MDS drives this remotely.
AC:LAttack complexity, low
The MDS fully controls the 64-bit interval len (ceph_decode_64_safe only checks that 8 bytes exist) and can advertise CEPHFS_FEATURE_DELEG_INO at session open. One crafted create-style reply with a huge or duplicate range deterministically spins xa_insert or grows s_delegated_inos on ordinary 64-bit CephFS clients.
PR:NPrivileges required, none
The attacker is the remote MDS peer on an already-connected kernel CephFS client and needs no Linux UID, capability, or init-namespace root on the victim, matching other MDS-reply client CVEs such as CVE-2026-80528.
UI:NUser interaction, none
Once CephFS is mounted, MDS replies are processed automatically in kworker context. parse_reply_info_extra selects the create decoder from the reply's attacker-controlled op field, so ordinary outstanding MDS traffic is enough; no further interactive victim action is required at exploit time.
S:UScope, unchanged
Impact is CPU and kernel-memory exhaustion inside the local CephFS client; it does not cross a VM, hypervisor, IOMMU, or other security-authority boundary.
C:NConfidentiality impact, none
The loop only inserts the fixed DELEGATED_INO_AVAILABLE marker into s_delegated_inos or retries on -EBUSY; there is no out-of-bounds read, use-after-free, or other kernel-memory disclosure primitive.
I:NIntegrity impact, none
xa_insert is used as a well-defined API storing a constant tagged value; the bug does not yield an arbitrary write, type confusion, or control-flow hijack, only unbounded legitimate xarray growth and CPU spinning.
A:HAvailability impact, high
An attacker-chosen 64-bit len can iterate without cond_resched(), soft-lockup the ceph-msgr worker (especially on duplicate ranges that return -EBUSY), and unbounded GFP_KERNEL xa_insert growth can exhaust kernel memory and hang or OOM the client.