Bug 2532095 (CVE-2026-89480) - CVE-2026-89480 kernel: nvme-tcp: reject a read that transferred too few bytes
Summary: CVE-2026-89480 kernel: nvme-tcp: reject a read that transferred too few bytes
Keywords:
Status: NEW
Alias: CVE-2026-89480
Product: Security Response
Classification: Other
Component: vulnerability
Version: unspecified
Hardware: All
OS: Linux
medium
medium
Target Milestone: ---
Assignee: Product Security DevOps Team
QA Contact:
URL:
Whiteboard:
Depends On:
Blocks:
TreeView+ depends on / blocked
 
Reported: 2026-09-11 20:29 UTC by OSIDB Bzimport
Modified: 2026-10-27 22:04 UTC (History)
17 users (show)

Fixed In Version:
Clone Of:
Environment:
Last Closed:
Embargoed:


Attachments (Terms of Use)


Links
System ID Private Priority Status Summary Last Updated
Red Hat Product Errata RHSA-2026:71329 0 None None None 2026-09-24 05:25:22 UTC
Red Hat Product Errata RHSA-2026:71330 0 None None None 2026-09-24 04:32:46 UTC
Red Hat Product Errata RHSA-2026:72624 0 None None None 2026-09-28 17:45:13 UTC
Red Hat Product Errata RHSA-2026:76739 0 None None None 2026-10-08 09:50:30 UTC
Red Hat Product Errata RHSA-2026:89197 0 None None None 2026-10-27 22:04:16 UTC

Description OSIDB Bzimport 2026-09-11 20:29:37 UTC
In the Linux kernel, the following vulnerability has been resolved:

nvme-tcp: reject a read that transferred too few bytes

nvme_tcp_recv_data() completes a request once the current C2HData PDU
has been consumed. Nothing compares the total bytes received against
the length the command asked for: struct nvme_tcp_request has no
receive-side counter, queue->data_remaining is per queue, and
blk_mq_end_request() completes for blk_rq_bytes(rq) unconditionally
with no residual concept anywhere above.

A controller can therefore answer a 4096-byte read with 512 bytes and
have it reported as a complete read; user space then gets 4096 bytes of
which 3584 are whatever was already in the page. I reproduced that with
a test target.

Count the bytes received and refuse to complete a successful read whose
count does not match, at the two NVME_TCP_F_DATA_SUCCESS paths and in
nvme_tcp_process_nvme_cqe(). The success test shifts req->status right
by one, because the driver keeps the wire value there and shifts it on
completion, so the check must see what the completion path will see.
Only REQ_OP_READ is checked, because there the length comes from the
sectors the request covers; a passthrough command is built by its
submitter, which picks both command and buffer, so the kernel has
nothing to compare against.

Comment 4 Jon Orris 2026-09-24 04:32:44 UTC
This issue has been addressed in the following products:

  Red Hat Enterprise Linux 8

Via RHSA-2026:71330 https://access.redhat.com/errata/RHSA-2026:71330

Comment 5 Jon Orris 2026-09-24 05:25:20 UTC
This issue has been addressed in the following products:

  Red Hat Enterprise Linux 8

Via RHSA-2026:71329 https://access.redhat.com/errata/RHSA-2026:71329

Comment 6 Jon Orris 2026-09-28 17:45:12 UTC
This issue has been addressed in the following products:

  Red Hat Enterprise Linux 10

Via RHSA-2026:72624 https://access.redhat.com/errata/RHSA-2026:72624

Comment 8 Jon Orris 2026-10-08 09:50:28 UTC
This issue has been addressed in the following products:

  Red Hat Enterprise Linux 9

Via RHSA-2026:76739 https://access.redhat.com/errata/RHSA-2026:76739

Comment 11 Jon Orris 2026-10-27 22:04:14 UTC
This issue has been addressed in the following products:

  Red Hat OpenShift Container Platform 4.22

Via RHSA-2026:89197 https://access.redhat.com/errata/RHSA-2026:89197


Note You need to log in before you can comment on or make changes to this bug.