Vulnerabilidad en kernel de Linux (CVE-2024-42239)
Gravedad CVSS v3.1:
MEDIA
Tipo:
No Disponible / Otro tipo
Fecha de publicación:
07/08/2024
Última modificación:
08/08/2024
Descripción
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: bpf: falla bpf_timer_cancel cuando se cancela la devolución de llamada. Dada una programación: timer1 cb timer2 cb bpf_timer_cancel(timer2); bpf_timer_cancel(timer1); Ambas llamadas a bpf_timer_cancel esperarían a que la otra devolución de llamada termine de ejecutarse, introduciendo un bloqueo. Agregue un recuento atomic_t llamado 'cancelación' en bpf_hrtimer. Esto realiza un seguimiento de todas las solicitudes de cancelación en vuelo para un temporizador BPF determinado. Siempre que cancelemos un temporizador BPF, debemos verificar si tenemos solicitudes de cancelación pendientes y, de ser así, debemos fallar la operación con un error (-EDEADLK) ya que la cancelación es sincrónica y espera a que termine de ejecutarse la devolución de llamada. Esto implica que podemos entrar en una situación de punto muerto que involucre dos o más devoluciones de llamada de temporizador ejecutándose en paralelo e intentando cancelarse entre sí. Tenga en cuenta que evitamos incrementar el contador de cancelación para el temporizador de destino (el que se cancela) si no se invoca bpf_timer_cancel desde una devolución de llamada, para evitar errores falsos. El objetivo de detectar cur->cancelar y devolver -EDEADLK es no ingresar a un ciclo de espera ocupado (que puede o no conducir a un bloqueo). Esto no se aplica en caso de que la persona que llama se encuentre en un contexto sin devolución de llamada; la otra parte puede continuar cancelando como mejor le parezca sin cometer errores. Antecedentes de intentos anteriores: Las versiones anteriores de este parche usaban un bit bool de 'cancelación' y usaban el siguiente patrón en temporizador->bloqueo para publicar el estado de cancelación. lock(t->lock); t->cancelling = true; mb(); if (cur->cancelling) return -EDEADLK; unlock(t->lock); hrtimer_cancel(t->timer); t->cancelling = false; El almacén fuera de la sección crítica podría sobrescribir una asignación de cancelación t->de solicitudes paralelas a verdadero, para garantizar que la devolución de llamada que se ejecuta en paralelo observe su estado de cancelación. Sería necesario borrar este bit de cancelación una vez que se complete hrtimer_cancel, pero la falta de serialización introdujo ejecuciones. Se exploró otra opción donde bpf_timer_start borraría el bit al (re)iniciar el temporizador bajo temporizador->bloqueo. Esto garantizaría el acceso serializado al bit de cancelación, pero puede permitir que se borre antes de que hrtimer_cancel en vuelo haya terminado de ejecutarse, de modo que los bloqueos puedan ocurrir nuevamente. Por lo tanto, elegimos un contador atómico para realizar un seguimiento de todas las solicitudes de cancelación pendientes y lo utilizamos para evitar bloqueos en caso de que las devoluciones de llamada intenten cancelarse entre sí mientras se ejecutan en paralelo.
Impacto
Puntuación base 3.x
5.50
Gravedad 3.x
MEDIA
Productos y versiones vulnerables
| CPE | Desde | Hasta |
|---|---|---|
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.15 (incluyendo) | 6.6.41 (excluyendo) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.7 (incluyendo) | 6.9.10 (excluyendo) |
Para consultar la lista completa de nombres de CPE con productos y versiones, ver esta página



