IPBUF安全漏洞报告
English
CVE-2026-43227 CVSS 5.5 中危

CVE-2026-43227: Linux内核sh_tmu驱动锁上下文错误

披露日期: 2026-05-06
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2026-43227
漏洞类型
拒绝服务
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Linux KernelCVE-2026-43227DoSRace Conditionsh_tmuPREEMPT_RTLockdep

漏洞概述

Linux内核中的clocksource/drivers/sh_tmu驱动程序存在一个安全漏洞。该驱动程序在作为时钟事件提供者运行时,试图在持有原始自旋锁的上下文中调用电源管理和时钟控制函数。由于这些底层函数内部使用常规自旋锁,这种锁嵌套违反了内核的锁定规则,特别是在启用PREEMPT_RT时会导致死锁风险。该问题允许本地低权限用户触发内核警告或崩溃,从而影响系统可用性。

技术细节

该漏洞源于Linux内核`clocksource/drivers/sh_tmu`驱动程序中的电源管理逻辑设计缺陷。TMU设备既可用作时钟源也可用作时钟事件设备。驱动程序原本设计为在非活跃时通过`pm_runtime_*()`和`clk_*()`函数动态关闭电源和时钟以节能。然而,当TMU注册为时钟事件提供者时,clockevents框架与驱动交互的上下文要求使用`raw_spinlock`(原始自旋锁),以保证在原子上下文中的安全。在此上下文中,驱动程序试图调用可能会睡眠或使用常规自旋锁的电源管理API。这种在持有raw_spinlock时尝试获取普通spinlock的行为违反了锁依赖规则,触发了lockdep警告(BUG: Invalid wait context)。在非PREEMPT_RT构建中,这通常仅为警告,但在PREEMPT_RT构建中,常规自旋锁可以睡眠,导致在原子上下文中发生睡眠,进而引发死锁或内核崩溃。修复方案是在探测后始终保持设备通电和时钟运行,避免在关键中断上下文中进行电源管理。

攻击链分析

STEP 1
步骤1
攻击者获取本地低权限用户访问权限。
STEP 2
步骤2
系统运行在启用了PREEMPT_RT和PROVE_LOCKING的Linux内核上,且使用受影响的sh_tmu驱动。
STEP 3
步骤3
触发TMU设备作为时钟事件设备运行(例如通过CPU进入空闲状态tick_broadcast)。
STEP 4
步骤4
驱动在持有原始自旋锁时尝试调用电源管理函数,触发死锁或内核崩溃。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * PoC Concept for CVE-2026-43227 * This code demonstrates the problematic locking scenario. * Triggering this requires a kernel configuration with PREEMPT_RT enabled * and hardware using the sh_tmu driver. */ #include <linux/module.h> #include <linux/kernel.h> #include <linux/spinlock.h> // Simulate the raw spinlock used by clockevent framework static DEFINE_RAW_SPINLOCK(tick_broadcast_lock); // Simulate the normal spinlock used by pm_runtime static DEFINE_SPINLOCK(dev_power_lock); void simulated_sh_tmu_clock_event_set_oneshot(void) { unsigned long flags; // Step 1: Clockevent framework acquires raw spinlock raw_spin_lock_irqsave(&tick_broadcast_lock, flags); // Step 2: Driver tries to manage power (BUG occurs here) // In the real vulnerability, this calls __pm_runtime_resume // which tries to acquire dev->power.lock (a normal spinlock) printk(KERN_INFO "Attempting to acquire normal lock inside raw lock context...\n"); // This next line would trigger the 'Invalid wait context' warning // or deadlock in PREEMPT_RT // spin_lock(&dev_power_lock); // spin_unlock(&dev_power_lock); raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags); } int init_module(void) { printk(KERN_INFO "CVE-2026-43227 PoC Module Loaded\n"); simulated_sh_tmu_clock_event_set_oneshot(); return 0; } void cleanup_module(void) { printk(KERN_INFO "CVE-2026-43227 PoC Module Unloaded\n"); } MODULE_LICENSE("GPL");

影响范围

Linux Kernel < 6.18 (Specific commits fix this)
Linux Kernel stable branches prior to fixes: 016476afef99, 0e513cc6b9ce, 6f113ab549b8, etc.

防御指南

临时缓解措施
如果无法立即升级内核,建议在内核配置中禁用PREEMPT_RT(实时补丁),这可以防止常规自旋锁变为可睡眠锁,从而避免死锁风险,但会牺牲系统的实时响应性能。

参考链接

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