Look up another CVE · open CVE-2026-89650 in the interactive tracker
CVE-2026-89650
ceph: bound num_export_targets array for mds info v2/v3
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-89650 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 | fixedDLA-4841-1 · 2026-10-17 · text | 6.1.190-1 | Update the kernel and reboot. DLA-4841-1 shipped the fix on 2026-10-17, in 6.1.190-1. A running kernel keeps the old code until the machine restarts. |
| Debian 13trixie | fixedDSA-6528-1 · 2026-09-29 · text | 6.12.111-1 | Update the kernel and reboot. DSA-6528-1 shipped the fix on 2026-09-29, in 6.12.111-1. A running kernel keeps the old code until the machine restarts. |
| 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. |
| Debian 12bookworm · linux-6.12 | fixedDLA-4817-1 · 2026-10-04 · text | 6.12.111-1~deb12u1 | Update the kernel and reboot. DLA-4817-1 shipped the fix on 2026-10-04, in 6.12.111-1~deb12u1. A running kernel keeps the old code until the machine restarts. |
The vulnerability
What the bug is
ceph_mdsmap_decode() in fs/ceph/mdsmap.c reads num_export_targets from each per-mds info record and advances the decode cursor by num_export_targets * sizeof(u32) without first checking that many bytes remain. The only upper-bound check that catches a runaway cursor (*p > info_end) is gated on info_v >= 4, because info_end is left NULL for info_v 2 and 3. When the monitor sends an MDS map whose per-mds info version is 2 or 3 with an oversized num_export_targets, the cursor moves past the message front buffer and the later export-targets loop calls the unchecked ceph_decode_32() on out-of-bounds memory. A kernel client processes CEPH_MSG_MDS_MAP from its monitor session (net/ceph/mon_client.c dispatches it; fs/ceph/super.c routes it to ceph_mdsc_handle_mdsmap(), which sets end to the front buffer bound and calls ceph_mdsmap_decode()). A malicious or compromised monitor, or an on-path attacker on an unsigned/unencrypted messenger session, can therefore drive an out-of-bounds read in the client kernel; on x86_64 with KASAN it is reported as a slab-out-of-bounds read in ceph_mdsmap_decode(). The decoded values land in the internal info->export_targets[] array, so the consequence is a kernel out-of-bounds read, not an information leak to the attacker. Impact: a malicious or compromised Ceph monitor sending an MDS map with a per-mds info version of 2 or 3 and an oversized num_export_targets field triggers an out-of-bounds read in the CephFS client kernel. Add a ceph_decode_need() for the export-targets array before advancing the cursor, so the bound is enforced for every info_v >= 2, not only info_v >= 4. This mirrors the count-then-need idiom already used for m_data_pg_pools later in the same function. Compute the export-targets byte count with size_mul() and reuse that checked length when advancing the cursor, so the attacker-controlled num_export_targets multiplication fails closed on overflow rather than relying on the later kcalloc() guard.
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/mdsmap.c
- 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, sid, bookworm · linux-6.12m
- 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
- 9.1 critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:Hsource recompute it - Attack vector
- network (AV:N)source
- EPSS
- 0.50%, higher than 41.6% 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 |
|---|---|---|
| 4.7 | 5.15.221 | 0c4bcc3ba729 |
| 4.7 | 6.1.188 | 55a06b32438c |
| 4.7 | 6.6.157 | eb3e1a1cb163 |
| 4.7 | 6.12.109 | 3bf7dba8dba9 |
| 4.7 | 6.18.50 | 58c2d3e954c1 |
| 4.7 | 7.2.4 | 332c444f4dc6 |
| 4.7 | 7.3 | a3eb169ee297 |
Debian advisories
| Advisory | Date | Shipped to | Debian |
|---|---|---|---|
| DLA-4841-1 | 2026-10-17 | bookworm 6.1.190-1 | tracker |
| DLA-4817-1 | 2026-10-04 | bookworm 6.12.111-1~deb12u1 | tracker |
| DSA-6528-1 | 2026-09-29 | trixie 6.12.111-1 | tracker |
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_MSG_MDS_MAP arrives over the kernel Ceph messenger TCP session from a monitor (mon_dispatch/extra_mon_dispatch) or MDS (mds_dispatch) and is decoded in ceph_mdsmap_decode(); a malicious cluster peer or on-path attacker on an unsigned msgr session reaches the bug with network data alone.
- AC:LAttack complexity, low
- The attacker fully controls per-mds info_v and num_export_targets; setting info_v to 2 or 3 (so info_end stays NULL) and an oversized count deterministically advances the cursor past msg->front and hits unchecked ceph_decode_32(), with no race or victim memory layout required.
- PR:NPrivileges required, none
- The attacker acts as the remote Ceph monitor or MDS peer (or MITM on msgr1/crc or auth_none); no local account, capability, or privilege on the victim CephFS client host is required.
- UI:NUser interaction, none
- Once CephFS is mounted, the kernel client subscribes to MDS maps and ceph_mdsc_handle_mdsmap() runs automatically on each update; no further mount, open, or interactive victim action is required at exploit time.
- S:UScope, unchanged
- The out-of-bounds read, any leaked heap bytes, and a possible oops stay inside the victim host kernel CephFS client and do not cross a VM, container, IOMMU, or other security authority.
- C:HConfidentiality impact, high
- An attacker-chosen num_export_targets drives an unbounded loop of unchecked ceph_decode_32() reads past the message front slab into adjacent kernel heap (KASAN slab-out-of-bounds); per kernel guidance an unbounded out-of-bounds read is Confidentiality High.
- I:NIntegrity impact, none
- OOB words are copied only into a correctly sized kcalloc'd export_targets array; overshooting the front buffer then fails later ceph_decode_32_safe() so the map is destroyed and never installed, giving no out-of-bounds write or control-flow primitive.
- A:HAvailability impact, high
- Walking an attacker-chosen number of u32s past the kmalloc'd msg->front object into unmapped or guarded pages oopses the ceph-msgr worker, and a failed decode also shuts down the mount via ceph_umount_begin(); both are repeatable on each crafted map.