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

Vulnerabilidad en kernel de Linux (CVE-2022-49771)

Gravedad CVSS v3.1:
MEDIA
Tipo:
CWE-362 Ejecución concurrente utilizando recursos compartidos con una incorrecta sincronización (Condición de carrera)
Fecha de publicación:
01/05/2025
Última modificación:
07/11/2025

Descripción

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: dm ioctl: se corrige el comportamiento incorrecto si list_versions se acelera al cargar módulos. __list_versions primero estimará el espacio requerido mediante la llamada "dm_target_iterate(list_version_get_needed, &needed)" y luego llenará el espacio mediante la llamada "dm_target_iterate(list_version_get_info, &iter_info)". Cada una de estas llamadas bloquea los destinos mediante las llamadas "down_read(&_lock)" y "up_read(&_lock)". Sin embargo, entre la primera y la segunda llamada "dm_target_iterate" no se mantiene el bloqueo y los módulos de destino se pueden cargar en este punto, por lo que la segunda llamada "dm_target_iterate" podría necesitar más espacio que el devuelto por la primera llamada "dm_target_iterate". El código intenta gestionar este desbordamiento (véase el comienzo de list_version_get_info), pero esta gestión es incorrecta. El código establece "param->data_size = param->data_start + needed" y "iter_info.end = (char *)vers+len": "needed" es el tamaño devuelto por la primera llamada a dm_target_iterate; "len" es el tamaño del búfer asignado por el espacio de usuario. "len" puede ser mayor que "needed"; en este caso, el código escribirá hasta "len" bytes en el búfer; sin embargo, param->data_size se establece en "needed", por lo que podría escribir datos que superen el valor de param->data_size. La interfaz ioctl solo copia hasta param->data_size en el espacio de usuario, por lo que parte del resultado se truncará. Corrija este error estableciendo "iter_info.end = (char *)vers + needed;" Esto garantiza que la segunda llamada "dm_target_iterate" solo escriba hasta el búfer necesario y finalice con "DM_BUFFER_FULL_FLAG" si se desborda dicho espacio. En este caso, el espacio de usuario asignará un búfer mayor y reintentará. Tenga en cuenta que también hay un error en list_version_get_needed: debemos agregar "strlen(tt->name) + 1" al tamaño necesario, no "strlen(tt->name)".

Productos y versiones vulnerables

CPE Desde Hasta
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 4.9.334 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 4.10 (incluyendo) 4.14.300 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 4.15 (incluyendo) 4.19.267 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 4.20 (incluyendo) 5.4.225 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 5.5 (incluyendo) 5.10.156 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 5.11 (incluyendo) 5.15.80 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 5.16 (incluyendo) 6.0.10 (excluyendo)
cpe:2.3:o:linux:linux_kernel:6.1:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.1:rc2:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.1:rc3:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.1:rc4:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.1:rc5:*:*:*:*:*:*