CVE

Vulnerabilidad en kernel de Linux (CVE-2023-52474)

Severidad:
Pendiente de análisis
Type:
No Disponible / Otro tipo
Fecha de publicación:
26/02/2024
Última modificación:
26/02/2024

Descripción

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: IB/hfi1: Corrección de errores con solicitudes SDMA de usuarios multi-iovec que no pertenecen al extremo PAGE_SIZE. El procesamiento de solicitudes SDMA del usuario hfi1 tiene dos errores que pueden causar daños en los datos de las solicitudes SDMA de los usuarios que tienen múltiples carga útil de iovecs donde un iovec que no sea el iovec de cola no se ejecuta hasta el límite de la página para el búfer señalado por ese iovec.a Estos son los errores específicos: 1. user_sdma_txadd() no usa la estructura user_sdma_iovec->iov.iov_len. Más bien, user_sdma_txadd() sumará PAGE_SIZE bytes desde iovec al paquete, incluso si algunos de esos bytes ya pasaron de iovec->iov.iov_len y, por lo tanto, no están destinados a estar en el paquete. 2. user_sdma_txadd() y user_sdma_send_pkts() no logran avanzar al siguiente iovec en user_sdma_request->iovs cuando el iovec actual no es PAGE_SIZE y no contiene suficientes datos para completar el paquete. El paquete transmitido contendrá datos incorrectos de las páginas de iovec. Esto no ha sido un problema con los paquetes SDMA de hfi1 Verbs o PSM2 porque solo producen iovecs que terminan antes de PAGE_SIZE como iovec final de una solicitud SDMA. La corrección de estos errores expone otros errores con el caché de pin SDMA (struct mmu_rb_handler) que impiden admitir solicitudes SDMA del usuario con múltiples iovecs de carga útil cuyos buffers no terminan en PAGE_SIZE. Entonces este compromiso también soluciona esos problemas. Estos son los errores de mmu_rb_handler que pueden afectar las solicitudes SDMA de usuarios de carga útil multi-iovec que no son de PAGE_SIZE-end: 1. La superposición de rangos de memoria en mmu_rb_handler dará como resultado fijaciones duplicadas. 2. Al extender una entrada mmu_rb_handler existente (struct mmu_rb_node), el código mmu_rb (1) elimina la entrada existente bajo un candado, (2) libera ese candado, fija las nuevas páginas, (3) luego vuelve a adquirir el candado para insertar la entrada extendida mmu_rb_node. Si alguien más entra e inserta una entrada superpuesta entre (2) y (3), insertar en (3) fallará. En este caso, el código de ruta de error desancla _todas_ las páginas del mmu_rb_node original o del nuevo mmu_rb_node que se insertó entre (2) y (3). 3. En hfi1_mmu_rb_remove_unless_exact(), mmu_rb_node->refcount se incrementa fuera de mmu_rb_handler->lock. Como resultado, mmu_rb_node podría ser desalojado por otro subproceso que obtenga mmu_rb_handler->lock y verifique mmu_rb_node->refcount antes de que se incremente mmu_rb_node->refcount. 4. En relación con el punto 2 anterior, la ruta de error de envío de solicitudes SDMA no verifica mmu_rb_node->refcount antes de liberar el objeto mmu_rb_node. Si hay otras solicitudes de SDMA en curso cuyos iovecs tienen punteros a los nodos mmu_rb_nodos ahora liberados, se eliminará la referencia a esos punteros a los nodos mmu_rb ahora liberados cuando se completen esas solicitudes de SDMA.