CVE-2026-43405Linux内核libceph组件中存在一个高危漏洞。在`ceph_monmap_decode`函数处理CEPH协议消息时,由于使用了有符号整型变量来存储本应无符号的监控器数量(num_mon),导致符号错误。当攻击者发送特制的恶意数据包,包含超大数值时,该数值会被解释为负数,从而绕过最大数量限制的安全检查。这会触发内核尝试分配异常巨大的内存块,导致内存分配失败或系统资源耗尽,最终引发拒绝服务攻击。
该漏洞的核心在于C语言中的隐式类型转换与符号处理问题。在`ceph_monmap_decode`函数中,`blob_len`和`num_mon`被声明为`int`类型,但在调用`ceph_decode_32_safe`宏时,该宏期望处理`u32`类型的数值。当从网络数据包中读取的32位无符号数值超过有符号整型的最大值(INT_MAX)时,赋值给`num_mon`会导致其变为负数。代码中原本用于限制监控器数量的检查逻辑`if (num_mon > CEPH_MAX_MON)`失效,因为负数总是小于正数阈值。随后,该负数被用于计算内存分配大小。在传递给内存分配函数(如`kmalloc`)时,负数会被隐式转换为巨大的无符号`size_t`值,导致系统尝试申请超出物理能力的内存空间,最终返回`-ENOMEM`错误或造成内核崩溃,破坏系统可用性。