Description
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.

2. 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 ]
Published: 2026-08-08
Score: 9.8 Critical
EPSS: < 1% Very Low
KEV: No
Impact: n/a
Action: n/a
AI Analysis

Impact

The vulnerability resides in libceph’s decode_lockers() function where two unguarded decode calls allow a malicious or compromised Ceph OSD to transmit crafted data that causes the kernel to read beyond the end of a validated buffer. This results in the kernel exposing 4 or 1 bytes of memory that can be interpreted as the number of lockers and the lock type field, respectively. The exposed memory may reveal information about kernel structures, and the attacker can inject arbitrary values into the lock type field, potentially affecting lock semantics. The flaw is an out-of-bounds read, not a write, so it does not provide direct remote code execution but may aid in further attacks by corrupting the interpretation of lock metadata.

Affected Systems

All Linux kernel installations that include the cls_lock_client.c decode_lockers function before the patch commit a109a556 or its equivalents are potentially vulnerable. The advisory refers to the generic Linux kernel product. No explicit version ranges are given, so any kernel version older than the commit is considered at risk until updated.

Risk and Exploitability

With a CVSS score of 9.8 the vulnerability is classified as critical, although the EPSS score of <1% indicates a low probability of exploitation in the wild. The flaw requires a malicious or compromised Ceph OSD to send a malformed lock.get_info request to a kernel client. If the OSD is trusted within a multi‑tenant Ceph deployment, attackers can trigger the out-of-bounds reads and read sensitive kernel information or influence lock behavior. The vulnerability is listed as not in the CISA KEV catalog, but its high severity and potential to compromise cluster security suggest that affected environments should apply the fix promptly.

Generated by OpenCVE AI on August 14, 2026 at 04:27 UTC.

Remediation

No vendor fix or workaround currently provided.

OpenCVE Recommended Actions

  • Update the Linux kernel to a version that includes the fix introduced by commit a109a556, updating distribution packages accordingly.
  • If a patch is not available, apply the source code changes manually: replace the bare ceph_decode_32 and ceph_decode_8 calls in cls_lock_client.c with the corresponding safe variants ceph_decode_32_safe and ceph_decode_8_safe as described in the commit message.
  • Restrict access to Ceph ODS that can issue lock.get_info requests, ensuring that only authenticated and trusted ODS can send such commands; consider disabling or tightly restricting this RPC if it is not required for the workload.

Generated by OpenCVE AI on August 14, 2026 at 04:27 UTC.

Tracking

Sign in to view the affected projects.

Advisories
Source ID Title
Debian DSA Debian DSA DSA-6466-1 linux security update
History

Sun, 23 Aug 2026 13:15:00 +0000


Fri, 14 Aug 2026 04:45:00 +0000

Type Values Removed Values Added
Weaknesses CWE-129
CWE-535

Fri, 14 Aug 2026 02:30:00 +0000

Type Values Removed Values Added
Weaknesses CWE-119

Thu, 13 Aug 2026 22:45:00 +0000

Type Values Removed Values Added
Metrics cvssV3_1

{'score': 9.8, 'vector': 'CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H'}


Sat, 08 Aug 2026 10:45:00 +0000

Type Values Removed Values Added
Weaknesses CWE-119

Sat, 08 Aug 2026 09:45:00 +0000

Type Values Removed Values Added
Description 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. 2. 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 ]
Title libceph: fix two unsafe bare decodes in decode_lockers()
First Time appeared Linux
Linux linux Kernel
CPEs cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
Vendors & Products Linux
Linux linux Kernel
References

Subscriptions

Linux Linux Kernel
cve-icon MITRE

Status: PUBLISHED

Assigner: Linux

Published:

Updated: 2026-08-23T12:45:46.891Z

Reserved: 2026-07-30T09:28:09.367Z

Link: CVE-2026-68082

cve-icon Vulnrichment

No data.

cve-icon NVD

Status : Received

Published: 2026-08-08T10:16:55.377

Modified: 2026-08-23T13:16:32.583

Link: CVE-2026-68082

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-08-14T04:30:17Z

Weaknesses
  • CWE-129

    Improper Validation of Array Index

  • CWE-535

    Exposure of Information Through Shell Error Message