CVE-2023-53550CVE-2023-53550是Linux内核中cpufreq: amd-pstate驱动的一个类型混淆漏洞。该漏洞源于提交3666062b87ec中将"amd_pstate"属性从专用kobject迁移到cpu根kobject时,属性类型未做相应调整。在原始设计中,专用kobject期望包含kobj_attributes类型的属性,而cpu根kobject需要device_attributes类型的属性。由于回调函数实际上不使用传入的参数变更,因此在大多数情况下系统仍能正常工作。然而,当系统启用控制流完整性(CFI)保护时,运行时完整性检查机制会检测到这一类型不匹配问题并触发CFI失败异常,导致系统崩溃或内核异常。该漏洞的攻击向量为本地攻击,需要低权限即可触发,不需要用户交互。虽然机密性和完整性不受影响,但会对系统可用性造成严重影响,可能导致系统拒绝服务(DoS)。该漏洞影响使用amd-pstate驱动的AMD处理器平台上的Linux系统。
从技术层面分析,该漏洞的核心问题在于Linux内核sysfs属性注册时类型不匹配。在Linux内核中,sysfs提供了两种属性结构:kobj_attribute(用于kobject)和device_attribute(用于device)。这两种结构具有不同的函数指针类型:kobj_attribute使用show/store回调,签名为ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr, char *buf);而device_attribute使用ssize_t (*show)(struct device *dev, struct device_attribute *attr, char *buf)。在提交3666062b87ec中,开发者将amd_pstate属性从专用kobject迁移到cpu根kobject,但未将属性结构从kobj_attribute更新为device_attribute。由于两个回调函数的实际实现不依赖于传入的参数(kobj参数在device_attribute回调中实际是device指针),因此在未启用CFI的情况下,函数调用仍能正常工作。但当启用CFI(Control Flow Integrity)保护时,内核会在运行时验证函数指针的类型一致性,当检测到show_status函数被以device_attribute的show回调方式调用时,会触发CFI失败(错误类型0x8651b1de),导致内核警告并可能引发系统崩溃。攻击者可以通过读取/sys/devices/system/cpu/cpufreq/amd_pstate/下的相关属性文件来触发该漏洞。