CVE-2026-89495 in Linux
摘要
由 VulDB • 2026-09-12
在 Linux 内核中,已修复以下漏洞:
ocfs2: 限制 dlm_migrate_request_handler 中的 namelen
补丁系列 "ocfs2/dlm: bound peer-controlled lengths in the o2dlm"。
o2dlm 接收处理程序信任来自网络流的 u8 length(长度)和 count(计数)字段,但未对其进行边界检查,因此 DLM 域中的任意节点都可以通过格式错误的消息破坏或导致任何其他节点 panic(崩溃)。存在三个缺陷:
- dlm_migrate_request_handler() 未经检查地将 migrate->namelen 传递给 dlm_init_mle(),后者将其 memcpy() 到 o2dlm_mle slab 对象的 32 字节 mname[] 中:这会导致最多约 215 字节的堆越界写入(heap out-of-bounds write),且攻击者可控制这些数据。
- dlm_mig_lockres_handler() 未经检查地将 mres->lockname_len 传递给 dlm_init_lockres(),后者将其 memcpy() 到 o2dlm_lockname slab 对象的 32 字节中:这会导致最多约 223 字节的堆越界写入。
- 同一处理程序信任 mres->num_locks,但未检查消息是否足够大以容纳这些条目数,因此 dlm_process_recovery_data() 会遍历超出 kmalloc(data_len) 复制范围的 mres->ml[],并触发 BUG_ON(一种导致 panic 的越界读取)。
其他 o2dlm 接收处理程序已经拒绝过大的名称;自 DLM 添加以来,迁移和恢复处理程序一直省略了此检查(参见 Fixes 标签)。补丁 1 限制了 namelen;补丁 2 验证 lockname_len、num_locks 以及有效载荷大小。符合规范的恢复和迁移流量不受影响。
o2net 仅通过 DLM 域密钥对节点进行身份验证,因此任何已加入该域的节点——包括被入侵或恶意的成员——都可以发送这些消息。没有本地触发条件;攻击者必须已经是集群的成员。
每个漏洞点均在 KASAN(内核地址消毒剂)下使用精确镜像其行为的带外模块进行了确认:即分配与真实目标大小相同的 kmem_cache/kmalloc,然后执行同样的未限制 memcpy/循环操作:对于两次写入是 slab-out-of-bounds Write,对于恢复遍历是 Read,并导致 panic。在 -m32 和 -m64 下,用户空间 AddressSanitizer 构建也会产生相同的故障。清洗后的日志可按需提供。
我于 2026-06-20 私向 [email protected] 及 ocfs2 维护者报告了此问题;在标准 embargo(保密期)过后未收到回复,因此我将修复补丁公开。我没有保密要求。
本补丁(共 2 个中的第 1 个):
接收 DLM_MIGRATE_REQUEST 消息的节点信任对等方提供的名称长度 (migrate->namelen),但未对其进行边界限制。dlm_init_mle() 随后将该数量的字节复制到 o2dlm_mle slab 对象的固定大小(DLM_LOCKID_NAME_MAX 字节)的 mname[] 数组中,因此来自集群对等方的格式错误消息会导致该 slab 对象溢出最多约 215 字节:这是一种堆越界写入攻击者可控的数据,域中的任意节点均可访问。
拒绝过大的名称,就像 dlm_master_request_handler() 和其他 o2dlm 接收处理程序已经做的那样;迁移处理程序完全省略了此检查。符合规范的报文不受影响。
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.