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

Vulnerabilidad en kernel de Linux (CVE-2024-35809)

Gravedad CVSS v3.1:
MEDIA
Tipo:
CWE-362 Ejecución concurrente utilizando recursos compartidos con una incorrecta sincronización (Condición de carrera)
Fecha de publicación:
17/05/2024
Última modificación:
23/12/2025

Descripción

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: PCI/PM: drena las devoluciones de llamada inactivas en tiempo de ejecución antes de eliminar el controlador. Una condición de ejecución entre la devolución de llamada .runtime_idle() y la devolución de llamada .remove() en el controlador PCI rtsx_pcr conduce a un crash de kernel debido a un error de página no controlado [1]. El problema es que no se espera que rtsx_pci_runtime_idle() se ejecute después de llamar a pm_runtime_get_sync(), pero esto último realmente no garantiza eso. Solo garantiza que las devoluciones de llamada de suspensión y reanudación no se ejecutarán cuando regrese. Sin embargo, si ya se está ejecutando una devolución de llamada .runtime_idle() cuando se llama a pm_runtime_get_sync(), este último notará que el estado de PM en tiempo de ejecución del dispositivo es RPM_ACTIVE y regresará de inmediato sin esperar a que se complete el primero. De hecho, no puede esperar a que se complete .runtime_idle() porque puede ser llamado desde esa devolución de llamada (podría decirse que no tiene mucho sentido hacerlo, pero no está estrictamente prohibido). Por lo tanto, en general, quien proporciona una devolución de llamada .runtime_idle() debe protegerla para que no se ejecute en paralelo con cualquier código que se ejecute después de pm_runtime_get_sync(). [Tenga en cuenta que .runtime_idle() no se iniciará después de que pm_runtime_get_sync() haya regresado, pero puede continuar ejecutándose si comenzó antes.] Una forma de abordar esa condición de ejecución es llamar a pm_runtime_barrier() después de pm_runtime_get_sync() (no antes porque es necesario un valor distinto de cero del contador de uso de PM en tiempo de ejecución para evitar que se invoquen devoluciones de llamada de PM en tiempo de ejecución) para esperar a que se complete la devolución de llamada .runtime_idle() en caso de que se esté ejecutando en ese punto. Un lugar adecuado para hacerlo es pci_device_remove() que llama a pm_runtime_get_sync() antes de eliminar el controlador, por lo que también puede llamar a pm_runtime_barrier() posteriormente, lo que evitará que se produzca la ejecución en cuestión, no sólo en el controlador rtsx_pcr, sino en cualquier controlador PCI que proporcione devoluciones de llamada .runtime_idle().

Productos y versiones vulnerables

CPE Desde Hasta
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 4.19.312 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 4.20 (incluyendo) 5.4.274 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 5.5 (incluyendo) 5.10.215 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 5.11 (incluyendo) 5.15.154 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 5.16 (incluyendo) 6.1.84 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.2 (incluyendo) 6.6.24 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.7 (incluyendo) 6.7.12 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.8 (incluyendo) 6.8.3 (excluyendo)
cpe:2.3:o:debian:debian_linux:10.0:*:*:*:*:*:*:*


Referencias a soluciones, herramientas e información