CVE-2022-50516CVE-2022-50516是Linux内核分布式锁管理器(DLM,Distributed Lock Manager)子系统中存在的一个悬垂指针解引用漏洞。该漏洞位于fs/dlm模块中,当用户将lkbsb(lock kernel space buffer)结构体放置在栈上,且sb_lvbptr字段指向一个悬垂指针(dangled pointer),同时未设置DLM_LKF_VALBLK标志时,内核在调用memcpy_erms进行内存复制操作时会尝试访问该无效指针,导致内核崩溃(page fault)。根据漏洞描述中的内核日志,崩溃发生在send_args函数中,触发地址为0xdeadbeef(典型的悬垂指针标记值),调用链为:lock_torture_writer -> torture_unlock -> dlm_unlock -> unlock_lock -> _unlock_lock -> send_common -> send_args -> memcpy_erms。该漏洞在lock_torture_wr测试场景中被发现,可导致系统可用性完全丧失(内核Oops)。CVSS评分为5.5分,攻击向量为本地,需要低权限认证,无需用户交互,机密性和完整性不受影响,但可用性影响为高。
该漏洞的根本原因在于DLM模块中send_args函数的逻辑缺陷。在DLM(Distributed Lock Manager)子系统中,当执行解锁操作(dlm_unlock)时,会调用send_common进而调用send_args来构造发送到远程节点的消息。send_args函数中包含对sb_lvbptr指针的memcpy操作,用于复制锁值块(Lock Value Block,LVB)数据。原始代码仅检查sb_lvbptr是否为NULL,而没有检查是否设置了DLM_LKF_VALBLK标志。当用户代码将lkbsb结构体分配在栈上,且未正确初始化sb_lvbptr字段(例如指向已释放的内存或未初始化的悬垂指针),同时在调用dlm_lock时未设置DLM_LKF_VALBLK标志时,send_args函数会直接对悬垂指针执行memcpy操作,导致内核访问非法内存地址并触发page fault。修复方案是在send_args函数中增加对DLM_LKF_VALBLK标志的检查,只有当该标志被设置时才执行sb_lvbptr的内存复制操作,这样确保了用户只有在明确需要使用LVB功能时才会提供有效的sb_lvbptr指针。该漏洞影响多个Linux内核稳定版本,修复补丁已合入主线及多个stable分支。