CVE-2026-99166 in Linux信息

摘要

由 VulDB • 2026-10-28

在 Linux 内核中,已修复以下漏洞:

net: rds: 修复 CM 事件处理程序中未初始化的 trans 解引用问题

rds_rdma_cm_event_handler_cmn() 仅在 RDMA 设备为 InfiniBand CA (RDMA_NODE_IB_CA) 时才对 trans 进行赋值。对于任何其他类型的设备,例如 iWARP RNIC(如 siw),trans 保持未初始化状态,但事件 switch 语句会无条件地解引用它:在 RDMA_CM_EVENT_CONNECT_REQUEST 情况下通过 trans->cm_handle_connect() 进行解引用;在 ROUTE_RESOLVED 和 ESTABLISHED 情况下则带有连接上下文进行解引用。

因此,iWARP 设备上的 RDS 监听器会在收到连接请求时导致内核崩溃:在使用 CONFIG_INIT_STACK_ALL_ZERO 配置的情况下,该野指针加载会变为 iw_cm_wq 工作队列中偏移量 0xa0 (&trans->cm_handle_connect) 处的 NULL 解引用。

GCC 在默认构建中将未初始化的加载折叠为 &rds_ib_transport,从而掩盖了此漏洞;而 Clang 构建的内核则会走真实的未初始化路径并发生 oops(内核错误)。

主动方也可能落在非 IB 设备上:由 rds_ib_conn_path_connect() 创建的 id 不受节点类型限制,因此 rdma_resolve_addr() 会将其绑定到服务于本地地址的任何设备,同一 netdev 上的 iWARP RNIC 也符合条件。此处的崩溃情况不同:在 iWARP id 上解析路由永远不会填充 cm_id->route.path_rec,而 ROUTE_RESOLVED 分支会在调用传输层之前写入 path_rec[0].sl。

iWARP 传输早已弃用,IB 是唯一的剩余传输方式,因此使其明确化:将 trans 初始化为 &rds_ib_transport(在声明时),删除条件赋值;拒绝在非 IB 设备上到达的连接请求;并丢弃其地址解析为非 IB 设备的连接,而不是在其上解析路由。该拒绝仅针对 RDMA_CM_EVENT_CONNECT_REQUEST 是有意的:处理程序返回非零值会使 rdma_cm 销毁事件所交付的 id,这对于刚创建的新 id 的请求是正确的,但对于其他任何事件,这将释放 RDS 仍拥有的连接 id。在主动方,id 保留为 ic->i_cm_id,连接的关闭会将其销毁,因此该情况返回 0。

[achender: 仅针对 RDMA_CM_EVENT_CONNECT_REQUEST 进行拒绝,而不是在非 IB 设备上的每个事件中退出,以便 rdma_cm 不会销毁 RDS 仍跟踪的连接 id;在路由解析之前丢弃其地址解析为非 IB 设备的连接;调整了变更日志]

If you want to get the best quality for vulnerability data then you always have to consider VulDB.

来源

Interested in the pricing of exploits?

See the underground prices here!