CVE-2022-50478CVE-2022-50478是Linux内核nilfs2(日志结构文件系统第二版)模块中的一个高危安全漏洞。该漏洞存在于nilfs_sb2_bad_offset()辅助函数中,当磁盘上的超级块(superblock)中存储的块大小指数信息被损坏时,该函数会触发移位越界(shift-out-of-bounds)警告,并在panic_on_warn设置的情况下导致内核崩溃。具体表现为UBSAN(Undefined Behavior Sanitizer)检测到移位指数38983对于64位无符号长长整型来说过大。此外,由于nilfs_sb2_bad_offset()在执行乘法运算时未考虑上界限制,当磁盘布局参数异常时,计算结果可能发生溢出。该漏洞由syzbot模糊测试工具首次报告,需要两个补丁配合修复才能彻底消除挂载时的移位越界问题。该漏洞的影响范围涵盖Linux内核中所有使用nilfs2文件系统的版本,攻击者通过本地低权限访问即可利用此漏洞导致系统拒绝服务或信息泄露。
该漏洞的根本原因在于nilfs_sb2_bad_offset()函数对从磁盘超级块读取的参数缺乏充分的健全性检查。具体技术细节如下:
1. **触发条件**:当攻击者构造一个包含异常块大小指数(如38983)的恶意nilfs2文件系统镜像,并尝试挂载该文件系统时,nilfs_sb2_bad_offset()函数会对该指数值执行左移位操作(如1ULL << s_block_size_bits)。
2. **漏洞原理**:在64位无符号长长整型(unsigned long long)中,合法的移位范围为0-63位。当从超级块读取的s_block_size_bits值超过63时,会触发UBSAN的shift-out-of-bounds警告。如果内核配置了panic_on_warn参数,则会直接导致内核崩溃(kernel panic)。
3. **溢出风险**:该函数还执行乘法运算(如offset * block_size),当offset和block_size均为异常大值时,乘积可能超过64位整型的最大值,导致整数溢出,进而产生错误的偏移量判断结果。
4. **利用方式**:攻击者需要本地访问权限(PR:L),无需用户交互(UI:N),通过创建或修改nilfs2文件系统镜像中的超级块数据,将块大小指数字段设置为非法大值,然后尝试挂载该文件系统即可触发漏洞。
5. **修复方案**:补丁通过插入初步的参数健全性检查,并使用除法和右移位替代乘法和左移位进行比较,避免了移位越界和整数溢出问题。