| From 69fb5d91bba44ecf7eb80530b85fa4fb028921d5 Mon Sep 17 00:00:00 2001 |
| From: Ilya Dryomov <idryomov@gmail.com> |
| Date: Sun, 8 Mar 2026 17:38:00 +0100 |
| Subject: libceph: prevent potential out-of-bounds reads in process_message_header() |
| |
| From: Ilya Dryomov <idryomov@gmail.com> |
| |
| commit 69fb5d91bba44ecf7eb80530b85fa4fb028921d5 upstream. |
| |
| If the message frame is (maliciously) corrupted in a way that the |
| length of the control segment ends up being less than the size of the |
| message header or a different frame is made to look like a message |
| frame, out-of-bounds reads may ensue in process_message_header(). |
| |
| Perform an explicit bounds check before decoding the message header. |
| |
| Cc: stable@vger.kernel.org |
| Reported-by: Raphael Zimmer <raphael.zimmer@tu-ilmenau.de> |
| Signed-off-by: Ilya Dryomov <idryomov@gmail.com> |
| Reviewed-by: Alex Markuze <amarkuze@redhat.com> |
| Reviewed-by: Viacheslav Dubeyko <Slava.Dubeyko@ibm.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/ceph/messenger_v2.c | 9 ++++++++- |
| 1 file changed, 8 insertions(+), 1 deletion(-) |
| |
| --- a/net/ceph/messenger_v2.c |
| +++ b/net/ceph/messenger_v2.c |
| @@ -2527,12 +2527,15 @@ static int process_message_header(struct |
| void *p, void *end) |
| { |
| struct ceph_frame_desc *desc = &con->v2.in_desc; |
| - struct ceph_msg_header2 *hdr2 = p; |
| + struct ceph_msg_header2 *hdr2; |
| struct ceph_msg_header hdr; |
| int skip; |
| int ret; |
| u64 seq; |
| |
| + ceph_decode_need(&p, end, sizeof(*hdr2), bad); |
| + hdr2 = p; |
| + |
| /* verify seq# */ |
| seq = le64_to_cpu(hdr2->seq); |
| if ((s64)seq - (s64)con->in_seq < 1) { |
| @@ -2563,6 +2566,10 @@ static int process_message_header(struct |
| WARN_ON(!con->in_msg); |
| WARN_ON(con->in_msg->con != con); |
| return 1; |
| + |
| +bad: |
| + pr_err("failed to decode message header\n"); |
| + return -EINVAL; |
| } |
| |
| static int process_message(struct ceph_connection *con) |