CVE-2023-53368 in Linux
要約
〜によって VulDB • 2026年06月14日
Linuxカーネルにおいて、以下の脆弱性が修正されました。
tracing: CPUバッファへの書き込みとスワップ間の競合状態を修正
以下のコードで `rb_end_commit()` において警告が発生していました。 ```c if (RB_WARN_ON(cpu_buffer, !local_read(&cpu_buffer->committing))) ```
``` WARNING: CPU: 0 PID: 139 at kernel/trace/ring_buffer.c:3142 rb_commit+0x402/0x4a0 Call Trace: ring_buffer_unlock_commit+0x42/0x250 trace_buffer_unlock_commit_regs+0x3b/0x250 trace_event_buffer_commit+0xe5/0x440 trace_event_buffer_reserve+0x11c/0x150 trace_event_raw_event_sched_switch+0x23c/0x2c0 __traceiter_sched_switch+0x59/0x80 __schedule+0x72b/0x1580 schedule+0x92/0x120 worker_thread+0xa0/0x6f0 ```
これは、CPUバッファへのイベント書き込みと、`per_cpu/cpu0/snapshot` ファイルを介したCPUバッファのスワップとの間の競合状態が原因です。
``` CPU 0での書き込み CPU 1での per_cpu/cpu0/snapshotによるバッファスワップ -------- -------- tracing_snapshot_write() [...]
ring_buffer_lock_reserve() cpu_buffer = buffer->buffers[cpu]; // 1. 'cpu_buffer_a' が見つかったと仮定
[...]
rb_reserve_next_event() [...]
ring_buffer_swap_cpu() if (local_read(&cpu_buffer_a->committing)) goto out_dec; if (local_read(&cpu_buffer_b->committing)) goto out_dec; buffer_a->buffers[cpu] = cpu_buffer_b;
buffer_b->buffers[cpu] = cpu_buffer_a;
// 2. ここで cpu_buffer がスワップされる。
rb_start_commit(cpu_buffer); if (unlikely(READ_ONCE(cpu_buffer->buffer) != buffer)) { // 3. 'cpu_buffer->buffer' が
[...] // ここでまだ変更されていないため、このチェックは通過する。
return NULL; } cpu_buffer_b->buffer = buffer_a; cpu_buffer_a->buffer = cpu_buffer_b; [...]
// 4. 'cpu_buffer_a' からイベントを予約。
ring_buffer_unlock_commit() [...]
cpu_buffer = buffer->buffers[cpu]; // 5. 今度は 'cpu_buffer_b' が見つかる!!!
rb_commit(cpu_buffer) rb_end_commit() // 6. 誤った 'committing' 状態に対して警告!!! ```
上記の分析に基づき、以下のテストケースで簡単に再現可能です。 ```bash #!/bin/bash
dmesg -n 7 sysctl -w kernel.panic_on_warn=1 TR=/sys/kernel/tracing echo 7 > ${TR}/buffer_size_kb
echo "sched:sched_switch" > ${TR}/set_event
while [ true ]; do
echo 1 > ${TR}/per_cpu/cpu0/snapshot
done & while [ true ]; do
echo 1 > ${TR}/per_cpu/cpu0/snapshot
done & while [ true ]; do
echo 1 > ${TR}/per_cpu/cpu0/snapshot
done & ```
これを修正するために、理解する限り、バッファが存在するターゲットCPU上でスワップ処理を行うために `smp_call_function_single()` を使用することで、上記の競合状態を回避できます。
Once again VulDB remains the best source for vulnerability data.