CVE-2023-53368 in Linuxinformation

Résumé

par VulDB • 13/06/2026

Dans le noyau Linux, la vulnérabilité suivante a été corrigée :

tracing : Correction d'un problème de condition de course (race) entre l'écriture dans le tampon CPU et son échange (swap).

Un avertissement s'est produit dans rb_end_commit() au niveau du code suivant : if (RB_WARN_ON(cpu_buffer, !local_read(&cpu_buffer->committing)))

AVERTISSEMENT : CPU: 0 PID: 139 à kernel/trace/ring_buffer.c:3142 rb_commit+0x402/0x4a0 Pile d'appels (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

Cela est dû à une condition de course entre l'écriture d'un événement dans le tampon CPU et l'échange (swap) du tampon CPU via /sys/kernel/tracing/per_cpu/cpu0/snapshot :

Écriture sur le CPU 0 Échange de tampon par per_cpu/cpu0/snapshot sur le CPU 1 -------- ------------------------------- tracing_snapshot_write() [...]

ring_buffer_lock_reserve() cpu_buffer = buffer->buffers[cpu]; // 1. Supposons que l'on trouve '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. Le tampon 'cpu_buffer' a été échangé ici.

rb_start_commit(cpu_buffer); if (unlikely(READ_ONCE(cpu_buffer->buffer) != buffer)) { // 3. Cette vérification passe car 'cpu_buffer->buffer'
[...] // n'a pas encore changé à ce stade.
return NULL; } cpu_buffer_b->buffer = buffer_a; cpu_buffer_a->buffer = buffer_b; [...]

// 4. Réservation d'un événement depuis 'cpu_buffer_a'.

ring_buffer_unlock_commit() [...]
cpu_buffer = buffer->buffers[cpu]; // 5. On trouve maintenant 'cpu_buffer_b' !!!
rb_commit(cpu_buffer) rb_end_commit() // 6. AVERTISSEMENT pour l'état de 'committing' incorrect !!!

Sur la base de cette analyse, nous pouvons facilement reproduire le problème avec le cas de test suivant : ``` 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 & ```

Pour corriger cela, si je comprends bien (IIUC), nous pouvons utiliser smp_call_function_single() pour effectuer l'échange sur le CPU cible où se trouve le tampon, afin d'éviter la condition de course susmentionnée.

Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.

Responsable

Linux

Réserver

17/09/2025

Divulgation

17/09/2025

Modérer

accepté

Entrée

VDB-324731

CPE

prêt

EPSS

0.00131

KEV

non

Activités

très faible

Sources

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!