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

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

Gravedad CVSS v3.1:
MEDIA
Tipo:
CWE-476 Desreferencia a puntero nulo (NULL)
Fecha de publicación:
18/06/2025
Última modificación:
20/11/2025

Descripción

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: soundwire: revisitar la vinculación/desvinculación del controlador y las devoluciones de llamada. En la sonda SoundWire, almacenamos un puntero desde las operaciones del controlador en la estructura "slave". Esto puede provocar errores en el kernel al desvincular los controladores de códec, por ejemplo, con la siguiente secuencia para eliminar el controlador de la máquina y el controlador de códec: /sbin/modprobe -r snd_soc_sof_sdw /sbin/modprobe -r snd_soc_rt711. Los detalles completos se pueden encontrar en el enlace de error a continuación. Como referencia, los dos ejemplos siguientes muestran diferentes casos de operaciones/devoluciones de llamada del controlador que se invocan después de la instrucción `.remove()` del controlador. kernel: ERROR: desreferencia de puntero NULL del kernel, dirección: 0000000000000150 kernel: Cola de trabajo: eventos cdns_update_slave_status_work [cadencia_soundwire] kernel: RIP: 0010:mutex_lock+0x19/0x30 kernel: Rastreo de llamadas: kernel: ? sdw_handle_slave_status+0x426/0xe00 [bus_soundwire 94ff184bf398570c3f8ff7efe9e32529f532e4ae] kernel: ? newidle_balance+0x26a/0x400 kernel: ? cdns_update_slave_status_work+0x1e9/0x200 [soundwire_cadence 1bcf98eebe5ba9833cd433323769ac923c9c6f82] kernel: ERROR: no se puede manejar el error de página para la dirección: ffffffffc07654c8 kernel: Cola de trabajo: pm pm_runtime_work kernel: RIP: 0010:sdw_bus_prep_clk_stop+0x6f/0x160 [soundwire_bus] kernel: Rastreo de llamadas: kernel: kernel: sdw_cdns_clock_stop+0xb5/0x1b0 [soundwire_cadence 1bcf98eebe5ba9833cd433323769ac923c9c6f82] kernel: intel_suspend_runtime+0x5f/0x120 [soundwire_intel aca858f7c87048d3152a4a41bb68abb9b663a1dd] kernel: ? dpm_sysfs_remove+0x60/0x60 Esto no se detectó previamente en las pruebas de Intel, ya que estas primero eliminan el dispositivo PCI principal y apagan el bus. La secuencia anterior es un caso excepcional que mantiene el bus operativo, pero sin un controlador vinculado. Al intentar resolver este error del kernel, se hizo evidente que el bus SoundWire existente no gestiona bien el caso de desvinculación. el commit 528be501b7d4a ("soundwire: sdw_slave: añadir estructura probe_complete y nuevos campos") añadió una variable de estado "probed" y una finalización de estructura "probe_complete". Sin embargo, este estado no se restablece al eliminar el dispositivo y, del mismo modo, la prueba "probe complete" no se reinicializa, por lo que las pruebas de vinculación/desvinculación/vinculación fallarían. El tiempo de espera utilizado antes de la devolución de llamada "update_status" también fue una mala idea en retrospectiva; no debería haber suposiciones sobre el tiempo que determina si un controlador está vinculado a un dispositivo y cuándo. Un borrador inicial se basó en device_lock() y se probó device_unlock(). Esto resultó ser demasiado complicado, con interbloqueos creados durante las secuencias de suspensión-reinicio, que también utilizan el mismo device_lock/unlock() que las secuencias de vinculación/desvinculación. En un dispositivo CometLake, un DSDT/BIOS defectuoso provocó reanudaciones falsas y el uso de device_lock() provocó bloqueos durante la suspensión. Tras varias semanas de pruebas y una ardua ingeniería inversa de interbloqueos en diferentes dispositivos, buscamos alternativas que no interfirieran con el núcleo del dispositivo. Se utilizó con éxito un notificador de bus para realizar un seguimiento de los eventos DRIVER_BOUND y DRIVER_UNBIND. Esto solucionó el problema de enlazar-desenlazar-enlazar en las pruebas, pero aún se puede solucionar con un caso límite teórico donde la memoria se libera mediante un `.remove` mientras se usa la devolución de llamada. El notificador solo ayuda a garantizar que las devoluciones de llamada del controlador sean válidas, pero no que la memoria asignada en la sonda siga siendo válida mientras se invocan las devoluciones de llamada. Este parche sugiere la introducción de un nuevo ---truncado---

Productos y versiones vulnerables

CPE Desde Hasta
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 4.16 (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)