CVE-2026-23374Linux内核中的blktrace模块存在一个安全漏洞,该漏洞源于在可抢占的上下文中使用了不安全的`__this_cpu_read`和`__this_cpu_write`操作。具体来说,`__blk_add_trace`函数在进程上下文中调用了`tracing_record_cmdline`,而后者期望在抢占被禁用的环境下运行。当抢占开启时,这些操作会触发内核断言(BUG),导致系统崩溃或内核恐慌。该漏洞要求低权限本地用户即可触发,主要影响系统的可用性,可能导致内核拒绝服务。修复补丁已通过调整调用上下文或禁用抢占来解决这个问题。
该漏洞的根源在于Linux内核blktrace子系统在处理块设备跟踪时的上下文管理错误。函数`tracing_record_cmdline`内部使用了`__this_cpu_read()`和`__this_cpu_write()`来访问每CPU变量`trace_cmdline_save`。这些操作是原子的,但前提是假设当前CPU不会发生改变,即必须在抢占被禁用(preemption disabled)的上下文中执行。内核通过`lockdep_assert_preemption_disabled()`对此进行了显式断言。然而,`__blk_add_trace()`函数在调用`tracing_record_cmdline(current)`时,尚未进行环形缓冲区(ring buffer)的预留,且此时处于完全开启抢占的进程上下文中。当本地低权限用户发起特定的I/O操作(如通过blktests套件中的测试用例)触发blktrace路径时,会在`blk_add_trace_bio`等相关路径中执行上述逻辑。由于抢占开启,CPU可能切换,导致`__this_cpu_read`读取到错误的数据或触发内核检测机制,打印“BUG: using __this_cpu_read() in preemptible code”错误信息,并最终导致内核崩溃或系统挂起。