CVE-2026-89648: ceph: cap delegated inode count in ceph_parse_deleg_inos()
In the Linux kernel, the following vulnerability has been resolved:
ceph: cap delegated inode count in cephparsedeleginos()
cephparsedeleginos() 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 cephdecode64safe(), which only validates that the eight bytes are present in the message, not the value, and then loops over len while inserting entries into sdelegatedinos.
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 cephinsertdelegino(), which uses atomicaddunless() to refuse to push the count past CEPHMAXDELEGINOS. 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. mdsclientpreallocinos 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 Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
ceph (Linux kernel)to a version that resolves this vulnerability.Fixed in resolved
Event History
Frequently Asked Questions
Which deployments are exposed to this issue?
Linux kernel Ceph clients that process MDS create-with-delegation replies are exposed when the replying MDS is malicious or compromised. The affected parsing occurs on delegated inode intervals supplied by that MDS.
What can a malicious MDS do to trigger resource exhaustion?
It can provide a very large interval length, many intervals in one reply, duplicate intervals, or repeated replies. These inputs could make the client spend excessive time inserting inode entries or grow its delegated-inode xarray without limit.
How does the resolved code limit the impact?
The fix tracks delegated inode entries per MDS session and prevents the count from exceeding CEPH_MAX_DELEG_INOS. The counter is increased only during insertion, so repeated or oversized delegation data cannot grow the per-session population beyond that cap.