Cloudanix VulnDB

CVE-2026-23374

Medium · 5.5

CVSS

5.5

EPSS

0.1%

Published

Mar 25, 2026

CISA due date

—

Cloudanix analysis

Schedule a fix SSVC: Track

A tracing feature inside the Linux kernel can crash the whole system when it is used while other programs are actively reading or writing storage.

Exploitation
Local Privilege
Attacker needs
Low Privilege
Complexity
Low
Impact
Denial Of Service
Component
OS kernel
Class
Race Condition
Remediation
Upgrade
Effort
Medium
Patch risk
Low

What it actually does

The vulnerability permits __this_cpu_read() and __this_cpu_write() on trace_cmdline_save from preemptible process context inside __blk_add_trace(), blk_add_trace_bio(), blk_add_trace_plug(), blk_add_trace_unplug(), and blk_add_trace_rq() before ring-buffer reservation, violating the preemption-disabled contract required by tracing_record_cmdline() and lockdep_assert_preemption_disabled().

Why it matters to the business

Linux systems performing block I/O tracing or blktests can experience kernel panics or ftrace corruption, resulting in unplanned downtime, loss of observability for storage workloads, and potential data-plane disruption on production kernels that have not incorporated the fix.

How an attack unfolds

An attacker with local unprivileged access triggers repeated block I/O (reads, writes, or direct I/O) while blktrace is active; the early call to tracing_record_cmdline(current) in process context with preemption enabled immediately fires the preemption-disabled check, producing a BUG and kernel taint.

How to fix it

Upgrade the Linux kernel to a version containing the resolution for blktrace preemption handling; if an upgrade is not immediately possible, avoid enabling blktrace on production systems or apply the one-line context fix that moves tracing_record_cmdline() after ring-buffer reservation.

How to confirm the fix worked

Boot the patched kernel, re-run blktests blktrace/002 and any blktrace-enabled I/O workloads, and confirm absence of the 'BUG: using __this_cpu_read() in preemptible' message in dmesg; verify lockdep reports no preemption violations in the blk_tracer paths.

Typical attack path

  1. Obtain local shell on a Linux system running an affected kernel with blktrace enabled
  2. Start blktrace or run a workload that exercises submit_bio paths
  3. Perform I/O operations that reach __blk_add_trace() before preemption is disabled
  4. Trigger the __this_cpu_* access in preemptible context, causing the BUG

How to detect it

Search kernel logs (dmesg, journalctl) for the exact BUG string referencing __this_cpu_read in preemptible code and the caller tracing_record_cmdline; inspect ftrace or blktrace output for corruption artifacts after the reported timestamp.

  • BUG: using __this_cpu_read() in preemptible [00000000] code
  • caller is tracing_record_cmdline+0x10/0x40
  • blktrace/002 (blktrace ftrace corruption with sysfs trace)

What your security team should do

  • Prioritize kernel upgrade on all systems that enable blktrace or run storage-tracing workloads
  • Add the dmesg BUG string to SIEM rules for rapid detection until patches are deployed
  • Temporarily disable blktrace via sysfs on high-availability hosts if immediate patching is not feasible

The record

In the Linux kernel, the following vulnerability has been resolved: blktrace: fix __this_cpu_read/write in preemptible context tracing_record_cmdline() internally uses __this_cpu_read() and __this_cpu_write() on the per-CPU variable trace_cmdline_save, and trace_save_cmdline() explicitly asserts preemption is disabled via lockdep_assert_preemption_disabled(). These operations are only safe when preemption is off, as they were designed to be called from the scheduler context (probe_wakeup_sched_switch() / probe_wakeup()). __blk_add_trace() was calling tracing_record_cmdline(current) early in the blk_tracer path, before ring buffer reservation, from process context where preemption is fully enabled. This triggers the following using blktests/blktrace/002: blktrace/002 (blktrace ftrace corruption with sysfs trace) [failed] runtime 0.367s ... 0.437s something found in dmesg: [ 81.211018] run blktests blktrace/002 at 2026-02-25 22:24:33 [ 81.239580] null_blk: disk nullb1 created [ 81.357294] BUG: using __this_cpu_read() in preemptible [00000000] code: dd/2516 [ 81.362842] caller is tracing_record_cmdline+0x10/0x40 [ 81.362872] CPU: 16 UID: 0 PID: 2516 Comm: dd Tainted: G N 7.0.0-rc1lblk+ #84 PREEMPT(full) [ 81.362877] Tainted: [N]=TEST [ 81.362878] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.17.0-0-gb52ca86e094d-prebuilt.qemu.org 04/01/2014 [ 81.362881] Call Trace: [ 81.362884] <TASK> [ 81.362886] dump_stack_lvl+0x8d/0xb0 ... (See '/mnt/sda/blktests/results/nodev/blktrace/002.dmesg' for the entire message) [ 81.211018] run blktests blktrace/002 at 2026-02-25 22:24:33 [ 81.239580] null_blk: disk nullb1 created [ 81.357294] BUG: using __this_cpu_read() in preemptible [00000000] code: dd/2516 [ 81.362842] caller is tracing_record_cmdline+0x10/0x40 [ 81.362872] CPU: 16 UID: 0 PID: 2516 Comm: dd Tainted: G N 7.0.0-rc1lblk+ #84 PREEMPT(full) [ 81.362877] Tainted: [N]=TEST [ 81.362878] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.17.0-0-gb52ca86e094d-prebuilt.qemu.org 04/01/2014 [ 81.362881] Call Trace: [ 81.362884] <TASK> [ 81.362886] dump_stack_lvl+0x8d/0xb0 [ 81.362895] check_preemption_disabled+0xce/0xe0 [ 81.362902] tracing_record_cmdline+0x10/0x40 [ 81.362923] __blk_add_trace+0x307/0x5d0 [ 81.362934] ? lock_acquire+0xe0/0x300 [ 81.362940] ? iov_iter_extract_pages+0x101/0xa30 [ 81.362959] blk_add_trace_bio+0x106/0x1e0 [ 81.362968] submit_bio_noacct_nocheck+0x24b/0x3a0 [ 81.362979] ? lockdep_init_map_type+0x58/0x260 [ 81.362988] submit_bio_wait+0x56/0x90 [ 81.363009] __blkdev_direct_IO_simple+0x16c/0x250 [ 81.363026] ? __pfx_submit_bio_wait_endio+0x10/0x10 [ 81.363038] ? rcu_read_lock_any_held+0x73/0xa0 [ 81.363051] blkdev_read_iter+0xc1/0x140 [ 81.363059] vfs_read+0x20b/0x330 [ 81.363083] ksys_read+0x67/0xe0 [ 81.363090] do_syscall_64+0xbf/0xf00 [ 81.363102] entry_SYSCALL_64_after_hwframe+0x76/0x7e [ 81.363106] RIP: 0033:0x7f281906029d [ 81.363111] Code: 31 c0 e9 c6 fe ff ff 50 48 8d 3d 66 63 0a 00 e8 59 ff 01 00 66 0f 1f 84 00 00 00 00 00 80 3d 41 33 0e 00 00 74 17 31 c0 0f 05 <48> 3d 00 f0 ff ff 77 5b c3 66 2e 0f 1f 84 00 00 00 00 00 48 83 ec [ 81.363113] RSP: 002b:00007ffca127dd48 EFLAGS: 00000246 ORIG_RAX: 0000000000000000 [ 81.363120] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f281906029d [ 81.363122] RDX: 0000000000001000 RSI: 0000559f8bfae000 RDI: 0000000000000000 [ 81.363123] RBP: 0000000000001000 R08: 0000002863a10a81 R09: 00007f281915f000 [ 81.363124] R10: 00007f2818f77b60 R11: 0000000000000246 R12: 0000559f8bfae000 [ 81.363126] R13: 0000000000000000 R14: 0000000000000000 R15: 000000000000000a [ 81.363142] </TASK> The same BUG fires from blk_add_trace_plug(), blk_add_trace_unplug(), and blk_add_trace_rq() paths as well. The purpose of tracin ---truncated---

Affected packages

Ecosystem Package Introduced Fixed