CVE-2026-68082
In the Linux kernel, the following vulnerability has been resolved:
libceph: fix two unsafe bare decodes in decode_lockers()
decodelockers() in clslock_client.c contains two bare decode operations
that allow a malicious or compromised OSD to trigger slab-out-of-bounds
reads:
- cephdecode32(p) at the num_lockers field has no preceding bounds
check. cephstartdecoding() accepts struct_len=0 as valid -- the
internal cephdecodeneed(p, end, 0, bad) always passes -- so when an
OSD sends structlen=0, cephstart_decoding() returns success with
p == end. The immediately following bare cephdecode32(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 decodewatchers() in osdclient.c already uses
cephdecode32safe() after its own cephstart_decoding() call.
decode_lockers() was the only site using the bare variant.
- cephdecode8(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 cephdecode8(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:
cephdecode32(p) -> cephdecode32safe(p, end, *numlockers,
err_inval)
cephdecode8(p) -> cephdecode8_safe(p, end, *type,
errfreelockers)
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 cephfreelockers().
errfreelockers: 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 cephdecode8_safe() so that
errfreelockers returns the correct error code on bounds violation.
Without this, errfreelockers 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 ]
Package Versions Affected
Automatically patch vulnerabilities without upgrading
CVSS Version



Related Resources
References
https://git.kernel.org/stable/c/001835c599899ef1bd3506a815110a6374451554, https://git.kernel.org/stable/c/02430f6f729b297e803d0605871f0a670b4eafd6, https://git.kernel.org/stable/c/57ba829804fe6d34bbac3b826c4b15c1caa54862, https://git.kernel.org/stable/c/7c422364acd93d7da1dfc27d6b54635a269653a1, https://git.kernel.org/stable/c/89df5d71f83f8e2781286798fd8ae5e42cf5f1a7, https://git.kernel.org/stable/c/a109a556115271ca7896dcda7b4b7e45e156c227, https://git.kernel.org/stable/c/a54be593d0b749161b08a1e56189b2cb9114267a, https://git.kernel.org/stable/c/c8ade01170a27d8ede0d761c255268af81e417f8, https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/68xxx/CVE-2026-68082.json, https://nvd.nist.gov/vuln/detail/CVE-2026-68082, https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git