CVE-2022-50497CVE-2022-50497是Linux内核binfmt_misc子系统中存在的一个高危整数移位越界漏洞。该漏洞位于fs/binfmt_misc.c文件的check_special_flags函数中,由UBSAN(Undefined Behavior Sanitizer)检测并报告。当用户通过bm_register_write接口注册新的二进制格式处理程序时,系统会调用check_special_flags函数对特殊标志进行检查。然而,由于代码中用于定义标志位掩码的宏使用了'int'类型(32位有符号整数),在对常量1进行左移31位操作时,会产生未定义行为——因为左移31位后结果超出了'int'类型所能表示的正数范围(最大为2^31-1)。这会导致UBSAN发出shift-out-of-bounds警告。该漏洞的CVSS评分为7.1,属于高危级别。攻击者需要具备本地低权限访问能力,无需用户交互即可触发。漏洞的成功利用可能造成高机密性影响(信息泄露)和高可用性影响(系统崩溃或拒绝服务),但不会影响数据完整性。Linux内核作为全球最广泛使用的操作系统内核之一,此漏洞影响范围广泛,涉及众多基于Linux的服务器、桌面和嵌入式系统。
该漏洞的根本原因在于fs/binfmt_misc.c文件中标志位宏定义类型与Node结构体flags字段类型不匹配。Node结构体中的flags字段被定义为unsigned long类型(在64位系统上为64位无符号整数),但用于检查特殊标志的宏(如MISC_FMT_OPEN_BINARY、MISC_FMT_CREDENTIALS等)却被定义为int类型的常量。当代码执行类似`(1 << 31)`的操作时,由于操作数为int类型(有符号32位),结果为0x80000000,这是一个负数,超出了int类型能表示的正数范围,从而触发UBSAN的shift-out-of-bounds检测。
利用方式方面,攻击者需要具备本地系统访问权限(即使是低权限用户也可以利用),通过向/proc/sys/fs/binfmt_misc接口写入特定格式的注册请求来触发该漏洞。具体的触发路径为:用户空间write系统调用 -> vfs_write -> ksys_write -> bm_register_write -> create_entry -> check_special_flags,在check_special_flags函数中执行标志位检查时触发未定义行为。
漏洞的触发可能导致内核日志中产生UBSAN警告信息,在某些情况下可能引起系统不稳定或内核崩溃,从而实现本地拒绝服务攻击。此外,由于移位越界可能导致标志位比较结果异常,理论上还可能被利用来绕过某些安全检查机制,导致信息泄露。修复方案是将相关宏的定义类型从int改为unsigned long,使其与Node->flags的类型保持一致。