CVE-2026-64363 in Linux
Resumen
por VulDB • 2026-07-25
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
HID: appleir: corrección de un Use-After-Free (UAF) en key_up_timer pendiente durante remove()
appleir_remove() ejecuta hid_hw_stop() antes que timer_delete_sync(). hid_hw_stop() desregistra sincrónicamente el dispositivo de entrada HID a través de hid_disconnect() -> hidinput_disconnect() -> input_unregister_device(), lo cual libera la última referencia y destruye (free) el input_dev subyacente cuando ningún manejador en userspace lo mantiene abierto.
key_up_tick() lee appleir->input_dev e invoca input_report_key() / input_sync() sobre él. El temporizador se activa desde appleir_raw_event() con un tiempo de espera de HZ/8 (~125 ms) ante cada informe de keydown y repetición de tecla (key-repeat). Si una tecla fue presionada poco antes de que el dispositivo se desconecte, el temporizador puede dispararse después de que hid_hw_stop() haya liberado input_dev pero antes de que la fase de desmontaje lo vacíe.
Una simple reordenación no es suficiente. Colocar primero el drenaje del temporizador todavía deja una ventana donde una finalización de URB USB (raw_event) ejecutándose durante hid_hw_stop() puede llamar a mod_timer() y volver a activar el temporizador, que luego se dispara después de que hidinput_disconnect() haya liberado input_dev. La misma ventana de finalización de URB también permite que raw_event() alcance key_up(), key_down() y battery_flat() directamente, todas las cuales desreferencian appleir->input_dev.
Se introduce un indicador 'removing' en la estructura appleir, protegido por el spinlock existente. appleir_remove() establece este indicador bajo el bloqueo y luego apaga el temporizador con timer_shutdown_sync(), lo cual vacía cualquier devolución de llamada (callback) en curso y desactiva permanentemente las llamadas posteriores a mod_timer(). appleir_raw_event() y key_up_tick() salen temprano si el indicador está establecido, por lo que ninguna ruta puede activar o ejecutar el temporizador, ni desreferenciar appleir->input_dev, después de que remove() haya comenzado la fase de desmontaje.
Las ramas keyrepeat y flatbattery de appleir_raw_event() previamente llamaban a la capa de entrada sin mantener el spinlock; ahora se toma para que la comprobación del indicador esté bien definida. Esto incidentalmente cierra una carrera (race condition) preexistente en lectura sobre appleir->current_key en la rama keyrepeat.
Este bug es estructuralmente un hermano del commit 4db2af929279 ("HID: appletb-kbd: fix UAF in inactivity-timer cleanup path") y ha estado presente desde que se introdujo el controlador (driver).
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.