Skip to main content

Linux Kernel CVE-2026-68082

| EUVDEUVD-2026-54775 CRITICAL
2026-08-08 Linux GHSA-7xmj-3fxq-r5hp
9.8
CVSS 3.1 · Vendor: Linux
Share

Severity by source

Vendor (Linux) PRIMARY
9.8 CRITICAL
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
vuln.today AI
6.5 MEDIUM

Malicious OSD over the network (AV:N/PR:N) trivially crafts the reply (AC:L), but impact is a bounded OOB read: minor info leak (C:L), no real integrity change (I:N), and at most a client crash (A:L) - not RCE.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:L
4.0 AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:N/VA:L/SC:N/SI:N/SA:N

Primary rating from Vendor (Linux).

CVSS VectorVendor: Linux

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
High

Lifecycle Timeline

4
Analysis Generated
Aug 14, 2026 - 02:08 vuln.today
CVSS changed
Aug 13, 2026 - 23:37 NVD
9.8 (CRITICAL)
CVE Published
Aug 08, 2026 - 09:17 cve.org
CRITICAL 9.8
CVE Published
Aug 08, 2026 - 09:17 cve.org
UNKNOWN (no severity yet)

DescriptionCVE.org

In the Linux kernel, the following vulnerability has been resolved:

libceph: fix two unsafe bare decodes in decode_lockers()

decode_lockers() in cls_lock_client.c contains two bare decode operations that allow a malicious or compromised OSD to trigger slab-out-of-bounds reads:

  1. ceph_decode_32(p) at the num_lockers field has no preceding bounds

check. ceph_start_decoding() accepts struct_len=0 as valid -- the internal ceph_decode_need(p, end, 0, bad) always passes -- so when an OSD sends struct_len=0, ceph_start_decoding() returns success with p == end. The immediately following bare ceph_decode_32(p) then reads 4 bytes past the validated buffer boundary. The garbage value is passed directly to kzalloc_objs() as the locker count.

The sibling function decode_watchers() in osd_client.c already uses ceph_decode_32_safe() after its own ceph_start_decoding() call. decode_lockers() was the only site using the bare variant.

  1. ceph_decode_8(p) after the decode_locker() loop has no preceding

bounds check. If an OSD crafts num_lockers such that the loop advances p exactly to end, the subsequent bare ceph_decode_8(p) reads one byte past the validated buffer boundary. The result is passed directly into *type, which is used as a lock type discriminator by callers, giving an OSD-controlled one-byte OOB read with direct influence over the lock type field.

Fix both by replacing bare operations with their safe variants: ceph_decode_32(p) -> ceph_decode_32_safe(p, end, *num_lockers, err_inval) ceph_decode_8(p) -> ceph_decode_8_safe(p, end, *type, err_free_lockers)

The goto targets differ intentionally: err_inval: is a new label returning -EINVAL directly. It is used for the pre-allocation failure path where *lockers is not yet allocated and must not be passed to ceph_free_lockers().

err_free_lockers: is the existing label. It is used for the post-allocation failure path where *lockers is allocated and must be freed.

ret is set to -EINVAL before ceph_decode_8_safe() so that err_free_lockers returns the correct error code on bounds violation. Without this, err_free_lockers would return a stale ret value (0 from the successful decode_locker() loop), silently swallowing the error.

-EINVAL is correct for both failure paths. The data received from the OSD is structurally malformed. -ENOMEM would misrepresent the failure class to callers and to stable@ backporters triaging error paths.

Attacker model: a malicious or compromised OSD in a multi-tenant Ceph deployment can trigger this against any kernel client that issues the lock.get_info class method (e.g. during RBD exclusive lock acquisition).

[ idryomov: trim changelog, formatting ]

AnalysisAI

Out-of-bounds kernel memory reads in the Linux kernel's libceph client (decode_lockers() in net/ceph/cls_lock_client.c) let a malicious or compromised Ceph OSD trigger slab-out-of-bounds reads on any kernel client that issues the lock.get_info RADOS class method, such as during RBD exclusive-lock acquisition. A crafted reply with struct_len=0 causes a bare ceph_decode_32() to read 4 bytes past the validated buffer (feeding a garbage locker count into allocation), and a crafted num_lockers lets a subsequent bare ceph_decode_8() read one byte past the end, giving the OSD direct influence over the returned lock-type discriminator. There is no public exploit identified at time of analysis, and the EPSS score is low (0.20%, 10th percentile); the issue is a memory-safety information-leak/DoS rather than the remote code execution implied by the CNA's 9.8 rating.

Technical ContextAI

libceph is the in-kernel implementation of Ceph's RADOS protocol used by RBD (kernel block device) and CephFS clients. When a client calls the cls_lock 'get_info' object-class method, the OSD returns a serialized structure that decode_lockers() parses: ceph_start_decoding() validates an encoding header, then the code reads num_lockers, iterates decode_locker() for each entry, and finally reads a lock-type byte. The root cause is a classic CWE-125 (out-of-bounds read) driven by trusting a length-prefixed wire structure: ceph_start_decoding() treats struct_len=0 as valid (its internal ceph_decode_need(p, end, 0) always succeeds), leaving p==end, after which the 'bare' decode helpers (ceph_decode_32/ceph_decode_8) advance and dereference the pointer without re-checking against end. The sibling decode_watchers() in osd_client.c already used the bounds-checked *_safe variants; decode_lockers() was the lone unsafe caller. The fix swaps the bare calls for ceph_decode_32_safe()/ceph_decode_8_safe() with correct goto targets (err_inval before allocation, err_free_lockers after) and pre-sets ret=-EINVAL so a bounds violation is not silently swallowed.

RemediationAI

Vendor-released patch: upgrade to Linux 7.1.6 (stable) or 7.2-rc5 or later, which replace the unsafe bare decodes with the bounds-checked ceph_decode_32_safe()/ceph_decode_8_safe() variants; the fixes are stable commits a54be593d0b749161b08a1e56189b2cb9114267a and a109a556115271ca7896dcda7b4b7e45e156c227 (https://git.kernel.org/stable/c/a54be593d0b749161b08a1e56189b2cb9114267a). For distribution kernels, apply the vendor kernel update that references CVE-2026-68082 and reboot, or use livepatch where offered. Where immediate patching is not possible, reduce exposure by ensuring OSDs are trusted and hardened: enforce Ceph cephx authentication and msgr2 with encryption in transit, isolate the storage/cluster network so untrusted tenants cannot stand up or reach OSDs, and tighten CephX capabilities so tenant clients cannot control OSD behavior - the trade-off is operational overhead and no protection against a genuinely compromised OSD, since the trust model assumes OSDs are honest. On hosts that do not require kernel RBD/CephFS, avoid mounting kernel Ceph resources (use librados/userspace clients or unload the rbd/ceph modules) to keep the vulnerable decode_lockers() path unreachable; the side effect is loss of kernel-native RBD block devices on those hosts.

Vendor StatusVendor

SUSE

Product Status
SUSE Linux Enterprise Desktop 15 SP7 Affected
SUSE Linux Enterprise Desktop 15 SP7 Affected
SUSE Linux Enterprise High Availability Extension 15 SP7 Affected
SUSE Linux Enterprise High Availability Extension 15 SP7 Affected
SUSE Linux Enterprise High Availability Extension 16.0 Affected

Share

CVE-2026-68082 vulnerability details – vuln.today

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy