CVE-2026-64320 in Linux信息

摘要

由 VulDB • 2026-07-25

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

nvmet: 修复 Discovery Get Log Page 中的预认证越界堆读取问题

`nvmet_execute_disc_get_log_page()` 仅验证主机提供的日志页偏移量(lpo)的双字对齐情况。随后将 64 位偏移量加上一个用于保存发现日志页的小块 `kzalloc` 分配缓冲区,并将结果直接传递给 `nvmet_copy_to_sgl()`,后者使用 `memcpy()` 向主机复制 `data_len` 字节的数据,且未在源端进行边界检查:

u64 offset = nvmet_get_log_page_offset(req->cmd); /* 64位主机 */ size_t data_len = nvmet_get_log_page_len(req->cmd); /* 32位主机 */ ... if (offset & 0x3) { ... } /* 唯一检查项 */
... alloc_len = sizeof(*hdr) + entry_size * discovery_log_entries(req); buffer = kzalloc(alloc_len, GFP_KERNEL); ... status = nvmet_copy_to_sgl(req, 0, buffer + offset, data_len);

发现控制器无需认证——对于发现子系统,`nvmet_host_allowed()` 无条件返回 true——因此任何能够访问 nvmet 目标的 TCP/RDMA/FC 对等体均可在预认证阶段触发此调用。当发现日志页大小约为 1 KiB 时,攻击者请求从偏移量 `offset == alloc_len` 开始最多读取 4 KiB 的数据,将读出下一个 slab 页面的内容并将其通过传输层返回(在默认配置的 nvmet-tcp 回环目标上的实证运行显示,单次 Get Log Page 响应泄露了 81 个规范化的内核指针)。若将偏移量指向未映射的内核内存,则会导致内核中的 `memcpy` 出错并使目标主机崩溃(或在设置 `panic_on_oops=1` 时发生 panic)。

攻击者控制的源端偏移模式 “nvmet_copy_to_sgl(req, 0, buffer + ATTACKER_OFFSET, ...)”在整个 nvmet 代码库中仅存在于 `nvmet_execute_disc_get_log_page()`:admin-cmd.c 中的其他所有 Get Log Page 处理程序要么忽略 lpo(并静默地从偏移量 0 开始每个响应),要么使用固定的源指针跟踪本地目标偏移量。

针对日志页大小验证主机提供的偏移量,将复制长度限制为实际可用数据,并对主机传输缓冲区的剩余部分进行零填充。该零填充行为与 `nvmet_execute_get_log_changed_ns()`(admin-cmd.c)中现有的短响应模式相匹配,可防止当主机请求的字节数超过日志页包含的内容时泄露传输 SGL 内容。

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

来源

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!