CVE

Vulnerabilidad en kernel de Linux (CVE-2024-46704)

Severidad:
Pendiente de análisis
Type:
No Disponible / Otro tipo
Fecha de publicación:
13/09/2024
Última modificación:
13/09/2024

Descripción

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: workqueue: Fix spruious data race in __flush_work() Al vaciar un elemento de trabajo para su cancelación, __flush_work() sabe que posee exclusivamente el elemento de trabajo a través de su bit PENDING. 134874e2eee9 ("workqueue: Allow cancel_work_sync() and disable_work() from atomic contexts on BH work items") agregó una lectura de @work->data para determinar si se debe usar la espera activa para los elementos de trabajo de BH que se están cancelando. Si bien la lectura es segura cuando @from_cancel, @work->data se leyó antes de probar @from_cancel para simplificar la estructura del código: data = *work_data_bits(work); if (from_cancel && !WARN_ON_ONCE(data & WORK_STRUCT_PWQ) && (data & WORK_OFFQ_BH)) { Si bien los datos leídos nunca se usaron si !@from_cancel, esto podría activar la detección de ejecución de datos de KCSAN de manera espuria: ====================================================================== ERROR: KCSAN: carrera de datos en __flush_work / __flush_work escribe en 0xffff8881223aa3e8 de 8 bytes por la tarea 3998 en la CPU 0: instrument_write include/linux/instrumented.h:41 [en línea] ___set_bit include/asm-generic/bitops/instrumented-non-atomic.h:28 [en línea] insert_wq_barrier kernel/workqueue.c:3790 [en línea] start_flush_work kernel/workqueue.c:4142 [en línea] __flush_work+0x30b/0x570 kernel/workqueue.c:4178 flush_work kernel/workqueue.c:4229 [en línea] ... leído hasta 0xffff8881223aa3e8 de 8 bytes por la tarea 50 en la CPU 1: __flush_work+0x42a/0x570 kernel/workqueue.c:4188 flush_work kernel/workqueue.c:4229 [en línea] flush_delayed_work+0x66/0x70 kernel/workqueue.c:4251 ... valor cambiado: 0x0000000000400000 -> 0xffff88810006c00d Reorganice el código para que @from_cancel se pruebe antes de acceder a @work->data. El único problema es que se activa la detección de KCSAN de manera espuria. Esto no debería necesitar READ_ONCE() ni otros calificadores de acceso. No hay cambios funcionales.