CVE-2026-23384CVE-2026-23384 是 Linux 内核中 RDMA/ionic 驱动程序的一个信息泄露漏洞。该漏洞产生的原因是在 `ionic_create_cq()` 函数中,内核栈上的响应结构体 `resp` 未被完全初始化。具体来说,结构体中的 `rsvd[7]` 保留字段从未被赋值,导致 7 字节的内核栈内存无条件泄露给用户空间。此外,`cqid` 数组中的部分元素也可能因特定条件未被写入而泄露额外内存。本地低权限攻击者可利用此漏洞读取敏感的内核内存数据,可能导致绕过内核地址空间布局随机化(KASLR)等安全防御机制。该漏洞 CVSS v3.1 评分为 5.5,属于中危级别。
该漏洞技术细节涉及 Linux 内核驱动程序的内存初始化疏忽。在 RDMA/ionic 驱动的 `ionic_create_cq` 函数中,定义了一个局部结构体变量 `struct ionic_cq_resp resp`,用于向用户态返回创建完成队列(CQ)的结果。该结构体包含 `cqid` 数组、`udma_mask` 以及 `rsvd` 保留字段。
漏洞的核心在于 `rsvd[7]` 字段。在代码逻辑中,开发者显式设置了 `udma_mask`,但完全忽略了对 `rsvd` 数组的初始化。当函数执行完毕并将 `resp` 结构体拷贝回用户空间时,这 7 个字节的内存仍保留着之前栈上遗留的数据(如内核指针、函数返回地址等),从而造成信息泄露。
此外,`cqid` 数组的初始化依赖于 `udma_mask` 的位图。代码通过循环遍历 `udma_idx` 来填充 `cqid`。如果 `udma_mask` 仅设置了低位(例如仅 bit 0),且 `udma_count` 较小,则 `cqid[1]` 可能永远不会被写入。由于 `resp` 是栈变量且未在声明时清零,`cqid[1]` 处的 4 字节旧数据也会被泄露。攻击者通过发送特制的 RDMA 请求触发该路径,即可从用户态读取这些未初始化的内核内存片段。