Instituto Nacional de ciberseguridad. Sección Incibe
Instituto Nacional de Ciberseguridad. Sección INCIBE-CERT

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

Gravedad CVSS v3.1:
MEDIA
Tipo:
No Disponible / Otro tipo
Fecha de publicación:
12/03/2025
Última modificación:
01/10/2025

Descripción

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: bpf: Corrección de interbloqueo al liberar almacenamiento de cgroup. El siguiente commit bc235cdb423a ("bpf: Prevenir interbloqueo desde bpf_task_storage_[get|delete] recursivo") introdujo por primera vez la prevención de interbloqueo para programas fentry/fexit que se conectaban a los ayudantes bpf_task_storage. Este commit también empleó la lógica de map free path en su versión v6. Más tarde, bpf_cgrp_storage se introdujo por primera vez en c4bcfb38a95e ("bpf: Implementar almacenamiento cgroup disponible para programas bpf no adjuntos a cgroup") que enfrenta el mismo problema que bpf_task_storage, en lugar de su contador de ocupación, se pasó NULL a bpf_local_storage_map_free() que abrió una ventana para causar un bloqueo: (acquiring local_storage->lock) _raw_spin_lock_irqsave+0x3d/0x50 bpf_local_storage_update+0xd1/0x460 bpf_cgrp_storage_get+0x109/0x130 bpf_prog_a4d4a370ba857314_cgrp_ptr+0x139/0x170 ? __bpf_prog_enter_recur+0x16/0x80 bpf_trampoline_6442485186+0x43/0xa4 cgroup_storage_ptr+0x9/0x20 (manteniendo el bloqueo de almacenamiento local) bpf_selem_unlink_storage_nolock.constprop.0+0x135/0x160 bpf_selem_unlink_storage+0x6f/0x110 bpf_local_storage_map_free+0xa2/0x110 bpf_map_free_deferred+0x5b/0x90 process_one_work+0x17c/0x390 subproceso de trabajo+0x251/0x360 kthread+0xd2/0x100 ret_from_fork+0x34/0x50 ret_from_fork_asm+0x1a/0x30 Programas: - A: SEC("fentry/cgroup_storage_ptr") - cgid (BPF_MAP_TYPE_HASH) Registra el ID del grupo de control al que pertenece la tarea actual en este mapa hash, utilizando la dirección del grupo de control como clave del mapa. - cgrpa (BPF_MAP_TYPE_CGRP_STORAGE) Si la tarea actual es un kworker, busca el mapa hash anterior utilizando el parámetro de función @owner como clave para obtener su ID de grupo de control correspondiente, que luego se utiliza para obtener un puntero confiable al grupo de control mediante bpf_cgroup_from_id(). Este puntero confiable se puede pasar a bpf_cgrp_storage_get() para finalmente activar el problema de interbloqueo. - B: SEC("tp_btf/sys_enter") - cgrpb (BPF_MAP_TYPE_CGRP_STORAGE). El único propósito de este programa es llenar el mapa hash del Programa A llamando a bpf_cgrp_storage_get() para tantas tareas de espacio de usuario como sea posible. Pasos para reproducir: - Ejecutar A; - while (true) { Ejecutar B; Destruir B; }. Solucione este problema pasando su contador de ocupación al procedimiento libre para que pueda incrementarse correctamente antes del bloqueo de almacenamiento/smap.

Productos y versiones vulnerables

CPE Desde Hasta
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.2 (incluyendo) 6.6.80 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.7 (incluyendo) 6.12.17 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.13 (incluyendo) 6.13.5 (excluyendo)
cpe:2.3:o:linux:linux_kernel:6.14:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.14:rc2:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.14:rc3:*:*:*:*:*:*