Vulnerabilidad en kernel de Linux (CVE-2022-49771)
Gravedad:
Pendiente de análisis
Tipo:
No Disponible / Otro tipo
Fecha de publicación:
01/05/2025
Última modificación:
02/05/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)".
Impacto
Referencias a soluciones, herramientas e información
- https://git.kernel.org/stable/c/0c8d4112df329bf3dfbf27693f918c3b08676538
- https://git.kernel.org/stable/c/3a1c35d72dc0b34d1e746ed705790c0f630aa427
- https://git.kernel.org/stable/c/4fe1ec995483737f3d2a14c3fe1d8fe634972979
- https://git.kernel.org/stable/c/5398b8e275bf81a2517b327d216c0f37ac9ac5ae
- https://git.kernel.org/stable/c/6a818db0d5aecf80d4ba9e10ac153f60adc629ca
- https://git.kernel.org/stable/c/6ffce7a92ef5c68f7e5d6f4d722c2f96280c064b
- https://git.kernel.org/stable/c/b545c0e1e4094d4de2bdfe9a3823f9154b0c0005
- https://git.kernel.org/stable/c/f59f5a269ca5e43c567aca7f1f52500a0186e9b7