CVE-2026-68082: libceph: fix two unsafe bare decodes in decode_lockers()
In the Linux kernel, the following vulnerability has been resolved:
libceph: fix two unsafe bare decodes in decodelockers()
decodelockers() in clslockclient.c contains two bare decode operations that allow a malicious or compromised OSD to trigger slab-out-of-bounds reads:
1. cephdecode32(p) at the numlockers field has no preceding bounds check. cephstartdecoding() accepts structlen=0 as valid -- the internal cephdecodeneed(p, end, 0, bad) always passes -- so when an OSD sends structlen=0, cephstartdecoding() 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 kzallocobjs() as the locker count.
The sibling function decodewatchers() in osdclient.c already uses cephdecode32safe() after its own cephstartdecoding() call. decodelockers() was the only site using the bare variant.
2. cephdecode8(p) after the decodelocker() loop has no preceding bounds check. If an OSD crafts numlockers 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, errinval) cephdecode8(p) -> cephdecode8safe(p, end, type, errfreelockers)
The goto targets differ intentionally: errinval: 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 cephdecode8safe() so that errfreelockers returns the correct error code on bounds violation. Without this, errfreelockers would return a stale ret value (0 from the successful decodelocker() 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.getinfo class method (e.g. during RBD exclusive lock acquisition).
[ idryomov: trim changelog, formatting ]
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Configuration
In decode_lockers() in cls_lock_client.c, replace the two bare decode operations (ceph_decode_32(p) and ceph_decode_8(p)) with their safe variants: ceph_decode_32_safe(p, end, *num_lockers, ...) for the num_lockers field and ceph_decode_8_safe(p, end, *type, ...) for the type discriminator field, so OSD-controlled values cannot cause OOB reads.
libceph decode_lockers() (cls_lock_client.c) ceph_decode_32 / ceph_decode_8 usage = Use ceph_decode_32_safe and ceph_decode_8_safe with end bounds - Configuration
In decode_lockers() in cls_lock_client.c, ensure bounds violations set ret to -EINVAL before calling ceph_decode_8_safe(), and that failure handling uses the new err_inval label returning -EINVAL directly (instead of silently swallowing/using stale ret), so err_free_lockers returns the correct error code.
libceph decode_lockers() (cls_lock_client.c) error handling labels for bounds violations = Return -EINVAL directly (err_inval label)
Event History
Frequently Asked Questions
What is the severity of CVE-2026-68082?
CVE-2026-68082 has a risk rating of 33.
How do I fix CVE-2026-68082?
To fix CVE-2026-68082, update to the latest version of the Linux kernel that incorporates the patch for libceph.
What software is affected by CVE-2026-68082?
CVE-2026-68082 affects the Linux Kernel and libceph module.
What type of vulnerability is CVE-2026-68082?
CVE-2026-68082 is a vulnerability related to unsafe bare decode operations leading to slab-out-of-bounds reads.
When was CVE-2026-68082 published?
CVE-2026-68082 was published on August 8, 2026.