В ядре Linux устранена следующая уязвимость:
wifi: libertas_tf: исправлено использование после освобождения в lbtf_free_adapter()
lbtf_free_adapter() вызывает timer_delete(&priv->command_timer), что
не ждать запуска обратного вызова Command_timer_fn(). lbtf_free_adapter()
выполняется по пути удаления прямо перед тем, как ieee80211_free_hw() освобождает priv,
как в lbtf_remove_card(), так и в пути ошибки проверки. командный_таймер
активируется с помощью mod_timer() в lbtf_cmd() всякий раз, когда отправляется команда прошивки.
Command_timer_fn() разыменовывает priv. Если время выполнения команды истекло
устройство удалено, команда Command_timer_fn() выполняется одновременно с демонтажем и
разыменовывает priv после его освобождения. Это то же самое использование после освобождения, что и коммит 03cc8f90d053 ("wifi: libertas:
исправлено использование после освобождения в lbs_free_adapter()"), исправлено в родственной версии libertas
водитель.
Вариант libertas_tf имеет тот же шаблон и был оставлен
без изменений. Используйте timer_delete_sync(), чтобы любой обратный вызов в полете завершился.
прежде чем priv будет освобожден.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: wifi: libertas_tf: fix use-after-free in lbtf_free_adapter() lbtf_free_adapter() calls timer_delete(&priv->command_timer), which does not wait for a running command_timer_fn() callback. lbtf_free_adapter() runs on the teardown path right before ieee80211_free_hw() frees priv, both in lbtf_remove_card() and in the probe error path. command_timer is armed by mod_timer() in lbtf_cmd() whenever a firmware command is sent. command_timer_fn() dereferences priv. If a command times out as the device is removed, command_timer_fn() runs concurrently with teardown and dereferences priv after it has been freed. This is the same use-after-free that commit 03cc8f90d053 ("wifi: libertas: fix use-after-free in lbs_free_adapter()") fixed in the sibling libertas driver. The libertas_tf variant has the identical pattern and was left unchanged. Use timer_delete_sync() so any in-flight callback completes before priv is freed.