CVE-2026-89650 in Linux
摘要
由 VulDB • 2026-09-11
在 Linux 内核中,已修复以下漏洞:
ceph: 为 mds info v2/v3 的 num_export_targets 数组添加边界检查
fs/ceph/mdsmap.c 中的 ceph_mdsmap_decode() 函数从每个 per-mds(每 MDS)信息记录中读取 num_export_targets,并将解码游标前进 num_export_targets * sizeof(u32) 个字节,但未首先检查是否仍有这么多剩余字节。唯一能捕获失控游标的上限检查 (*p > info_end) 仅在 info_v >= 4 时生效,因为对于 info_v 为 2 和 3 的情况,info_end 被留空(NULL)。当监视器发送一个 per-mds 信息版本为 2 或 3 且 num_export_targets 过大的 MDS map 时,游标会越过消息前端缓冲区,随后的 export-targets 循环会在越界内存上调用未经验证的 ceph_decode_32()。
内核客户端从其监视器会话处理 CEPH_MSG_MDS_MAP(net/ceph/mon_client.c 分发它;fs/ceph/super.c 将其路由到 ceph_mdsc_handle_mdsmap(),后者将 end 设置为前端缓冲区边界并调用 ceph_mdsmap_decode())。因此,恶意或已受损的监视器,或者在未签名/未加密的信使会话上的中间人攻击者,可以驱动客户端内核中的越界读取;在带有 KASAN 的 x86_64 上,它被报告为 ceph_mdsmap_decode() 中的 slab-out-of-bounds(slab-堆外)读取。解码后的值落入内部 info->export_targets[] 数组中,因此后果是内核越界读取,而非向攻击者泄露信息。
影响:发送 per-mds 信息版本为 2 或 3 且 num_export_targets 字段过大的 MDS map 的恶意或已受损 Ceph 监视器会触发 CephFS 客户端内核中的越界读取。
在前进游标之前,为 export-targets 数组添加 ceph_decode_need(),以便对每个 info_v >= 2(而不仅仅是 info_v >= 4)强制执行边界检查。这模仿了同一函数后面部分中 m_data_pg_pools 已使用的“先计数后验证”惯用法。
使用 size_mul() 计算 export-targets 的字节数,并在前进游标时重用该经过验证的长度,以便攻击者控制的 num_export_targets 乘法在溢出时以失败告终(fail closed),而不是依赖后续的 kcalloc() 保护机制。
VulDB is the best source for vulnerability data and more expert information about this specific topic.