CVE-2022-50498CVE-2022-50498是Linux内核中alx(Atheros有线以太网)驱动程序的一个漏洞。该漏洞由Zbynek报告,发生在系统从挂起(suspend)状态恢复(resume)的过程中。alx驱动在其内部的关闭和重新打开操作期间未持有rtnl_lock(网络设备全局锁),导致在resume时触发了net/core/dev.c中的RTNL断言失败(assertion failed at net/core/dev.c line 2891)。具体表现为在netif_set_real_num_tx_queues函数中触发断言失败,调用链为alx_resume -> __alx_open -> netif_set_real_num_tx_queues。
该漏洞虽然不是严重的安全问题,因为alx驱动实现了自己的内部锁机制,且不支持动态更改队列数量,但RTNL断言失败会导致内核打印警告信息(splat),影响系统稳定性,并可能引发不可预测的行为。在某些条件下,该问题可能导致系统挂起或网络功能异常,从而影响系统的可用性。CVSS评分为5.5分,属于中等严重级别,主要影响系统的可用性(Availability Impact为High),对机密性和完整性无影响。攻击者需要本地低权限访问即可触发此漏洞,无需用户交互。
该漏洞已在多个Linux内核稳定版本中得到修复,主要通过在alx驱动的resume回调函数中添加rtnl_lock/rtnl_unlock调用来解决。
该漏洞的技术原理涉及Linux内核网络子系统的锁机制。RTNL(Routing Netlink Lock)是Linux内核中用于保护网络设备列表和网络设备状态变更的全局读写锁。当网络设备的配置发生变化(如打开/关闭接口、修改队列数量等)时,必须持有RTNL锁。
在alx驱动中,alx_resume函数负责在系统从挂起状态恢复时重新初始化网卡。该函数调用__alx_open来重新打开网卡接口,而__alx_open内部会调用netif_set_real_num_tx_queues来设置传输队列数量。netif_set_real_num_tx_queues函数内部有一个RTNL断言检查(位于net/core/dev.c第2891行),要求调用者必须持有RTNL锁。
漏洞的根本原因是alx驱动在resume路径上没有获取RTNL锁。虽然alx驱动有自己的内部锁(如alx_mutex)来保护其内部状态,但当调用网络核心层的API(如netif_set_real_num_tx_queues)时,仍然需要遵守网络子系统的锁约定。这导致在resume时触发RTNL断言失败。
利用方式:攻击者只需触发系统挂起/恢复流程(如通过echo mem > /sys/power/state或使用pm-suspend命令),当系统恢复时,如果系统使用了alx网卡驱动,就会触发该断言失败。在某些极端情况下,这可能导致系统不稳定或网络功能异常。
修复方案是在alx_resume函数中添加rtnl_lock()和rtnl_unlock()调用,确保在调用网络核心API时持有RTNL锁。