CVE-2026-52995
Publication date:
24/06/2026
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
net/rds: zero per-item info buffer before handing it to visitors<br />
<br />
rds_for_each_conn_info() and rds_walk_conn_path_info() both hand a<br />
caller-allocated on-stack u64 buffer to a per-connection visitor and<br />
then copy the full item_len bytes back to user space via<br />
rds_info_copy() regardless of how much of the buffer the visitor<br />
actually wrote.<br />
<br />
rds_ib_conn_info_visitor() and rds6_ib_conn_info_visitor() only<br />
write a subset of their output struct when the underlying<br />
rds_connection is not in state RDS_CONN_UP (src/dst addr, tos, sl<br />
and the two GIDs via explicit memsets). Several u32 fields<br />
(max_send_wr, max_recv_wr, max_send_sge, rdma_mr_max, rdma_mr_size,<br />
cache_allocs) and the 2-byte alignment hole between sl and<br />
cache_allocs remain as whatever stack contents preceded the visitor<br />
call and are then memcpy_to_user()&#39;d out to user space.<br />
<br />
struct rds_info_rdma_connection and struct rds6_info_rdma_connection<br />
are the only rds_info_* structs in include/uapi/linux/rds.h that are<br />
not marked __attribute__((packed)), so they have a real alignment<br />
hole. The other info visitors (rds_conn_info_visitor,<br />
rds6_conn_info_visitor, rds_tcp_tc_info, ...) write all fields of<br />
their packed output struct today and are not known to be vulnerable,<br />
but a future visitor that adds a conditional write-path would have<br />
the same bug.<br />
<br />
Reproduction on a kernel built without CONFIG_INIT_STACK_ALL_ZERO=y:<br />
a local unprivileged user opens AF_RDS, sets SO_RDS_TRANSPORT=IB,<br />
binds to a local address on an RDMA-capable netdev (rxe soft-RoCE on<br />
any netdev is sufficient), sendto()&#39;s any peer on the same subnet<br />
(fails cleanly but installs an rds_connection in the global hash in<br />
RDS_CONN_CONNECTING), then calls getsockopt(SOL_RDS,<br />
RDS_INFO_IB_CONNECTIONS). The returned 68-byte item contains 26<br />
bytes of stack garbage including kernel text/data pointers:<br />
<br />
0..7 0a 63 00 01 0a 63 00 02 src=10.99.0.1 dst=10.99.0.2<br />
8..39 00 ... gids (memset-zeroed)<br />
40..47 e0 92 a3 81 ff ff ff ff kernel pointer (max_send_wr)<br />
48..55 7f 37 b5 81 ff ff ff ff kernel pointer (rdma_mr_max)<br />
56..59 01 00 08 00 rdma_mr_size (garbage)<br />
60..61 00 00 tos, sl<br />
62..63 00 00 alignment padding<br />
64..67 18 00 00 00 cache_allocs (garbage)<br />
<br />
Fix by zeroing the per-item buffer in both rds_for_each_conn_info()<br />
and rds_walk_conn_path_info() before invoking the visitor. This<br />
covers the IPv4/IPv6 IB visitors and hardens all current and future<br />
visitors against the same class of bug.<br />
<br />
No functional change for visitors that fully populate their output.<br />
<br />
Changes in v2:<br />
- retarget at the net tree (subject prefix "[PATCH net v2]",<br />
net/rds: prefix in the title)<br />
- pick up Reviewed-by tags from Sharath Srinivasan and<br />
Allison Henderson
Severity CVSS v4.0: Pending analysis
Last modification:
15/07/2026