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

Vulnerabilidad en kernel de Linux (CVE-2022-50220)

Gravedad CVSS v3.1:
ALTA
Tipo:
CWE-416 Utilización después de liberación
Fecha de publicación:
18/06/2025
Última modificación:
19/11/2025

Descripción

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: usbnet: Se corrige el Use-After-Free de linkwatch al desconectar. usbnet usa la función usbnet_deferred_kevent() para ejecutar tareas que podrían estar en estado de suspensión. Al desconectar, la finalización de la tarea se esperaba originalmente en ->ndo_stop(). Sin embargo, en 2003, esto se trasladó a ->disconnect() mediante el commit histórica "[PATCH] USB: usbnet, previene el bloqueo rtnl exótico": https://git.kernel.org/tglx/history/c/0f138bbfd83c. Este cambio se realizó porque, en aquel entonces, la implementación de la cola de trabajo del kernel no permitía esperar una sola tarea. Se debía esperar la finalización de *todas* las tareas llamando a flush_scheduled_work(), lo que podía provocar un bloqueo al esperar usbnet_deferred_kevent() con rtnl_mutex en ->ndo_stop(). El commit resolvió un problema pero creó otro: Provoca un uso después de la liberación en los controladores Ethernet USB aqc111.c, asix_devices.c, ax88179_178a.c, ch9200.c y smsc75xx.c: * Si los controladores reciben una interrupción de cambio de enlace inmediatamente antes de la desconexión, generan EVENT_LINK_RESET en su devolución de llamada ->status() (no inactiva) y programan usbnet_deferred_kevent(). * usbnet_deferred_kevent() invoca la devolución de llamada ->link_reset() del controlador, que llama a netif_carrier_{on,off}(). * Eso a su vez programa el trabajo linkwatch_event(). Dado que usbnet_deferred_kevent() se espera después de unregister_netdev(), netif_carrier_{on,off}() puede operar en un netdev no registrado y linkwatch_event() puede ejecutarse después de free_netdev(), lo que provoca un error de uso después de la liberación. En 2010, se modificó la configuración de usbnet para que solo esperara una instancia de usbnet_deferred_kevent() en lugar de *todo* el trabajo mediante el commit 23f333a2bfaf ("drivers/net: no usar flush_scheduled_work()"). Lamentablemente, el commit no retrasó la espera a ->ndo_stop(). Se corrigió esta omisión de una vez.

Productos y versiones vulnerables

CPE Desde Hasta
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 2.6.38 (incluyendo) 4.9.326 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 4.10 (incluyendo) 4.14.291 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 4.15 (incluyendo) 4.19.256 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 4.20 (incluyendo) 5.4.211 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 5.5 (incluyendo) 5.10.137 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 5.11 (incluyendo) 5.15.61 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 5.16 (incluyendo) 5.18.18 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 5.19 (incluyendo) 5.19.2 (excluyendo)