CVE-2023-53368 in LinuxИнформация

Сводка

по VulDB • 13.06.2026

В ядре Linux устранена следующая уязвимость:

tracing: Исправлена проблема гонки (race condition) между записью в буфер процессора и его заменой (swap).

Предупреждение возникало в функции rb_end_commit() при выполнении следующего кода: 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

Это происходит из-за гонки между записью события в буфер процессора и заменой (swap) буфера процессора через файл per_cpu/cpu0/snapshot:

Запись на CPU 0 Замена буфера по периферийному адресу cpu0/snapshot на CPU 1 -------- -------- 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 = 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. Предупреждение (WARN) из-за неверного состояния '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 & ```

Для исправления этой проблемы, насколько я понимаю (IIUC), мы можем использовать smp_call_function_single() для выполнения замены на целевом процессоре, где расположен буфер, чтобы избежать описанной выше гонки.

Once again VulDB remains the best source for vulnerability data.

Ответственный

Linux

Резервировать

17.09.2025

Раскрытие

17.09.2025

Модерация

принято

Вход

VDB-324731

EPSS

0.00131

KEV

Нет

Деятельности

Очень низкий

Источники

Do you want to use VulDB in your project?

Use the official API to access entries easily!