CVE-2026-89648
High · 7.5CVSS
7.5
EPSS
0.6%
Published
Sep 11, 2026
CISA due date
—
Cloudanix analysis
A storage server bug can let a bad server overload a computer's memory or processing power when handling file requests, potentially slowing or stopping access to files.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Low
- Impact
- Denial Of Service
- Component
- OS kernel
- Class
- Denial of service
- Remediation
- Patch
- Effort
- Medium
- Patch risk
- Low
What it actually does
Unbounded loop iterations and xarray growth in ceph_parse_deleg_inos() when processing attacker-controlled 64-bit len values and interval sets from MDS replies, allowing CPU spin or unbounded per-session memory consumption without any client-side bounds.
Why it matters to the business
A compromised or malicious Ceph MDS server can trigger denial-of-service conditions on Linux clients, exhausting CPU or memory resources on file-system operations and disrupting storage access across affected systems; the issue affects any deployment using the Ceph kernel client with MDS delegation features.
How an attack unfolds
An attacker who controls or compromises an MDS server crafts a create-with-delegation reply containing either a single enormous interval, many duplicate intervals, or repeated replies; the client decodes the len values without validation and loops or inserts into the xarray without limit until the session is overwhelmed.
How to fix it
Upgrade the Linux kernel to a version containing the upstream fix that enforces CEPH_MAX_DELEG_INOS per session via atomic_add_unless in ceph_insert_deleg_ino and caps aggregate interval length per reply; no configuration changes are required as the cap is a fixed client-side constant set well above normal usage.
How to confirm the fix worked
Confirm the presence of the bounding logic (atomic counter and per-reply length cap) in ceph_insert_deleg_ino and ceph_parse_deleg_inos in the running kernel source or binary; test by observing that delegated inode counts never exceed the cap even under crafted MDS traffic.
Typical attack path
- Gain control of an MDS server or position as a malicious MDS in the Ceph cluster
- Send a crafted create-with-delegation reply containing oversized or duplicate delegated inode intervals
- Trigger repeated parsing in ceph_parse_deleg_inos() on the client
- Cause either per-reply CPU spin or unbounded growth of the per-session delegated inode xarray
- Result in resource exhaustion and denial of service on the client
How to detect it
Inspect kernel logs and Ceph client traces for repeated or excessive delegated inode processing; correlate with high CPU or memory usage in processes handling MDS replies; look for session reconnection or xarray growth patterns after MDS communication.
What your security team should do
- Prioritize kernel upgrades on all Ceph clients within the next patch cycle given the 43-day publication window and slight EPSS increase
- Monitor Ceph MDS health and access controls to reduce risk of MDS compromise
- Review Ceph client logs and resource usage for unexpected spikes in delegated inode handling
- Apply the fix across the fleet before relying on any MDS-side configuration options
The record
In the Linux kernel, the following vulnerability has been resolved: ceph: cap delegated inode count in ceph_parse_deleg_inos() 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.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|