CVE-2022-50504CVE-2022-50504是Linux内核powerpc架构RTAS(Run-Time Abstraction Services)子系统中的一个关键缺陷。该漏洞位于`rtas_os_term()`函数中,当处理来自`ibm,os-term` RTAS调用的忙(busy)状态时,代码错误地使用了`rtas_busy_delay()`函数。`rtas_busy_delay()`内部会调用可能导致调度(schedule)的睡眠函数,然而`rtas_os_term()`是在内核panic处理路径中被调用的,此时处于原子上下文(in_atomic=1, irqs_disabled=1),不允许进行任何可能导致调度的操作。当系统在内核panic状态下尝试调用`ibm,os-term` RTAS功能并收到忙状态返回时,会触发"sleeping function called from invalid context"警告,并进一步导致内核panic或系统挂起,从而造成拒绝服务。该漏洞影响所有运行受影响内核版本的PowerPC(ppc64/ppc64le)架构Linux系统。该漏洞的CVSS评分为5.5,属于中危级别,攻击者需要本地低权限访问权限即可触发,但需要能够引发内核panic的条件(如触发系统故障)。漏洞已于2025年10月公开披露,修复方案为将`rtas_busy_delay()`替换为`rtas_busy_delay_time()`,后者不会产生调度副作用,仅通过返回值告知调用者是否应再次尝试RTAS调用。
从技术层面分析,该漏洞的根本原因是Linux内核powerpc架构RTAS子系统中上下文管理的违规。RTAS是PowerPC固件提供的一组运行时抽象服务接口,内核通过调用RTAS函数与固件交互。
漏洞触发路径如下:
1. 系统发生内核panic(通过`panic()`函数触发);
2. panic处理链通过`atomic_notifier_call_chain`调用`ppc_panic_platform_handler`;
3. `pseries_panic`被调用,进而调用`rtas_os_term()`;
4. `rtas_os_term()`尝试调用`ibm,os-term` RTAS功能通知固件执行操作系统终止操作;
5. 如果RTAS固件返回忙状态(RTAS_BUSY),代码调用`rtas_busy_delay()`进行重试延迟;
6. `rtas_busy_delay()`内部调用`udelay()`或`msleep()`等可能导致进程调度的函数;
7. 由于处于原子上下文(preempt_count=2, irqs_disabled=1),调度操作触发`__might_resched`检查并报告"BUG: sleeping function called from invalid context";
8. 最终导致系统挂起或二次panic,造成完全拒绝服务。
修复方案是使用`rtas_busy_delay_time()`替代`rtas_busy_delay()`。`rtas_busy_delay_time()`不执行实际的延迟等待,而是仅返回是否应该再次尝试的布尔判断,调用者可以自行决定后续操作,避免了在原子上下文中进行调度。