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

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

Gravedad CVSS v3.1:
MEDIA
Tipo:
No Disponible / Otro tipo
Fecha de publicación:
26/08/2024
Última modificación:
12/09/2024

Descripción

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: memcg: protege el acceso simultáneo a mem_cgroup_idr. el commit 73f576c04b94 ("mm: memcontrol: repara el error de creación de cgroup después de muchos trabajos pequeños") desacopla los ID de memcg del espacio de ID de CSS para reparar el cgroup. fracasos de la creación. Introdujo IDR para mantener el espacio de identificación de memcg. El IDR depende de mecanismos externos de sincronización para las modificaciones. Para mem_cgroup_idr, idr_alloc() e idr_replace() ocurren dentro de la devolución de llamada CSS y, por lo tanto, están protegidos a través de cgroup_mutex contra modificaciones simultáneas. Sin embargo, idr_remove() para mem_cgroup_idr no estaba protegido contra la concurrencia y se puede ejecutar simultáneamente para diferentes memcgs cuando alcanzan su referencia a cero. Arregla eso. Hemos estado viendo fallas del kernel basadas en list_lru con baja frecuencia en nuestra flota durante mucho tiempo. Estos fallos se produjeron en diferentes partes del código list_lru, incluidos list_lru_add(), list_lru_del() y el código de reparación. Tras una inspección más detallada, parecía que para un objeto determinado (dentry e inodo), el list_lru del super_block no tenía list_lru_one para el memcg de ese objeto. Las sospechas iniciales fueron que el objeto no estaba asignado a través de kmem_cache_alloc_lru() o de alguna manera memcg_list_lru_alloc() no pudo asignar list_lru_one() para un memcg pero devolvió el éxito. No se encontraron pruebas de estos casos. Mirando más profundamente, comenzamos a ver situaciones en las que la identificación de memcg válida no está presente en mem_cgroup_idr y, en algunos casos, varios memcg válidos tienen la misma identificación y mem_cgroup_idr apunta a uno de ellos. Entonces, la explicación más razonable es que estas situaciones pueden ocurrir debido a la ejecución entre múltiples llamadas idr_remove() o la ejecución entre idr_alloc()/idr_replace() e idr_remove(). Estas ejecuciones están provocando que varios memcgs adquieran el mismo ID y luego desconectar uno de ellos limpiaría list_lrus en el sistema para todos ellos. El acceso posterior desde otros memcgs a list_lru provoca bloqueos debido a que falta list_lru_one.

Productos y versiones vulnerables

CPE Desde Hasta
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 4.7 (incluyendo) 6.6.46 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.7 (incluyendo) 6.10.5 (excluyendo)
cpe:2.3:o:linux:linux_kernel:6.11:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.11:rc2:*:*:*:*:*:*