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

Vulnerabilidad en kernel de Linux (CVE-2025-22083)

Gravedad CVSS v3.1:
ALTA
Tipo:
CWE-416 Utilización después de liberación
Fecha de publicación:
16/04/2025
Última modificación:
31/10/2025

Descripción

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: vhost-scsi: Se corrige la gestión de múltiples llamadas a vhost_scsi_set_endpoint Si vhost_scsi_set_endpoint se llama varias veces sin un vhost_scsi_clear_endpoint entre ellas, podemos encontrar múltiples errores encontrados por Haoran Zhang: 1. use-after-free cuando no se encuentran tpgs: Esto corrige un use-after-free que ocurre cuando vhost_scsi_set_endpoint se llama más de una vez y las llamadas después de la primera llamada no encuentran ningún tpg para agregar al vs_tpg. Cuando vhost_scsi_set_endpoint encuentra primero tpgs para agregar a la matriz vs_tpg match=true, entonces haremos: vhost_vq_set_backend(vq, vs_tpg); ... kfree(vs->vs_tpg); vs->vs_tpg = vs_tpg; Si se llama nuevamente a vhost_scsi_set_endpoint y no se encuentran tpgs, match=false, por lo que omitimos la llamada a vhost_vq_set_backend dejando el puntero al vs_tpg que luego liberamos mediante: kfree(vs->vs_tpg); vs->vs_tpg = vs_tpg; Si luego se envía una solicitud scsi, hacemos: vhost_scsi_handle_vq -> vhost_scsi_get_req -> vhost_vq_get_backend que ve el vs_tpg en el que acabamos de realizar un kfree. 2. Se bloquea la eliminación del directorio tpg: este parche corrige un problema por el cual no podemos eliminar un directorio tpg de capa LIO/objetivo (y estructuras por encima de él como el objetivo) debido a que el recuento de referencias cae a -1. El problema radica en que si vhost_scsi_set_endpoint detecta que ya hay un TPG en la matriz vs->vs_tpg, o si este se ha eliminado y, por lo tanto, target_depend_item falla, el controlador goto undepend ejecutará `target_undepend_item` en todos los TPG de la matriz vs_tpg, reduciendo su recuento de referencias a 0. En este momento, vs_tpg contiene tanto los TPG que hemos añadido en la llamada actual a vhost_scsi_set_endpoint como los TPG añadidos en llamadas anteriores que también están en vs->vs_tpg. Posteriormente, al ejecutarse vhost_scsi_clear_endpoint, ejecutará `target_undepend_item` en todos los TPG de vs->vs_tpg, lo que reducirá su recuento de referencias a -1. En ese caso, el espacio de usuario no podrá eliminar el TPG y se bloqueará al intentar ejecutar `rmdir` en el directorio del TPG. 3. Fuga de TPG: Esto corrige un error que permitía filtrar TPG y hacer que no se pudieran eliminar, ya que el nombre del objetivo se sobrescribía al llamar a vhost_scsi_set_endpoint varias veces, pero con nombres de objetivo diferentes. El error se produce si un usuario llama a VHOST_SCSI_SET_ENDPOINT y configura un dispositivo vhost-scsi para la asignación de destino/TPG, y luego vuelve a llamar a VHOST_SCSI_SET_ENDPOINT con un nuevo nombre de objetivo que contiene TPG desconocidos (target1 tiene TPG1, pero target2 tiene TPG2). En este caso, no se elimina la antigua asignación de TPG del objetivo, sino que se sobrescribe el nombre del objetivo y la matriz vs->vs_tpg. Posteriormente, al ejecutar vhost_scsi_clear_endpoint, se pasa el nombre de target1 o target2, y solo se coincidirán los TPG de ese objetivo al recorrer vs->vs_tpg. Luego, regresaremos de la función sin ejecutar `target_undepend_item` en los tpgs. Debido a todos estos errores, parece que nunca se permitió llamar a `vhost_scsi_set_endpoint` varias veces. El usuario principal, QEMU, ya cuenta con comprobaciones para evitar este caso de uso. Por lo tanto, para solucionar los problemas, este parche impide que se llame a `vhost_scsi_set_endpoint` si ya se han agregado correctamente los tpgs. Para agregar, eliminar o cambiar la configuración de `tpg` o el nombre del destino, primero debe ejecutar `vhost_scsi_clear_endpoint`.

Productos y versiones vulnerables

CPE Desde Hasta
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 3.9.1 (incluyendo) 6.6.87 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.7 (incluyendo) 6.12.23 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.13 (incluyendo) 6.13.11 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.14 (incluyendo) 6.14.2 (excluyendo)
cpe:2.3:o:linux:linux_kernel:3.9:-:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:3.9:rc7:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:3.9:rc8:*:*:*:*:*:*