CVE-2023-53576CVE-2023-53576是Linux内核null_blk(null block)块设备驱动中的一个安全漏洞。该漏洞源于null_blk驱动在通过configfs接口配置设备时,未对队列模式(queue_mode)设置进行充分验证。当用户通过configfs将队列模式设置为1(即NULL_Q_RQ)时,由于驱动不支持传统的I/O路径(legacy I/O path),会导致空指针解引用,从而触发内核Oops(内核崩溃)。该漏洞的CVSS评分为5.5,属于中危级别。攻击者需要本地访问权限和低权限用户身份即可触发此漏洞,无需用户交互。漏洞的成功利用将导致系统可用性受损,可能引发内核panic,造成拒绝服务(DoS)攻击。该漏洞影响多个Linux内核稳定版本,官方已通过多个commit修复了此问题。
该漏洞的技术原理在于null_blk驱动的配置验证逻辑存在缺陷。在null_validate_conf()函数中,驱动应当检查设备的队列模式设置,拒绝不支持的NULL_Q_RQ模式。然而在修复前的代码中,该验证逻辑缺失,导致当用户通过configfs接口将queue_mode设置为1时,驱动继续执行后续初始化流程。由于NULL_Q_RQ模式对应的legacy I/O路径相关的数据结构未被正确初始化(如tag_set等),在null_add_dev()函数执行过程中会尝试访问未初始化的指针,最终导致空指针解引用并触发内核Oops。
利用方式方面,攻击者只需具有本地用户权限和加载null_blk模块的能力(通常需要CAP_SYS_ADMIN或root权限加载模块,但configfs配置可由普通用户操作),通过以下步骤即可触发漏洞:
1. 加载null_blk模块(nr_devices=0);
2. 通过configfs创建nullb0设备;
3. 设置memory_backed、blocksize、size等参数;
4. 将queue_mode设置为1;
5. 将power设置为1激活设备,触发空指针解引用。
漏洞的调用链为:nullb_device_power_store -> null_add_dev.part.0,在null_add_dev函数内部访问未初始化的tag_set结构体成员时崩溃。