Vulnerabilidad en kernel de Linux (CVE-2024-43855)
Gravedad CVSS v3.1:
MEDIA
Tipo:
CWE-476
Desreferencia a puntero nulo (NULL)
Fecha de publicación:
17/08/2024
Última modificación:
22/08/2024
Descripción
En el kernel de Linux, se resolvió la siguiente vulnerabilidad: md: corrige el punto muerto entre mddev_suspend y purgar bio. El punto muerto ocurre cuando mddev se suspende mientras se realiza algún purga de biografía. Es una cuestión compleja. T1. la primera descarga está en la etapa final, borra 'mddev->flush_bio' e intenta enviar datos, pero se bloquea porque T4 suspende mddev. T2. la segunda descarga establece 'mddev->flush_bio' e intenta poner en cola md_submit_flush_data(), que ya se está ejecutando (T1) y no se ejecutará nuevamente si está en la misma CPU que T1. T3. el tercer enjuague incluye active_io e intenta descargar, pero se bloquea porque 'mddev->flush_bio' no es NULL (establecido por T2). T4. Se llama a mddev_suspend() y espera que active_io dec a 0, que es incrementado por T3. T1 T2 T3 T4 (flush 1) (flush 2) (tercero 3) (suspender) md_submit_flush_data mddev->flush_bio = NULL; . . md_flush_request. mddev->flush_bio = biografía. cola submit_flushes . . . . md_handle_request. . activo_io + 1. . md_flush_request. . ¡espera! mddev->flush_bio. . . . mddev_suspend. . ¡espera! active_io. . . enviar_flushes. queue_work md_submit_flush_data. //md_submit_flush_data ya se está ejecutando (T1). md_handle_request espera reanudar la raíz del problema es el aumento/disminución no atómico de active_io durante el proceso de descarga. active_io disminuye antes de que md_submit_flush_data se ponga en cola y se inc poco después de ejecutar md_submit_flush_data(). md_flush_request active_io + 1 submit_flushes active_io - 1 md_submit_flush_data md_handle_request active_io + 1 make_request active_io - 1 Si active_io se dec después de md_handle_request() en lugar de dentro de submit_flushes(), se puede llamar a make_request() directamente en lugar de md_handle_request() en md_submit_flush_data(), y active_io solo aumentará y disminuirá una vez durante todo el proceso de descarga. Se solucionará el punto muerto. Además, la única diferencia entre solucionar el problema y antes es que no hay manejo de errores de devolución de make_request(). Pero después de que el parche anterior limpió md_write_start(), make_requst() solo devuelve un error en raid5_make_request() por dm-raid, consulte el commit 41425f96d7aa ("dm-raid456, md/raid456: solucione un punto muerto para dm-raid456 mientras io concurre con reshape) ". Dado que dm siempre divide los datos y la operación de descarga en dos io separados, el tamaño de io de descarga enviado por dm siempre es 0, no se llamará a make_request() en md_submit_flush_data(). Para evitar que modificaciones futuras introduzcan problemas, agregue WARN_ON para garantizar que make_request() no se devuelva ningún error en este contexto.
Impacto
Puntuación base 3.x
5.50
Gravedad 3.x
MEDIA
Productos y versiones vulnerables
CPE | Desde | Hasta |
---|---|---|
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.1.103 (excluyendo) | |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.2 (incluyendo) | 6.6.44 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.7 (incluyendo) | 6.10.3 (excluyendo) |
Para consultar la lista completa de nombres de CPE con productos y versiones, ver esta página