CVE-2022-50486CVE-2022-50486是Linux内核中Texas Instruments (TI) NetCP以太网驱动存在的一个类型不匹配漏洞。该漏洞位于drivers/net/ethernet/ti/netcp_core.c文件中的netcp_ndo_start_xmit()函数。该函数的返回类型被错误地声明为'int',而'struct net_device_ops'结构体中的ndo_start_xmit回调函数期望的返回类型为'netdev_tx_t'。当Linux内核使用clang编译器的内核控制流完整性(kCFI,CONFIG_CFI_CLANG)功能时,间接调用目标会针对预期的函数指针原型进行验证,以确保调用目标有效,从而帮助缓解ROP(Return-Oriented Programming)攻击。如果返回类型不匹配,在运行时将出现故障,表现为内核恐慌(kernel panic)或线程被终止。此外,clang中还提出了一个编译时警告来捕获此类问题。该漏洞的CVSS评分为5.5,属于中危级别,主要影响系统的可用性,可被低权限的本地攻击者利用,导致系统崩溃或不稳定。
该漏洞的技术原理涉及Linux内核网络设备操作接口(net_device_ops)中ndo_start_xmit回调函数的函数指针类型不匹配问题。
在Linux内核中,'struct net_device_ops'结构体定义了网络设备的所有操作回调函数,其中ndo_start_xmit成员用于数据包发送,其函数原型定义为:
netdev_tx_t (*ndo_start_xmit)(struct sk_buff *skb, struct net_device *dev);
而在TI NetCP驱动中,netcp_ndo_start_xmit()函数的返回类型被错误地声明为'int',而不是'netdev_tx_t'。虽然'int'和'netdev_tx_t'(通常是枚举类型)在大多数架构上大小相同,但函数指针的类型签名不匹配。
当启用CONFIG_CFI_CLANG(clang的内核控制流完整性)时,内核会在每次间接函数调用前验证目标函数的类型签名。如果类型不匹配,CFI机制将检测到违规并触发故障,导致内核恐慌或相关线程被终止。
攻击利用方式:本地低权限用户可以通过触发网络数据包发送操作(例如使用该网络接口发送数据)来触发netcp_ndo_start_xmit()函数的调用。由于CFI验证失败,系统将发生内核崩溃,导致拒绝服务(DoS)攻击。攻击者无需特殊权限即可利用此漏洞,但需要本地访问权限。