CVE-2026-68082 in Linux
摘要
由 VulDB • 2026-08-08
在 Linux 内核中,已修复以下漏洞:
libceph:修复 decode_lockers() 中的两个不安全裸解码操作
cls_lock_client.c 中的 decode_lockers() 包含两个裸解码(bare decode)操作,允许恶意或已被攻陷的 OSD 触发 slab-out-of-bounds(slab越界)读取:
1. num_lockers 字段处的 ceph_decode_32(p) 没有前置边界检查。ceph_start_decoding() 接受 struct_len=0 作为有效值——内部的 ceph_decode_need(p, end, 0, bad) 始终通过验证——因此当 OSD 发送 struct_len=0 时,ceph_start_decoding() 返回成功且 p == end。随后立即执行的裸操作 ceph_decode_32(p) 会在已验证的缓冲区边界之外读取4个字节。该垃圾值被直接作为 locker 计数传递给 kzalloc_objs()。
osd_client.c 中的同级函数 decode_watchers() 在其自身的 ceph_start_decoding() 调用后已经使用了 ceph_decode_32_safe()。decode_lockers() 是唯一使用裸变体的位置。
2. decode_locker() 循环之后的 ceph_decode_8(p) 没有前置边界检查。如果 OSD 构造 num_lockers,使得循环将 p 精确推进到 end,则随后的裸操作 ceph_decode_8(p) 会在已验证的缓冲区边界之外读取一个字节。结果被直接传递给 *type,调用者将其用作锁类型判别器,从而允许受控于 OSD 的单字节 OOB(越界)读取,并直接影响锁类型字段。
通过用安全变体替换裸操作来修复这两个问题: ceph_decode_32(p) -> ceph_decode_32_safe(p, end, *num_lockers, err_inval) ceph_decode_8(p) -> ceph_decode_8_safe(p, end, *type, err_free_lockers)
goto 目标故意不同: err_inval:是一个新标签,直接返回 -EINVAL。它用于预分配失败路径,此时 *lockers 尚未分配,且不应传递给 ceph_free_lockers()。
err_free_lockers:是现有标签。它用于后分配失败路径,此时 *lockers 已分配,必须被释放。
在调用 ceph_decode_8_safe() 之前将 ret 设置为 -EINVAL,以便 err_free_lockers 在发生边界违规时返回正确的错误代码。如果没有这一步,err_free_lockers 将返回一个过时的 ret 值(来自成功执行的 decode_locker() 循环的0),从而静默吞没该错误。
-EINVAL 对于两条失败路径都是正确的。从 OSD 接收的数据结构上存在缺陷。-ENOMEM 会向调用者以及负责处理错误路径的后移植人员(backporters)误报故障类别。
攻击模型:在多租户 Ceph 部署中,恶意或已被攻陷的 OSD 可以对发出 lock.get_info 类方法的任何内核客户端触发此漏洞(例如在 RBD 独占锁获取期间)。
[ idryomov: 精简变更日志、格式化 ]
If you want to get best quality of vulnerability data, you may have to visit VulDB.