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()
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
| Release | Status | Version | What this means |
|---|---|---|---|
| Debian 12bookworm | vulnerable | 6.1.190-1 | No 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 13trixie | vulnerable | 6.12.113-1 | No 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 14forky | fixed | 7.2.6-1 | Update the kernel and reboot. Fixed in 7.2.6-1. A running kernel keeps the old code until the machine restarts. |
| Debian unstablesid | fixed | 7.2.6-1 | Update 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 cephPrints 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
| Introduced | Fixed in | Commit |
|---|---|---|
| 5.7 | 6.18.51 | c040e139f1a6 |
| 5.7 | 7.2.4 | f341270ac5f5 |
| 5.7 | 7.3 | 4bd3158bd624 |
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.