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.