CVE-2026-68160
Severity CVSS v4.0:
Pending analysis
Type:
Unavailable / Other
Publication date:
10/08/2026
Last modified:
19/08/2026
Description
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
ceph: fix pre-auth out-of-bounds read on snaptrace in ceph_handle_caps()<br />
<br />
ceph_handle_caps() reads snap_trace_len from the wire-format<br />
ceph_mds_caps header and uses it unconditionally to build a fake<br />
end pointer (snaptrace + snaptrace_len) that is later handed to<br />
ceph_update_snap_trace() in the CEPH_CAP_OP_IMPORT case:<br />
<br />
snaptrace = h + 1;<br />
snaptrace_len = le32_to_cpu(h->snap_trace_len);<br />
p = snaptrace + snaptrace_len;<br />
...<br />
case CEPH_CAP_OP_IMPORT:<br />
if (snaptrace_len) {<br />
...<br />
if (ceph_update_snap_trace(mdsc, snaptrace,<br />
snaptrace + snaptrace_len,<br />
false, &realm)) { ... }<br />
<br />
ceph_update_snap_trace() then decodes a struct ceph_mds_snap_realm<br />
from snaptrace using ceph_decode_need(&p, e, sizeof(*ri), bad)<br />
with the attacker-supplied fake end e == snaptrace + snaptrace_len.<br />
With snaptrace_len == 0xFFFFFFFF the bound check is trivially<br />
satisfied, ri = p reads sizeof(struct ceph_mds_snap_realm) past<br />
the legitimate msg->front buffer, and ri->num_snaps /<br />
ri->num_prior_parent_snaps then drive further out-of-bounds<br />
reads of the encoded snap arrays.<br />
<br />
The eleven msg_version >= 2 .. msg_version >= 12 decoder blocks<br />
above the op switch each catch this OOB through their<br />
ceph_decode_*_safe() / ceph_decode_need() helpers, but they sit<br />
behind a hdr.version-gated if, so a malicious or compromised<br />
MDS that sets msg->hdr.version = 1 reaches the IMPORT path with<br />
no version-gated decoder having validated snap_trace_len. The<br />
shape has been present since ceph_handle_caps() was introduced.<br />
<br />
Validate snap_trace_len against the message front buffer before<br />
consuming it, using the canonical ceph_decode_need() / ceph_has_room()<br />
helper. The helper bounds the length with subtraction (n = p) rather than pointer addition, so it is wrap-safe<br />
for the attacker-controlled u32 length on 32-bit builds where<br />
p + snap_trace_len could overflow the address space. This matches the<br />
rest of the ceph decode path (e.g. the pool_ns_len check a few lines<br />
below), and the existing goto bad cleanup already covers this exit<br />
path.
Impact
Base Score 3.x
9.80
Severity 3.x
CRITICAL
References to Advisories, Solutions, and Tools
- https://git.kernel.org/stable/c/03b417afce19ee6b6e61f1bbbbebac924c9f36d1
- https://git.kernel.org/stable/c/0c011137194036424e974677e0f1592e22a33d8c
- https://git.kernel.org/stable/c/4dbc71bcaf9a30abf3920a4e2cc4ed33bba78c02
- https://git.kernel.org/stable/c/71893c342a26bcff92eaab0b2b75d64aed19308a
- https://git.kernel.org/stable/c/9081c71796724ffe96cba253f68fbe42363c5295
- https://git.kernel.org/stable/c/a4228b93706fb74a484e6ffb271c1cc2af3a2ddb
- https://git.kernel.org/stable/c/cc93f68a31c9b831abf2db8647b5f5b10329d793
- https://git.kernel.org/stable/c/f913192fc782288e060dafc329b2346934be34cc


