CVE-2026-80557: libceph: fix OOB read in decode_watchers() via missing bounds check

Published Aug 26, 2026
·
Updated

In the Linux kernel, the following vulnerability has been resolved:

libceph: fix OOB read in decodewatchers() via missing bounds check

cephstartdecoding() validates that structlen bytes remain in the buffer after the encoding header, but accepts structlen=0 as valid: cephdecodeneed(p, end, 0, bad) always passes. When a malicious or compromised OSD sends an objlistwatchresponset reply with structlen=0, cephstartdecoding() returns success with p == end, leaving zero bytes guaranteed for subsequent reads.

The immediately following cephdecode32(p) in decodewatchers() has no preceding bounds check. With p == end this is a 4-byte read past the validated buffer boundary. The garbage value is then passed directly to kzallocobjs() as the watcher count.

The sibling function decodewatcher() already uses the safe variants (cephdecodecopysafe, cephdecode64safe, cephdecodeskip32) after its own cephstartdecoding() call. decodewatchers() is the only site that uses the bare variant, confirming an oversight.

Fix by replacing cephdecode32(p) with cephdecode32safe(p, end, numwatchers, bad), consistent with the established pattern.

Attacker model: a malicious or compromised OSD in a multi-tenant Ceph deployment (e.g. cloud) can trigger this against any kernel client that calls CEPHOSDOPLISTWATCHERS, without any further privileges beyond OSD session establishment.

[ idryomov: trim changelog ]

Affected Software

1 affected component
Linux Kernel

Event History

Aug 26, 2026
CVE Published
via MITRE·02:37 PM
Data Sourced
via MITRE·02:37 PM
Description
Data Sourced
via NVD·03:17 PM
Description

Frequently Asked Questions

1

Who is exposed to this issue?

Linux kernel systems using libceph and processing object-list watcher responses from an OSD are exposed. Exploitation requires an OSD that is malicious or has been compromised and can send a crafted reply.

2

What does the crafted response need to contain?

The OSD sends an obj_list_watch_response_t reply whose encoding header specifies struct_len=0. This allows decoding to succeed with the input pointer at the end of the buffer before decode_watchers() performs an unchecked 32-bit read.

3

What is the effect of the unchecked read?

The kernel reads four bytes beyond the validated buffer boundary and uses the resulting garbage value as the watcher count passed to kzalloc_objs(). The provided fix changes this read to the bounds-checked ceph_decode_32_safe() variant.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203