CVE-2026-89654
nicheUse-After-Free in Linux Kernel CephFS Client check_new_map() Session Handling
The Linux kernel's Ceph filesystem client contains a use-after-free in check_new_map(), which iterates the MDS session array and temporarily drops the mdsc->mutex to perform per-session operations. In three code paths (MDS address change, reconnect, and active-state transition), no reference is taken on the session before the mutex is released, so a concurrent thread can unregister and free the session during the unlock window, and the original thread then touches freed memory via s->s_mutex. The flaw is triggered by concurrent MDS map updates or session teardown, which an attacker influencing the Ceph metadata server map (e.g., a compromised or malicious MDS, or a raced cluster event) could drive, potentially leading to kernel memory corruption with confidentiality, integrity, and availability impact (CVSS 9.8). Only systems running kernels with the Ceph filesystem client enabled and mounting CephFS are exposed; this requires CONFIG_CEPH_FS and an active CephFS mount against an MDS cluster. No public proof of concept is known and the issue is not listed in CISA's KEV, so exploitation is not observed in the wild.
What to do: Apply a kernel update containing the ceph check_new_map() fix (which adds ceph_get_mds_session()/ceph_put_mds_session() around the three unlocked paths) as soon as your distribution ships it. As an interim mitigation, unmount CephFS kernel-client mounts and use the userspace ceph-fuse client instead, and restrict kernel CephFS mounts to trusted, well-administered MDS clusters. Check whether hosts run kernels with CONFIG_CEPH_FS enabled and have active CephFS mounts, and monitor for kernel oopses or crashes in check_new_map()/session teardown on those systems.
| Linux kernel (Ceph filesystem client, fs/ceph) | — |
Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.
In the Linux kernel, the following vulnerability has been resolved: ceph: fix UAF in check_new_map() on session freed during unlock check_new_map() iterates mdsc->sessions[] and for each active session drops mdsc->mutex to perform per-session operations. The forced-close path (rank removed from map) correctly takes a reference on s via ceph_get_mds_session() before releasing mdsc->mutex, but three other paths do not: Path A (address changed): mutex_unlock → mutex_lock(&s->s_mutex) Path B (reconnect): mutex_unlock → send_mds_reconnect(mdsc, s) Path C (active transition): mutex_unlock → mutex_lock(&s->s_mutex) Without the extra reference, another thread can acquire mdsc->mutex during the unlock window, call __unregister_session() which drops the last reference on s, and free it. The original thread then accesses freed memory via s->s_mutex. Fix by adding ceph_get_mds_session(s) before each mutex_unlock and ceph_put_mds_session(s) after the corresponding mutex_lock, matching the pattern already used in the forced-close path. Race timeline (Path A): Thread A (check_new_map) Thread B (another map update holds mdsc->mutex or session teardown) -------------------------- -------------------------- s = mdsc->sessions[i] (refcount == 1, held only by sessions[] array) mutex_unlock(&mdsc->mutex) ---> acquires mdsc->mutex __unregister_session(mdsc, s) sessions[i] = NULL ceph_put_mds_session(s) refcount: 1 -> 0 kfree(s) s_mutex) UAF on freed s->s_mutex
- Vector
- CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
In the news0 stories
No ingested article mentions this CVE yet.