Vulnerabilidad en kernel de Linux (CVE-2024-42148)
Gravedad CVSS v3.1:
ALTA
Tipo:
No Disponible / Otro tipo
Fecha de publicación:
30/07/2024
Última modificación:
05/09/2024
Descripción
En el kernel de Linux, se resolvió la siguiente vulnerabilidad: bnx2x: corrige múltiples índices de matriz UBSAN fuera de los límites. Corrige las advertencias de UBSAN que ocurren cuando se usa un sistema con 32 núcleos de CPU físicos o más, o cuando el usuario define un número. de colas Ethernet mayores o iguales a FP_SB_MAX_E1x usando el parámetro del módulo num_queues. Actualmente hay una lectura/escritura fuera de los límites que se produce en la matriz "struct stats_query_entry query" presente dentro de la estructura "bnx2x_fw_stats_req" en "drivers/net/ethernet/broadcom/bnx2x/bnx2x.h". Mirando la definición de la matriz "struct stats_query_entry query": struct stats_query_entry query[FP_SB_MAX_E1x+ BNX2X_FIRST_QUEUE_QUERY_IDX]; FP_SB_MAX_E1x se define como el número máximo de interrupciones de ruta rápida y tiene un valor de 16, mientras que BNX2X_FIRST_QUEUE_QUERY_IDX tiene un valor de 3, lo que significa que la matriz tiene un tamaño total de 19. Dado que los accesos a "struct stats_query_entry query" están compensados por BNX2X_FIRST_QUEUE_QUERY_IDX, eso significa que el número total de colas Ethernet no debe exceder FP_SB_MAX_E1x (16). Sin embargo, una de estas colas está reservada para FCOE y, por lo tanto, el número de colas Ethernet debe establecerse en [FP_SB_MAX_E1x -1] (15) si FCOE está habilitado o [FP_SB_MAX_E1x] (16) si no lo está. Esto también se describe en un comentario en el código fuente en drivers/net/ethernet/broadcom/bnx2x/bnx2x.h justo encima de la definición de macro de FP_SB_MAX_E1x. A continuación se muestra la parte de esta explicación que es importante para este parche /* * El número total de colas L2, vectores MSIX y contextos HW (CID) está * controlado por el número de bloques de estado de ruta rápida admitidos por el * dispositivo (HW /FW). Cada bloque de estado de ruta rápida (FP-SB), también conocido como bloque de estado no predeterminado *, representa un contexto de interrupciones independiente que puede * servir a una cola de red L2 normal. Sin embargo, las colas L2 especiales, como * como la cola FCoE, no requieren un FP-SB y otros componentes como * el CNIC pueden consumir FP-SB, lo que reduce el número de colas L2 posibles * * Si el número máximo de FP-SB disponibles es X, entonces : * a. Si se admite CNIC, consume 1 FP-SB, por lo que el número máximo de * colas L2 regulares es Y=X-1 * b. En el modo MF, el número real de colas L2 es Y= (X-1/MF_factor) * c. Si se admite la cola FCoE L2, el número real de colas L2 * es Y+1 * d. El número de irqs (vectores MSIX) es Y+1 (uno adicional para * interrupciones de ruta lenta) o Y+2 si se admite CNIC (un contexto de interrupción * FP adicional para el CNIC). * e. El número de contexto de HW (recuento de CID) siempre es X o X+1 si se admite la cola FCoE * L2. El cid para la cola FCoE L2 siempre es X. */ Sin embargo, este controlador también admite NIC que usan el controlador E2, que puede manejar más colas debido a que tiene más FP-SB representado por FP_SB_MAX_E2. Al observar las confirmaciones cuando se agregó el soporte E2, originalmente se usaban los parámetros E1x: commit f2e0899f0f27 ("bnx2x: Add 57712 support"). En aquel entonces, FP_SB_MAX_E2 se configuró en 16 al igual que E1x. Sin embargo, el controlador se actualizó posteriormente para aprovechar al máximo el E2 en lugar de limitarlo a las capacidades del E1x. Pero hasta donde sabemos, la "consulta stats_query_entry" de la matriz todavía se limitaba a usar el FP-SB disponible para las tarjetas E1x como parte de una sobreseñal cuando se actualizó el controlador para aprovechar al máximo el E2, y ahora con el Al ser consciente el controlador del mayor tamaño de cola admitido por las NIC E2, se generan las advertencias de UBSAN que se ven en los seguimientos de pila a continuación. Este parche aumenta el tamaño de la matriz "stats_query_entry query" reemplazando FP_SB_MAX_E1x con FP_SB_MAX_E2 para que sea lo suficientemente grande como para manejar ambos tipos de NIC. Seguimientos de pila: UBSAN: ---truncado---
Impacto
Puntuación base 3.x
7.80
Gravedad 3.x
ALTA
Productos y versiones vulnerables
CPE | Desde | Hasta |
---|---|---|
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 3.3 (incluyendo) | 4.19.318 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.20 (incluyendo) | 5.4.280 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.5 (incluyendo) | 5.10.222 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.11 (incluyendo) | 5.15.163 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.16 (incluyendo) | 6.1.98 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.2 (incluyendo) | 6.6.39 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.7 (incluyendo) | 6.9.9 (excluyendo) |
Para consultar la lista completa de nombres de CPE con productos y versiones, ver esta página
Referencias a soluciones, herramientas e información
- https://git.kernel.org/stable/c/0edae06b4c227bcfaf3ce21208d49191e1009d3b
- https://git.kernel.org/stable/c/134061163ee5ca4759de5c24ca3bd71608891ba7
- https://git.kernel.org/stable/c/8b17cec33892a66bbd71f8d9a70a45e2072ae84f
- https://git.kernel.org/stable/c/9504a1550686f53b0bab4cab31d435383b1ee2ce
- https://git.kernel.org/stable/c/b9ea38e767459111a511ed4fb74abc37db95a59d
- https://git.kernel.org/stable/c/cbe53087026ad929cd3950508397e8892a6a2a0f
- https://git.kernel.org/stable/c/cfb04472ce33bee2579caf4dc9f4242522f6e26e
- https://git.kernel.org/stable/c/f1313ea92f82451923e28ab45a4aaa0e70e80b98