CVE-2022-50546CVE-2022-50546是Linux内核ext4文件系统中存在的一个未初始化值使用漏洞(Use of Uninitialized Value)。该漏洞由Syzbot模糊测试工具发现,位于fs/ext4/inode.c文件的ext4_evict_inode函数中。问题的根本原因在于ext4_alloc_inode()函数在分配inode结构时未对ei->i_flags成员变量进行初始化。当通过__ext4_new_inode()创建新inode的过程中,如果在任何位置发生错误导致操作失败,系统会调用iput()释放inode资源。在内核提交6bc0d63dad7f之后,ext4_evict_inode()函数会访问ei->i_flags字段,但由于该字段未被初始化,导致访问未初始化的内存,可能引发内核崩溃、信息泄露或权限提升等安全问题。该漏洞的CVSS 3.1评分为7.8分,属于高危级别,攻击者需要本地低权限访问即可触发,无需用户交互,可能对系统的机密性、完整性和可用性造成严重影响。
该漏洞的技术原理涉及Linux内核ext4文件系统的inode管理机制。具体而言,当内核通过ext4_alloc_inode()分配一个新的inode结构体时,会调用kmem_cache_alloc_lru从slab分配器中获取内存,但kmem_cache_alloc_lru返回的内存并未清零,因此ei->i_flags字段包含未定义的垃圾值。在正常路径中,__ext4_new_inode()函数会在后续流程中正确设置ei->i_flags。然而,如果在设置ei->i_flags之前发生错误(例如内存分配失败、文件系统元数据错误等),错误处理路径会调用iput()最终触发ext4_evict_inode()函数。自内核提交6bc0d63dad7f起,ext4_evict_inode()中增加了对ei->i_flags的访问逻辑,这导致读取未初始化的内存内容。KMSAN(Kernel Memory Sanitizer)工具检测到了这一未初始化值的使用问题。攻击链方面,本地低权限用户可以通过调用mknodat或mkdir等系统调用触发inode创建,在特定条件下使创建流程失败并进入错误处理路径,从而触发对未初始化内存的访问,可能导致内核信息泄露或被利用进行权限提升。修复方案是在ext4_alloc_inode()函数中显式初始化ei->i_flags为0。