{"id":5191,"date":"2026-09-04T18:47:04","date_gmt":"2026-09-04T10:47:04","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-68082"},"modified":"2026-09-04T18:47:04","modified_gmt":"2026-09-04T10:47:04","slug":"cve-2026-68082","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-68082","title":{"rendered":"CVE-2026-68082 [CRITICAL] &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nlibceph: fix two unsa"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>libceph: fix two unsafe bare decodes in decode_lockers()<\/p>\n<p>decode_lockers() in cls_lock_client.c contains two bare decode operations<br \/>\nthat allow a malicious or compromised OSD to trigger slab-out-of-bounds<br \/>\nreads:<\/p>\n<p>1. ceph_decode_32(p) at the num_lockers field has no preceding bounds<br \/>\n   check. ceph_start_decoding() accepts struct_len=0 as valid &#8212; the<br \/>\n   internal ceph_decode_need(p, end, 0, bad) always passes &#8212; so when an<br \/>\n   OSD sends struct_len=0, ceph_start_decoding() returns success with<br \/>\n   p == end. The immediately following bare ceph_decode_32(p) then reads<br \/>\n   4 bytes past the validated buffer boundary. The garbage value is<br \/>\n   passed directly to kzalloc_objs() as the locker count.<\/p>\n<p>   The sibling function decode_watchers() in osd_client.c already uses<br \/>\n   ceph_decode_32_safe() after its own ceph_start_decoding() call.<br \/>\n   decode_lockers() was the only site using the bare variant.<\/p>\n<p>2. ceph_decode_8(p) after the decode_locker() loop has no preceding<br \/>\n   bounds check. If an OSD crafts num_lockers such that the loop<br \/>\n   advances p exactly to end, the subsequent bare ceph_decode_8(p) reads<br \/>\n   one byte past the validated buffer boundary. The result is passed<br \/>\n   directly into *type, which is used as a lock type discriminator by<br \/>\n   callers, giving an OSD-controlled one-byte OOB read with direct<br \/>\n   influence over the lock type field.<\/p>\n<p>Fix both by replacing bare operations with their safe variants:<br \/>\n  ceph_decode_32(p) -&gt; ceph_decode_32_safe(p, end, *num_lockers,<br \/>\n                                           err_inval)<br \/>\n  ceph_decode_8(p)  -&gt; ceph_decode_8_safe(p, end, *type,<br \/>\n                                          err_free_lockers)<\/p>\n<p>The goto targets differ intentionally:<br \/>\n  err_inval: is a new label returning -EINVAL directly. It is used for<br \/>\n  the pre-allocation failure path where *lockers is not yet allocated<br \/>\n  and must not be passed to ceph_free_lockers().<\/p>\n<p>  err_free_lockers: is the existing label. It is used for the<br \/>\n  post-allocation failure path where *lockers is allocated and must<br \/>\n  be freed.<\/p>\n<p>ret is set to -EINVAL before ceph_decode_8_safe() so that<br \/>\nerr_free_lockers returns the correct error code on bounds violation.<br \/>\nWithout this, err_free_lockers would return a stale ret value (0 from<br \/>\nthe successful decode_locker() loop), silently swallowing the error.<\/p>\n<p>-EINVAL is correct for both failure paths. The data received from the<br \/>\nOSD is structurally malformed. -ENOMEM would misrepresent the failure<br \/>\nclass to callers and to stable@ backporters triaging error paths.<\/p>\n<p>Attacker model: a malicious or compromised OSD in a multi-tenant Ceph<br \/>\ndeployment can trigger this against any kernel client that issues the<br \/>\nlock.get_info class method (e.g. during RBD exclusive lock acquisition).<\/p>\n<p>[ idryomov: trim changelog, formatting ]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>libceph: fix two unsafe bare decodes in decode_lockers()<\/p>\n<p>decode_lockers() in cls_lock_client.c contains two bare decode operations<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-5191","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/5191","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5191"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5191"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5191"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}