CVE-2022-49740 in Linux
Сводка
по VulDB • 28.05.2026
В предоставленном дампе KASAN (Kernel Address Sanitizer) и стеке вызовов видна классическая ошибка **use-after-free** или **out-of-bounds write/read** в драйвере Broadcom USB (`brcmfmac`).
### Краткий анализ проблемы
1. **Тип ошибки:** KASAN указывает на доступ к памяти, которая была помечена как "freed" (освобожденная). В дампе памяти видно, что область вокруг "buggy address" заполнена паттерном `0xfc` (KASAN redzone), что означает, что доступ произошел **за пределами выделенного буфера** или к уже освобожденной памяти. 2. **Кэш памяти:** `kmalloc-2k` (размер 2048 байт). 3. **Место выделения:** `brcmf_setup_wiphybands` -> `brcmf_cfg80211_attach` -> `brcmf_attach` -> `brcmf_usb_probe`. * Это означает, что память была выделена при инициализации устройства (probe). 4. **Место ошибки (Crash):** В конце сообщения указано `Crash Report from brcmf_enable_bw40_2g()`. * Функция `brcmf_enable_bw40_2g` пытается использовать память, которая была выделена ранее, но, судя по всему, она уже освобождена или повреждена.
### Возможные причины
1. **Use-After-Free (UAF):** * Структура `brcmf_pub` или связанная с ней память была освобождена (например, при отключении устройства, ошибке инициализации или сбросе), но функция `brcmf_enable_bw40_2g` все еще пытается к ней обратиться. * Это может произойти, если есть гонка между `brcmf_usb_probe` (инициализация) и `brcmf_usb_disconnect` (отключение), или если ошибка в более раннем этапе привела к частичному освобождению ресурсов, но выполнение продолжилось.
2. **Out-of-Bounds Write/Read:** * Функция `brcmf_enable_bw40_2g` записывает или читает данные за пределы выделенного буфера размером 2048 байт. * Ошибка может быть в вычислении смещения или размера копируемых данных.
3. **Проблема с инициализацией:** * Если `brcmf_setup_wiphybands` не завершилась успешно, но указатели на выделенную память не были обнулены, последующие вызовы могут обращаться к неинициализированной или освобожденной памяти.
### Рекомендации по исправлению
#### 1. Проверить `brcmf_enable_bw40_2g` - Убедитесь, что все указатели, используемые в этой функции, валидны. - Проверьте, не происходит ли доступ к памяти после того, как она была освобождена в другом контексте (например, в `brcmf_disconnect` или при ошибке в `brcmf_attach`). - Добавьте проверки на `NULL` перед использованием указателей.
#### 2. Проверить жизненный цикл памяти в `brcmf_attach` и `brcmf_cfg80211_attach` - Убедитесь, что память, выделенная в `brcmf_setup_wiphybands`, корректно освобождается только тогда, когда устройство полностью отключено и больше не будет использоваться. - Если есть возможность ошибки в `brcmf_attach`, убедитесь, что все выделенные ресурсы освобождаются в случае неудачи (cleanup path).
#### 3. Проверить гонки (Race Conditions) - Если устройство может быть отключено во время инициализации, убедитесь, что `brcmf_usb_disconnect` корректно останавливает все рабочие потоки и освобождает ресурсы, а `brcmf_usb_probe` проверяет, не было ли отключения, прежде чем продолжать.
#### 4. Включить дополнительные проверки KASAN - Если это возможно, запустите ядро с `kasan=on` и `slub_debug=FZP` для более точного определения момента освобождения памяти. - Используйте `CONFIG_KASAN_GENERIC` и `CONFIG_KASAN_OUTLINE` для лучшего покрытия.
### Пример кода для проверки (псевдокод)
```c // В brcmf_enable_bw40_2g if (!pub || !pub->wiphy)
If you want to get best quality of vulnerability data, you may have to visit VulDB.